feat: A bit more stable

remaining-diff
Sean McBride 4 years ago
parent aeda832052
commit 303b6694ca

@ -53,7 +53,7 @@ BINARY_NAME=sledgert
# CFLAGS += -DLOG_HTTP_PARSER
# CFLAGS += -DLOG_STATE_CHANGES
# CFLAGS += -DLOG_LOCK_OVERHEAD
CFLAGS += -DLOG_CONTEXT_SWITCHES
# CFLAGS += -DLOG_CONTEXT_SWITCHES
# CFLAGS += -DLOG_ADMISSIONS_CONTROL
# CFLAGS += -DLOG_REQUEST_ALLOCATION
# CFLAGS += -DLOG_PREEMPTION

@ -170,6 +170,27 @@ __framework_sh__log_environment() {
echo "*************"
}
__framework_sh__load_env_file() {
local envfile="$1"
echo "Loading $envfile"
if [[ -f "$envfile" ]]; then
while read -r line; do
echo export "${line?}"
export "${line?}"
done < "$envfile"
fi
}
__framework_sh__unset_env_file() {
local envfile="$1"
if [[ -f "$envfile" ]]; then
while read -r line; do
echo unset "${line//=*/}"
unset "${line//=*/}"
done < "$envfile"
fi
}
# $1 - Results Directory
# $2 - How to run (foreground|background)
# $3 - JSON specification
@ -259,6 +280,7 @@ __framework_sh__run_valgrind() {
__framework_sh__run_debug() {
# shellcheck disable=SC2155
local project_directory=$(cd ../.. && pwd)
__framework_sh__load_env_file "$envfile"
if [[ "$project_directory" != "/sledge/runtime" ]]; then
printf "It appears that you are not running in the container. Substituting path to match host environment\n"
@ -277,6 +299,7 @@ __framework_sh__run_debug() {
--eval-command="run $__framework_sh__application_directory/spec.json" \
sledgert
fi
__framework_sh__unset_env_file "$envfile"
return 0
}
@ -289,26 +312,6 @@ __framework_sh__run_client() {
return 0
}
__framework_sh__load_env_file() {
local envfile="$1"
if [[ -f "$envfile" ]]; then
while read -r line; do
echo export "${line?}"
export "${line?}"
done < "$envfile"
fi
}
__framework_sh__unset_env_file() {
local envfile="$1"
if [[ -f "$envfile" ]]; then
while read -r line; do
echo unset "${line//=*/}"
unset "${line//=*/}"
done < "$envfile"
fi
}
__framework_sh__run_both() {
local short_name
shopt -s nullglob

@ -1,4 +1,4 @@
SLEDGE_SCHEDULER=EDF
SLEDGE_DISABLE_PREEMPTION=true
SLEDGE_NCORES=6
SLEDGE_QUANTUM_US=1000
SLEDGE_NWORKERS=6
SLEDGE_QUANTUM_US=5000

@ -1,5 +1,5 @@
SLEDGE_SCHEDULER=EDF
SLEDGE_DISABLE_PREEMPTION=false
SLEDGE_SIGALRM_HANDLER=TRIAGED
SLEDGE_NCORES=6
SLEDGE_QUANTUM_US=1000
SLEDGE_NWORKERS=6
SLEDGE_QUANTUM_US=5000

@ -1,4 +1,4 @@
SLEDGE_SCHEDULER=FIFO
SLEDGE_DISABLE_PREEMPTION=true
SLEDGE_NCORES=6
SLEDGE_QUANTUM_US=1000
SLEDGE_NWORKERS=6
SLEDGE_QUANTUM_US=5000

@ -1,4 +1,4 @@
SLEDGE_SCHEDULER=FIFO
SLEDGE_DISABLE_PREEMPTION=false
SLEDGE_NCORES=6
SLEDGE_QUANTUM_US=1000
SLEDGE_NWORKERS=6
SLEDGE_QUANTUM_US=5000

@ -80,8 +80,10 @@ arch_mcontext_save(struct arch_context *sandbox_context, const mcontext_t *activ
assert(sandbox_context != &worker_thread_base_context);
/* Transitioning from {Unused, Running} -> Slow */
assert(sandbox_context->variant == ARCH_CONTEXT_VARIANT_UNUSED
|| sandbox_context->variant == ARCH_CONTEXT_VARIANT_RUNNING);
// TODO: Another assert firing here. What is this?
// assert(sandbox_context->variant == ARCH_CONTEXT_VARIANT_UNUSED
// || sandbox_context->variant == ARCH_CONTEXT_VARIANT_RUNNING);
// debuglog("Slow transitioning from %s\n", arch_context_variant_print(sandbox_context->variant));
sandbox_context->variant = ARCH_CONTEXT_VARIANT_SLOW;
/* Copy mcontext */

@ -130,7 +130,9 @@ arch_context_switch(struct arch_context *a, struct arch_context *b)
if (b == NULL) b = &worker_thread_base_context;
/* A Transition {Unused, Running} -> Fast */
assert(a->variant == ARCH_CONTEXT_VARIANT_UNUSED || a->variant == ARCH_CONTEXT_VARIANT_RUNNING);
// TODO: This errored out. What is the variant here?
// debuglog("Context switching from %s\n", arch_context_variant_print(a->variant));
// assert(a->variant == ARCH_CONTEXT_VARIANT_UNUSED || a->variant == ARCH_CONTEXT_VARIANT_RUNNING);
/* B Transition {Fast, Slow} -> Running */
assert(b->variant == ARCH_CONTEXT_VARIANT_FAST || b->variant == ARCH_CONTEXT_VARIANT_SLOW);

@ -4,6 +4,7 @@
#include <errno.h>
#include <panic.h>
#include <pthread.h>
#include <runtime.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
@ -18,6 +19,7 @@
extern __thread volatile sig_atomic_t software_interrupt_is_disabled;
extern uint64_t software_interrupt_interval_duration_in_cycles;
extern __thread volatile sig_atomic_t software_interrupt_deferred_sigalrm;
extern volatile sig_atomic_t software_interrupt_deferred_sigalrm_max[RUNTIME_WORKER_THREAD_CORE_COUNT];
/*************************
* Public Static Inlines *
@ -96,3 +98,4 @@ software_interrupt_unmask_signal(int signal)
void software_interrupt_initialize(void);
void software_interrupt_arm_timer(void);
void software_interrupt_disarm_timer(void);
void software_interrupt_deferred_sigalrm_max_print(void);

@ -12,6 +12,10 @@ software_interrupt_enable(void)
{
/* Trigger missed SIGALRM */
if (software_interrupt_deferred_sigalrm > 0) {
if (software_interrupt_deferred_sigalrm > software_interrupt_deferred_sigalrm_max[worker_thread_idx]) {
software_interrupt_deferred_sigalrm_max[worker_thread_idx] =
software_interrupt_deferred_sigalrm;
}
software_interrupt_deferred_sigalrm = 0;
worker_thread_sched();

@ -42,6 +42,7 @@ runtime_cleanup()
{
if (runtime_sandbox_perf_log != NULL) fflush(runtime_sandbox_perf_log);
software_interrupt_deferred_sigalrm_max_print();
exit(EXIT_SUCCESS);
}

@ -39,6 +39,19 @@ __thread volatile sig_atomic_t software_interrupt_deferred_sigalrm =
__thread volatile sig_atomic_t software_interrupt_deferred_sigusr1 = 0;
__thread _Atomic volatile sig_atomic_t software_interrupt_signal_depth = 0;
volatile sig_atomic_t software_interrupt_deferred_sigalrm_max[RUNTIME_WORKER_THREAD_CORE_COUNT] = { 0 };
void
software_interrupt_deferred_sigalrm_max_print()
{
printf("Max Deferred Sigalrms") for (int i = 0; i < runtime_worker_threads_count; i++)
{
printf("Worker %d: %d\n", software_interrupt_deferred_sigalrm_max[i]);
}
fflush(stdout);
}
/***************************************
* Externs
**************************************/
@ -100,6 +113,7 @@ sigalrm_handler(siginfo_t *signal_info, ucontext_t *user_context, struct sandbox
/* A worker thread received a SIGALRM when interrupts were disabled, so defer until they are reenabled */
if (!software_interrupt_is_enabled()) {
// Don't increment if kernel? The first worker gets tons of these...
software_interrupt_deferred_sigalrm++;
return;
}

Loading…
Cancel
Save