Merge pull request #168 from gwsystems/128-deadline-fpe

feat: more explicit config logging and validation
main
Sean McBride 4 years ago committed by GitHub
commit 33504f2c67
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -60,10 +60,12 @@ An SLEdge serverless function consists of a shared library (\*.so) and a JSON co
```json
{
"active": "yes",
"active": true,
"name": "fibonacci",
"path": "fibonacci_wasm.so",
"port": 10000,
"expected-execution-us": 600,
"relative-deadline-us": 2000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",

@ -1,4 +1,10 @@
ARCH := $(shell uname -m)
ifneq ($(ARCH),x86_64)
ifneq ($(ARCH),aarch64)
$(error Unsupported Architecture. Supports x86_64 and aarch64, found $(ARCH))
endif
endif
TOTAL_CORES := $(shell getconf _NPROCESSORS_CONF)
PAGE_SIZE=$(shell getconf PAGESIZE)
@ -11,16 +17,14 @@ CC_OPTIONS = -O3 -flto -g -pthread -D_GNU_SOURCE
BINARY_NAME=sledgert
# Options: {USE_MEM_GENERIC, USE_MEM_VM}
USE_MEM = USE_MEM_VM
# Feature Toggles
# CFLAGS += -DADMISSIONS_CONTROL
CFLAGS += -DADMISSIONS_CONTROL
# Debugging Flags
# Strips out calls to assert() and disables debuglog
# CFLAGS += -DNDEBUG
CFLAGS += -DNDEBUG
# Redirects debuglogs to /runtime/bin/sledge.log
# CFLAGS += -DLOG_TO_FILE
@ -60,7 +64,8 @@ CFLAGS += -DPAGE_SIZE=$(PAGE_SIZE)
# Optionally Disable preemption
# CFLAGS += -DPREEMPT_DISABLE
CFLAGS += -D${USE_MEM}
# Sandboxes running on Sledge always use WebAssembly linear memory
CFLAGS += -DUSE_MEM_VM
# Preprocessor
LDFLAGS += -Wl,--export-dynamic -ldl -lm
@ -72,14 +77,8 @@ CFILES += src/*.c
CFILES += src/arch/${ARCH}/*.c
CFILES += src/libc/*.c
CFILES += src/memory/common.c
CFILES += thirdparty/dist/lib/http_parser.o
# TODO: Is USE_MEM_GENERIC out of date? I do not see that file.
# Does that mean we can make USE_MEM_VM an invariant?
ifeq ($(USE_MEM),USE_MEM_GENERIC)
CFILES += src/memory/generic.c
else ifeq ($(USE_MEM),USE_MEM_VM)
CFILES += src/memory/64bit_nix.c
endif
CFILES += thirdparty/dist/lib/http_parser.o
# Configuring Jasmine
JSMNCFLAGS += -DJSMN_STATIC

@ -1,8 +1,9 @@
{
"active": "yes",
"active": true,
"name": "ekf_first_iter",
"path": "ekf_wasm.so",
"port": 10000,
"expected-execution-us": 5000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
@ -13,10 +14,11 @@
"http-resp-content-type": "application/octet-stream"
},
{
"active": "yes",
"active": true,
"name": "ekf_second_iter",
"path": "ekf_wasm.so",
"port": 10001,
"expected-execution-us": 5000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
@ -27,10 +29,11 @@
"http-resp-content-type": "application/octet-stream"
},
{
"active": "yes",
"active": true,
"name": "ekf_third_iter",
"path": "ekf_wasm.so",
"port": 10002,
"expected-execution-us": 5000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],

@ -1,8 +1,9 @@
{
"active": "yes",
"active": true,
"name": "resize",
"path": "ekf_wasm.so",
"port": 10000,
"expected-execution-us": 5000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],

@ -1,14 +1,15 @@
{
"active": "yes",
"name": "cifar10",
"path": "cifar10_wasm.so",
"active": true,
"name": "cifar10",
"path": "cifar10_wasm.so",
"port": 10000,
"expected-execution-us": 5000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/png",
"http-req-content-type": "image/png",
"http-req-size": 4096,
"http-resp-headers": [],
"http-resp-size": 128,
"http-resp-content-type": "text/plain"
"http-resp-size": 128,
"http-resp-content-type": "text/plain"
}

@ -51,7 +51,7 @@ for ((i = 0; i < total_count; i++)); do
done
echo "$success_count / $total_count"
rm result_*.png
rm -f result_*.png
if [ "$1" != "-d" ]; then
sleep 5

@ -1,8 +1,9 @@
{
"active": "yes",
"active": true,
"name": "resize_small",
"path": "resize_wasm.so",
"port": 10000,
"expected-execution-us": 5000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
@ -11,12 +12,13 @@
"http-resp-headers": [],
"http-resp-size": 1024000,
"http-resp-content-type": "image/png"
}
},
{
"active": "yes",
"active": true,
"name": "resize_medium",
"path": "resize_wasm.so",
"port": 10001,
"expected-execution-us": 5000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
@ -25,12 +27,13 @@
"http-resp-headers": [],
"http-resp-size": 1024000,
"http-resp-content-type": "image/png"
}
},
{
"active": "yes",
"active": true,
"name": "resize_large",
"path": "resize_wasm.so",
"port": 10002,
"expected-execution-us": 5000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],

@ -1,8 +1,9 @@
{
"active": "yes",
"active": true,
"name": "resize",
"path": "resize_wasm.so",
"port": 10000,
"expected-execution-us": 5000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],

@ -5,7 +5,7 @@
# Also disables pagination and stopping on SIGUSR1
experiment_directory=$(pwd)
project_directory=$(cd ../../.. && pwd)
project_directory=$(cd ../../../.. && pwd)
binary_directory=$(cd "$project_directory"/bin && pwd)
export LD_LIBRARY_PATH="$binary_directory:$LD_LIBRARY_PATH"

@ -1,8 +1,9 @@
{
"active": "yes",
"active": true,
"name": "lpd1",
"path": "lpd_wasm.so",
"port": 10000,
"expected-execution-us": 5000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
@ -13,10 +14,11 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "lpd2",
"path": "lpd_wasm.so",
"port": 10001,
"expected-execution-us": 5000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
@ -27,10 +29,11 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "lpd4",
"path": "lpd_wasm.so",
"port": 10002,
"expected-execution-us": 5000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],

@ -1,9 +1,10 @@
{
"active": "yes",
"active": true,
"name": "gocr_72_dpi",
"path": "gocr_wasm.so",
"port": 10000,
"relative-deadline-us": 50000000000,
"expected-execution-us": 5000,
"relative-deadline-us": 36000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
@ -13,11 +14,12 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "gocr_108_dpi",
"path": "gocr_wasm.so",
"port": 10001,
"relative-deadline-us": 50000000000,
"expected-execution-us": 5000,
"relative-deadline-us": 36000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
@ -27,11 +29,12 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "gocr_144_dpi",
"path": "gocr_wasm.so",
"port": 10002,
"relative-deadline-us": 50000000000,
"expected-execution-us": 5000,
"relative-deadline-us": 36000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",

@ -1,9 +1,10 @@
{
"active": "yes",
"active": true,
"name": "gocr_mono",
"path": "gocr_wasm.so",
"port": 10000,
"relative-deadline-us": 50000000000,
"expected-execution-us": 5000,
"relative-deadline-us": 36000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
@ -13,11 +14,12 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "gocr_urw_gothic",
"path": "gocr_wasm.so",
"port": 10001,
"relative-deadline-us": 50000000000,
"expected-execution-us": 5000,
"relative-deadline-us": 36000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
@ -27,11 +29,12 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "gocr_lobster_2",
"path": "gocr_wasm.so",
"port": 10002,
"relative-deadline-us": 50000000000,
"expected-execution-us": 5000,
"relative-deadline-us": 36000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",

@ -1,9 +1,10 @@
{
"active": "yes",
"active": true,
"name": "gocr_1_word",
"path": "gocr_wasm.so",
"port": 10000,
"relative-deadline-us": 50000000000,
"expected-execution-us": 5000,
"relative-deadline-us": 36000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
@ -13,11 +14,12 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "gocr_10_words",
"path": "gocr_wasm.so",
"port": 10001,
"relative-deadline-us": 50000000000,
"expected-execution-us": 5000,
"relative-deadline-us": 36000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
@ -27,11 +29,12 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "gocr_100_words",
"path": "gocr_wasm.so",
"port": 10002,
"relative-deadline-us": 50000000000,
"expected-execution-us": 5000,
"relative-deadline-us": 36000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",

@ -1,10 +1,10 @@
{
"active": "yes",
"active": true,
"name": "gocr",
"path": "gocr_wasm.so",
"port": 10000,
"relative-deadline-us": 500000000,
"expected-execution-us": 5000000,
"expected-execution-us": 5000,
"relative-deadline-us": 36000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",

@ -1,9 +1,10 @@
{
"active": "yes",
"active": true,
"name": "gocr",
"path": "gocr_wasm.so",
"port": 10000,
"relative-deadline-us": 50000000000,
"expected-execution-us": 5000,
"relative-deadline-us": 36000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",

@ -1,9 +1,10 @@
{
"active": "yes",
"active": true,
"name": "gocr",
"path": "gocr_wasm.so",
"port": 10000,
"relative-deadline-us": 50000000000,
"expected-execution-us": 5000,
"relative-deadline-us": 360000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",

@ -1,5 +1,5 @@
{
"active": "yes",
"active": true,
"name": "gocr",
"path": "gocr.aso",
"port": 10000,
@ -13,7 +13,7 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "gocr",
"path": "gocr.aso",
"port": 10001,
@ -27,7 +27,7 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "gocr",
"path": "gocr.aso",
"port": 10002,
@ -40,4 +40,3 @@
"http-resp-size": 5335057,
"http-resp-content-type": "text/plain"
}

@ -1,5 +1,5 @@
{
"active": "yes",
"active": true,
"name": "hello_ps",
"path": "hello_ps_wasm.so",
"port": 10000,

@ -1,14 +1,14 @@
{
"active": "yes",
"name": "empty",
"path": "empty_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1024,
"http-resp-headers": [],
"http-resp-size": 1024,
"http-resp-content-type": "text/plain"
}
"active": true,
"name": "empty",
"path": "empty_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1024,
"http-resp-headers": [],
"http-resp-size": 1024,
"http-resp-content-type": "text/plain"
}

@ -1,5 +1,5 @@
{
"active": "yes",
"active": true,
"name": "fibonacci_10",
"path": "fibonacci_wasm.so",
"port": 10010,
@ -15,7 +15,7 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "fibonacci_40",
"path": "fibonacci_wasm.so",
"port": 10040,

@ -1,60 +1,60 @@
{
"active": "yes",
"name": "work1k",
"path": "work1k_wasm.so",
"port": 10000,
"expected-execution-us": 400,
"relative-deadline-us": 2000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1548,
"http-resp-headers": [],
"http-resp-size": 1548,
"http-resp-content-type": "text/plain"
"active": true,
"name": "work1k",
"path": "work1k_wasm.so",
"port": 10000,
"expected-execution-us": 400,
"relative-deadline-us": 2000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1548,
"http-resp-headers": [],
"http-resp-size": 1548,
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"name": "work10k",
"path": "work10k_wasm.so",
"port": 10001,
"expected-execution-us": 600,
"relative-deadline-us": 2000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 10480,
"http-resp-headers": [],
"http-resp-size": 10480,
"http-resp-content-type": "text/plain"
"active": true,
"name": "work10k",
"path": "work10k_wasm.so",
"port": 10001,
"expected-execution-us": 600,
"relative-deadline-us": 2000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 10480,
"http-resp-headers": [],
"http-resp-size": 10480,
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"name": "work100k",
"path": "work100k_wasm.so",
"port": 10002,
"expected-execution-us": 700,
"relative-deadline-us": 2000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 104800,
"http-resp-headers": [],
"http-resp-size": 104800,
"http-resp-content-type": "text/plain"
"active": true,
"name": "work100k",
"path": "work100k_wasm.so",
"port": 10002,
"expected-execution-us": 700,
"relative-deadline-us": 2000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 104800,
"http-resp-headers": [],
"http-resp-size": 104800,
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"name": "work1m",
"path": "work1m_wasm.so",
"port": 10003,
"expected-execution-us": 2000,
"relative-deadline-us": 6000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1048776,
"http-resp-headers": [],
"http-resp-size": 1048776,
"http-resp-content-type": "text/plain"
"active": true,
"name": "work1m",
"path": "work1m_wasm.so",
"port": 10003,
"expected-execution-us": 2000,
"relative-deadline-us": 6000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1048776,
"http-resp-headers": [],
"http-resp-size": 1048776,
"http-resp-content-type": "text/plain"
}

@ -1,5 +1,5 @@
{
"active": "yes",
"active": true,
"name": "fibonacci_10",
"path": "fibonacci_wasm.so",
"port": 10010,
@ -14,7 +14,7 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "fibonacci_40",
"path": "fibonacci_wasm.so",
"port": 10040,

@ -73,7 +73,7 @@ admissions_control_calculate_estimate(uint64_t estimated_execution, uint64_t rel
uint64_t admissions_estimate = (estimated_execution * (uint64_t)ADMISSIONS_CONTROL_GRANULARITY)
/ relative_deadline;
if (admissions_estimate == 0)
panic("Ration of Deadline to Execution time cannot exceed %d\n", ADMISSIONS_CONTROL_GRANULARITY);
panic("Ratio of Deadline to Execution time cannot exceed %d\n", ADMISSIONS_CONTROL_GRANULARITY);
return admissions_estimate;
#else

@ -20,7 +20,8 @@ admissions_info_initialize(struct admissions_info *self, int percentile, uint64_
uint64_t relative_deadline)
{
#ifdef ADMISSIONS_CONTROL
assert(relative_deadline > 0);
assert(expected_execution > 0);
self->relative_deadline = relative_deadline;
self->estimate = admissions_control_calculate_estimate(expected_execution, relative_deadline);
debuglog("Initial Estimate: %lu\n", self->estimate);

@ -8,13 +8,26 @@
#include "likely.h"
#include "types.h"
#define LISTENER_THREAD_CORE_ID 0 /* Dedicated Listener Core */
/* Dedicated Listener Core */
#define LISTENER_THREAD_CORE_ID 0
#define LISTENER_THREAD_MAX_EPOLL_EVENTS 128
#define RUNTIME_LOG_FILE "sledge.log"
#define RUNTIME_MAX_SANDBOX_REQUEST_COUNT (1 << 19) /* random! */
#define RUNTIME_LOG_FILE "sledge.log"
/* random! */
#define RUNTIME_MAX_SANDBOX_REQUEST_COUNT (1 << 19)
#define RUNTIME_READ_WRITE_VECTOR_LENGTH 16
/* One Hour. Fits in a uint32_t or an int64_t */
#define RUNTIME_RELATIVE_DEADLINE_US_MAX 3600000000
/* One Hour. Fits in a uint32_t or an int64_t */
#define RUNTIME_EXPECTED_EXECUTION_US_MAX 3600000000
/* 100 MB */
#define RUNTIME_HTTP_REQUEST_SIZE_MAX 100000000
/* 100 MB */
#define RUNTIME_HTTP_RESPONSE_SIZE_MAX 100000000
/*
* Descriptor of the epoll instance used to monitor the socket descriptors of registered
* serverless modules. The listener cores listens for incoming client requests through this.
@ -29,7 +42,6 @@ extern FILE *runtime_sandbox_perf_log;
* See runtime_get_processor_speed_MHz for further details
*/
extern uint32_t runtime_processor_speed_MHz;
extern uint64_t runtime_relative_deadline_us_max;
/* Count of worker threads and array of their pthread identifiers */
extern pthread_t runtime_worker_threads[];

@ -9,6 +9,12 @@
#include <sys/time.h>
#include <unistd.h>
#ifdef LOG_TO_FILE
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#endif
#include "debuglog.h"
#include "module.h"
#include "panic.h"
@ -20,11 +26,10 @@
/* Conditionally used by debuglog when NDEBUG is not set */
int32_t debuglog_file_descriptor = -1;
uint32_t runtime_processor_speed_MHz = 0;
uint64_t runtime_relative_deadline_us_max = 0; /* a value higher than this will cause overflow on a uint64_t */
uint32_t runtime_total_online_processors = 0;
uint32_t runtime_worker_threads_count = 0;
const uint32_t runtime_first_worker_processor = 1;
uint32_t runtime_processor_speed_MHz = 0;
uint32_t runtime_total_online_processors = 0;
uint32_t runtime_worker_threads_count = 0;
const uint32_t runtime_first_worker_processor = 1;
/* TODO: the worker never actually records state here */
int runtime_worker_threads_argument[WORKER_THREAD_CORE_COUNT] = { 0 }; /* The worker sets its argument to -1 on error */
pthread_t runtime_worker_threads[WORKER_THREAD_CORE_COUNT];
@ -81,7 +86,7 @@ runtime_allocate_available_cores()
{
/* Find the number of processors currently online */
runtime_total_online_processors = sysconf(_SC_NPROCESSORS_ONLN);
printf("Detected %u cores\n", runtime_total_online_processors);
printf("\tCore Count: %u\n", runtime_total_online_processors);
uint32_t max_possible_workers = runtime_total_online_processors - 1;
if (runtime_total_online_processors < 2) panic("Runtime requires at least two cores!");
@ -98,8 +103,9 @@ runtime_allocate_available_cores()
runtime_worker_threads_count = max_possible_workers;
}
printf("Running one listener core at ID %u and %u worker core(s) starting at ID %u\n", LISTENER_THREAD_CORE_ID,
runtime_worker_threads_count, runtime_first_worker_processor);
printf("\tListener core ID: %u\n", LISTENER_THREAD_CORE_ID);
printf("\tFirst Worker core ID: %u\n", runtime_first_worker_processor);
printf("\tWorker core count: %u\n", runtime_worker_threads_count);
}
/**
@ -205,39 +211,150 @@ runtime_configure()
} else {
panic("Invalid scheduler policy: %s. Must be {EDF|FIFO}\n", scheduler_policy);
}
printf("Scheduler Policy: %s\n", print_runtime_scheduler(runtime_scheduler));
printf("\tScheduler Policy: %s\n", print_runtime_scheduler(runtime_scheduler));
/* Runtime Perf Log */
char *runtime_sandbox_perf_log_path = getenv("SLEDGE_SANDBOX_PERF_LOG");
if (runtime_sandbox_perf_log_path != NULL) {
printf("Logging Sandbox Performance to: %s\n", runtime_sandbox_perf_log_path);
printf("\tSandbox Performance Log: %s\n", runtime_sandbox_perf_log_path);
runtime_sandbox_perf_log = fopen(runtime_sandbox_perf_log_path, "w");
if (runtime_sandbox_perf_log == NULL) { perror("sandbox perf log"); }
fprintf(runtime_sandbox_perf_log, "id,function,state,deadline,actual,queued,initializing,runnable,"
"running,blocked,returned,memory\n");
} else {
printf("\tSandbox Performance Log: Disabled\n");
}
}
void
log_compiletime_config()
{
printf("Static Compiler Flags:\n");
#ifdef ADMISSIONS_CONTROL
printf("\tAdmissions Control: Enabled\n");
#else
printf("\tAdmissions Control: Disabled\n");
#endif
#ifdef NDEBUG
printf("\tAssertions and Debug Logs: Disabled\n");
#else
printf("\tAssertions and Debug Logs: Enabled\n");
#endif
#ifdef LOG_TO_FILE
printf("\tLogging to: %s\n", RUNTIME_LOG_FILE);
#else
printf("\tLogging to: STDOUT and STDERR\n");
#endif
#if defined(aarch64)
printf("\tArchitecture: %s\n", "aarch64");
#elif defined(x86_64)
printf("\tArchitecture: %s\n", "x86_64");
#endif
int ncores = NCORES;
printf("\tTotal Cores: %d\n", ncores);
int page_size = PAGE_SIZE;
printf("\tPage Size: %d\n", page_size);
#ifdef LOG_HTTP_PARSER
printf("\tLog HTTP Parser: Enabled\n");
#else
printf("\tLog HTTP Parser: Disabled\n");
#endif
#ifdef LOG_STATE_CHANGES
printf("\tLog State Changes: Enabled\n");
#else
printf("\tLog State Changes: Disabled\n");
#endif
#ifdef LOG_LOCK_OVERHEAD
printf("\tLog Lock Overhead: Enabled\n");
#else
printf("\tLog Lock Overhead: Disabled\n");
#endif
#ifdef LOG_LISTENER_LOCK_OVERHEAD
printf("\tLog Listener Lock Overhead: Enabled\n");
#else
printf("\tLog Listener Lock Overhead: Disabled\n");
#endif
#ifdef LOG_CONTEXT_SWITCHES
printf("\tLog Context Switches: Enabled\n");
#else
printf("\tLog Context Switches: Disabled\n");
#endif
#ifdef LOG_ADMISSIONS_CONTROL
printf("\tLog Admissions Control: Enabled\n");
#else
printf("\tLog Admissions Control: Disabled\n");
#endif
#ifdef LOG_REQUEST_ALLOCATION
printf("\tLog Request Allocation: Enabled\n");
#else
printf("\tLog Request Allocation: Disabled\n");
#endif
#ifdef LOG_PREEMPTION
printf("\tLog Preemption: Enabled\n");
#else
printf("\tLog Preemption: Disabled\n");
#endif
#ifdef LOG_MODULE_LOADING
printf("\tLog Module Loading: Enabled\n");
#else
printf("\tLog Module Loading: Disabled\n");
#endif
#ifdef LOG_TOTAL_REQS_RESPS
printf("\tLog Total Reqs/Resps: Enabled\n");
#else
printf("\tLog Total Reqs/Resps: Disabled\n");
#endif
#ifdef LOG_SANDBOX_COUNT
printf("\tLog Sandbox Count: Enabled\n");
#else
printf("\tLog Sandbox Count: Disabled\n");
#endif
#ifdef LOG_LOCAL_RUNQUEUE
printf("\tLog Local Runqueue: Enabled\n");
#else
printf("\tLog Local Runqueue: Disabled\n");
#endif
}
int
main(int argc, char **argv)
{
runtime_process_debug_log_behavior();
printf("Starting the Sledge runtime\n");
if (argc != 2) {
runtime_usage(argv[0]);
exit(-1);
}
printf("Starting the Sledge runtime\n");
log_compiletime_config();
runtime_process_debug_log_behavior();
printf("Runtime Environment:\n");
memset(runtime_worker_threads, 0, sizeof(pthread_t) * WORKER_THREAD_CORE_COUNT);
runtime_processor_speed_MHz = runtime_get_processor_speed_MHz();
if (unlikely(runtime_processor_speed_MHz == 0)) panic("Failed to detect processor speed\n");
runtime_relative_deadline_us_max = UINT64_MAX / runtime_processor_speed_MHz;
software_interrupt_interval_duration_in_cycles = (uint64_t)SOFTWARE_INTERRUPT_INTERVAL_DURATION_IN_USEC
* runtime_processor_speed_MHz;
printf("Detected processor speed of %u MHz\n", runtime_processor_speed_MHz);
printf("\tProcessor Speed: %u MHz\n", runtime_processor_speed_MHz);
runtime_set_resource_limits_to_max();
runtime_allocate_available_cores();

@ -199,7 +199,7 @@ module_new(char *name, char *path, int32_t argument_count, uint32_t stack_size,
module->relative_deadline_us = relative_deadline_us;
/* This should have been handled when a module was loaded */
assert(relative_deadline_us < runtime_relative_deadline_us_max);
assert(relative_deadline_us < RUNTIME_RELATIVE_DEADLINE_US_MAX);
/* This can overflow a uint32_t, so be sure to cast appropriately */
module->relative_deadline = (uint64_t)relative_deadline_us * runtime_processor_speed_MHz;
@ -386,34 +386,54 @@ module_new_from_json(char *file_name)
file_buffer + tokens[j + i + 1].start);
sprintf(key, "%.*s", tokens[j + i].end - tokens[j + i].start,
file_buffer + tokens[j + i].start);
if (strlen(key) == 0) panic("Unexpected encountered empty key\n");
if (strlen(val) == 0) panic("%s field contained empty string\n", key);
if (strcmp(key, "name") == 0) {
// TODO: Currently, multiple modules can have identical names. Ports are the true unique
// identifiers. Consider enforcing unique names in future
strcpy(module_name, val);
} else if (strcmp(key, "path") == 0) {
// Invalid path will crash on dlopen
strcpy(module_path, val);
} else if (strcmp(key, "port") == 0) {
port = atoi(val);
// Validate sane port
// If already taken, will error on bind call in module_listen
int buffer = atoi(val);
if (buffer < 0 || buffer > 65535)
panic("Expected port between 0 and 65535, saw %d\n", buffer);
port = buffer;
} else if (strcmp(key, "argsize") == 0) {
// Validate in expected range 0..127. Unclear if 127 is an actual hard limit
argument_count = atoi(val);
if (argument_count < 0 || argument_count > 127)
panic("Expected argument count between 0 and 127, saw %d\n", argument_count);
} else if (strcmp(key, "active") == 0) {
is_active = (strcmp(val, "yes") == 0);
assert(tokens[i + j + 1].type == JSMN_PRIMITIVE);
if (val[0] == 't') {
is_active = true;
} else if (val[0] == 'f') {
is_active = false;
} else {
panic("Expected active key to be a JSON boolean, was %s\n", val);
}
} else if (strcmp(key, "relative-deadline-us") == 0) {
unsigned long long buffer = strtoull(val, NULL, 10);
if (buffer > runtime_relative_deadline_us_max)
panic("Max relative-deadline-us is %u, but entry was %llu\n", UINT32_MAX,
buffer);
int64_t buffer = strtoll(val, NULL, 10);
if (buffer < 0 || buffer > (int64_t)RUNTIME_RELATIVE_DEADLINE_US_MAX)
panic("Relative-deadline-us must be between 0 and %ld, was %ld\n",
(int64_t)RUNTIME_RELATIVE_DEADLINE_US_MAX, buffer);
relative_deadline_us = (uint32_t)buffer;
} else if (strcmp(key, "expected-execution-us") == 0) {
unsigned long long buffer = strtoull(val, NULL, 10);
if (buffer > UINT32_MAX)
panic("Max expected-execution-us is %u, but entry was %llu\n", UINT32_MAX,
buffer);
int64_t buffer = strtoll(val, NULL, 10);
if (buffer < 0 || buffer > (int64_t)RUNTIME_EXPECTED_EXECUTION_US_MAX)
panic("Relative-deadline-us must be between 0 and %ld, was %ld\n",
(int64_t)RUNTIME_EXPECTED_EXECUTION_US_MAX, buffer);
expected_execution_us = (uint32_t)buffer;
} else if (strcmp(key, "admissions-percentile") == 0) {
unsigned long long buffer = strtoull(val, NULL, 10);
int32_t buffer = strtol(val, NULL, 10);
if (buffer > 99 || buffer < 50)
panic("admissions-percentile must be > 50 and <= 99 but was %llu\n", buffer);
panic("admissions-percentile must be > 50 and <= 99 but was %d\n", buffer);
admissions_percentile = (int)buffer;
} else if (strcmp(key, "http-req-headers") == 0) {
assert(tokens[i + j + 1].type == JSMN_ARRAY);
@ -442,12 +462,22 @@ module_new_from_json(char *file_name)
strncpy(r, file_buffer + g->start, g->end - g->start);
}
} else if (strcmp(key, "http-req-size") == 0) {
request_size = atoi(val);
int64_t buffer = strtoll(val, NULL, 10);
if (buffer < 0 || buffer > RUNTIME_HTTP_REQUEST_SIZE_MAX)
panic("http-req-size must be between 0 and %ld, was %ld\n",
(int64_t)RUNTIME_HTTP_REQUEST_SIZE_MAX, buffer);
request_size = (int32_t)buffer;
} else if (strcmp(key, "http-resp-size") == 0) {
response_size = atoi(val);
int64_t buffer = strtoll(val, NULL, 10);
if (buffer < 0 || buffer > RUNTIME_HTTP_REQUEST_SIZE_MAX)
panic("http-resp-size must be between 0 and %ld, was %ld\n",
(int64_t)RUNTIME_HTTP_REQUEST_SIZE_MAX, buffer);
response_size = (int32_t)buffer;
} else if (strcmp(key, "http-req-content-type") == 0) {
if (strlen(val) == 0) panic("http-req-content-type was unexpectedly an empty string");
strcpy(request_content_type, val);
} else if (strcmp(key, "http-resp-content-type") == 0) {
if (strlen(val) == 0) panic("http-resp-content-type was unexpectedly an empty string");
strcpy(response_content_type, val);
} else {
#ifdef LOG_MODULE_LOADING
@ -458,11 +488,29 @@ module_new_from_json(char *file_name)
}
i += ntoks;
/* Validate presence of required fields */
/* If the ratio is too big, admissions control is too coarse */
uint32_t ratio = relative_deadline_us / expected_execution_us;
if (ratio > 1000000) panic("Ratio of Deadline to Execution time cannot exceed 1000000");
/* Validate presence of required fields */
if (strlen(module_name) == 0) panic("name field is required\n");
if (strlen(module_path) == 0) panic("path field is required\n");
if (port == 0) panic("port field is required\n");
#ifdef ADMISSIONS_CONTROL
if (expected_execution_us == 0) panic("expected-execution-us is required for EDF\n");
/* expected-execution-us and relative-deadline-us are required in case of admissions control */
if (expected_execution_us == 0) panic("expected-execution-us is required\n");
if (relative_deadline_us == 0) panic("relative_deadline_us is required\n");
#else
/* relative-deadline-us is required if scheduler is EDF */
if (runtime_scheduler == RUNTIME_SCHEDULER_EDF && relative_deadline_us == 0)
panic("relative_deadline_us is required\n");
#endif
/* argsize defaults to 0 if absent */
/* http-req-headers defaults to empty if absent */
/* http-req-headers defaults to empty if absent */
if (is_active) {
/* Allocate a module based on the values from the JSON */
struct module *module = module_new(module_name, module_path, argument_count, 0, 0,
@ -480,7 +528,7 @@ module_new_from_json(char *file_name)
free(reponse_headers);
}
if (module_count == 0) fprintf(stderr, "%s contained no active modules\n", file_name);
if (module_count == 0) panic("%s contained no active modules\n", file_name);
#ifdef LOG_MODULE_LOADING
debuglog("Loaded %d module%s!\n", module_count, module_count > 1 ? "s" : "");
#endif

@ -1,14 +1,14 @@
{
"active": "yes",
"name": "fibonacci",
"path": "fibonacci_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1024,
"http-resp-headers": [],
"http-resp-size": 1024,
"http-resp-content-type": "text/plain"
}
"active": true,
"name": "fibonacci",
"path": "fibonacci_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1024,
"http-resp-headers": [],
"http-resp-size": 1024,
"http-resp-content-type": "text/plain"
}

@ -1,5 +1,5 @@
{
"active": "yes",
"active": true,
"name": "fibonacci",
"path": "fibonacci_wasm.so",
"port": 10000,
@ -13,7 +13,7 @@
"http-resp-content-type": "text/plain"
},
{
"active": "yes",
"active": true,
"name": "fibonacci2",
"path": "fibonacci_wasm.so",
"port": 10001,

@ -1,14 +1,14 @@
{
"active": "yes",
"name": "cifar10",
"path": "cifar10_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/png",
"http-req-size": 4096,
"http-resp-headers": [],
"http-resp-size": 128,
"http-resp-content-type": "text/plain"
}
"active": true,
"name": "cifar10",
"path": "cifar10_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/png",
"http-req-size": 4096,
"http-resp-headers": [],
"http-resp-size": 128,
"http-resp-content-type": "text/plain"
}

@ -1,14 +1,14 @@
{
"active": "yes",
"name": "empty",
"path": "empty_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1024,
"http-resp-headers": [],
"http-resp-size": 1024,
"http-resp-content-type": "text/plain"
}
"active": true,
"name": "empty",
"path": "empty_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1024,
"http-resp-headers": [],
"http-resp-size": 1024,
"http-resp-content-type": "text/plain"
}

@ -1,5 +1,5 @@
{
"active": "yes",
"active": true,
"name": "fibonacci",
"path": "fibonacci_wasm.so",
"port": 10000,

@ -1,14 +1,14 @@
{
"active": "yes",
"name": "gocr",
"path": "gocr_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/png",
"http-req-size": 10240,
"http-resp-headers": [],
"http-resp-size": 128,
"http-resp-content-type": "text/plain"
}
"active": true,
"name": "gocr",
"path": "gocr_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/png",
"http-req-size": 10240,
"http-resp-headers": [],
"http-resp-size": 128,
"http-resp-content-type": "text/plain"
}

@ -1,160 +1,160 @@
({
"active": "no",
"name": "adpcm",
"path": "adpcm_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": "yes",
"name": "bitcount",
"path": "bitcount_wasm.so",
"port": 10002,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": "yes",
"name": "basic_math",
"path": "basic_math_wasm.so",
"port": 10004,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": "no",
"name": "binarytrees",
"path": "binarytrees_wasm.so",
"port": 10006,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": "no",
"name": "crc",
"path": "crc_wasm.so",
"port": 10008,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": "no",
"name": "dijkstra",
"path": "dijkstra_wasm.so",
"port": 10010,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": "no",
"name": "forever",
"path": "forever_wasm.so",
"port": 10012,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": "no",
"name": "fornever",
"path": "forever_wasm.so",
"port": 10014,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": "no",
"name": "fft",
"path": "fft_wasm.so",
"port": 10016,
"relative-deadline-us": 50000,
"argsize": 3
},
{
"active": "no",
"name": "function_pointers",
"path": "function_pointers_wasm.so",
"port": 10018,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": "no",
"name": "gsm",
"path": "gsm_wasm.so",
"port": 10020,
"relative-deadline-us": 50000,
"argsize": 4
},
{
"active": "no",
"name": "libjpeg",
"path": "libjpeg_wasm.so",
"port": 10022,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": "no",
"name": "mandelbrot",
"path": "mandelbrot_wasm.so",
"port": 10024,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": "no",
"name": "matrix_multiply",
"path": "matrix_multiply_wasm.so",
"port": 10026,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": "no",
"name": "particia",
"path": "partricia_wasm.so",
"port": 10028,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": "no",
"name": "sqlite",
"path": "sqlite_wasm.so",
"port": 10030,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": "yes",
"name": "stringsearch",
"path": "stringsearch_wasm.so",
"port": 10032,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": "no",
"name": "filesys",
"path": "filesys_wasm.so",
"port": 10034,
"relative-deadline-us": 50000,
"argsize": 3
},
{
"active": "no",
"name": "sockserver",
"path": "sockserver_wasm.so",
"port": 10036,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": "no",
"name": "sockclient",
"path": "sockclient_wasm.so",
"port": 10038,
"relative-deadline-us": 50000,
"argsize": 3
})
{
"active": false,
"name": "adpcm",
"path": "adpcm_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": true,
"name": "bitcount",
"path": "bitcount_wasm.so",
"port": 10002,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": true,
"name": "basic_math",
"path": "basic_math_wasm.so",
"port": 10004,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": false,
"name": "binarytrees",
"path": "binarytrees_wasm.so",
"port": 10006,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": false,
"name": "crc",
"path": "crc_wasm.so",
"port": 10008,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": false,
"name": "dijkstra",
"path": "dijkstra_wasm.so",
"port": 10010,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": false,
"name": "forever",
"path": "forever_wasm.so",
"port": 10012,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": false,
"name": "fornever",
"path": "forever_wasm.so",
"port": 10014,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": false,
"name": "fft",
"path": "fft_wasm.so",
"port": 10016,
"relative-deadline-us": 50000,
"argsize": 3
},
{
"active": false,
"name": "function_pointers",
"path": "function_pointers_wasm.so",
"port": 10018,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": false,
"name": "gsm",
"path": "gsm_wasm.so",
"port": 10020,
"relative-deadline-us": 50000,
"argsize": 4
},
{
"active": false,
"name": "libjpeg",
"path": "libjpeg_wasm.so",
"port": 10022,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": false,
"name": "mandelbrot",
"path": "mandelbrot_wasm.so",
"port": 10024,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": false,
"name": "matrix_multiply",
"path": "matrix_multiply_wasm.so",
"port": 10026,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": false,
"name": "particia",
"path": "partricia_wasm.so",
"port": 10028,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": false,
"name": "sqlite",
"path": "sqlite_wasm.so",
"port": 10030,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": true,
"name": "stringsearch",
"path": "stringsearch_wasm.so",
"port": 10032,
"relative-deadline-us": 50000,
"argsize": 1
},
{
"active": false,
"name": "filesys",
"path": "filesys_wasm.so",
"port": 10034,
"relative-deadline-us": 50000,
"argsize": 3
},
{
"active": false,
"name": "sockserver",
"path": "sockserver_wasm.so",
"port": 10036,
"relative-deadline-us": 50000,
"argsize": 2
},
{
"active": false,
"name": "sockclient",
"path": "sockclient_wasm.so",
"port": 10038,
"relative-deadline-us": 50000,
"argsize": 3
}

@ -1,14 +1,14 @@
{
"active": "yes",
"name": "lpd",
"path": "lpd_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/jpeg",
"http-req-size": 102400,
"http-resp-headers": [],
"http-resp-size": 1048576,
"http-resp-content-type": "image/jpeg"
}
"active": true,
"name": "lpd",
"path": "lpd_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/jpeg",
"http-req-size": 102400,
"http-resp-headers": [],
"http-resp-size": 1048576,
"http-resp-content-type": "image/jpeg"
}

@ -1,14 +1,14 @@
{
"active": "yes",
"name": "resize",
"path": "resize_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/jpeg",
"http-req-size": 102400,
"http-resp-headers": [],
"http-resp-size": 102400,
"http-resp-content-type": "image/png"
}
"active": true,
"name": "resize",
"path": "resize_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/jpeg",
"http-req-size": 102400,
"http-resp-headers": [],
"http-resp-size": 102400,
"http-resp-content-type": "image/png"
}

@ -1,14 +1,14 @@
{
"active": "yes",
"name": "work",
"path": "work_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1048776,
"http-resp-headers": [],
"http-resp-size": 1048776,
"http-resp-content-type": "text/plain"
}
"active": true,
"name": "work",
"path": "work_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1048776,
"http-resp-headers": [],
"http-resp-size": 1048776,
"http-resp-content-type": "text/plain"
}

@ -1,14 +1,14 @@
{
"active": "yes",
"name": "work100k",
"path": "work100k_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 102600,
"http-resp-headers": [],
"http-resp-size": 102600,
"http-resp-content-type": "text/plain"
}
"active": true,
"name": "work100k",
"path": "work100k_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 102600,
"http-resp-headers": [],
"http-resp-size": 102600,
"http-resp-content-type": "text/plain"
}

@ -1,14 +1,14 @@
{
"active": "yes",
"name": "work10k",
"path": "work10k_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 10480,
"http-resp-headers": [],
"http-resp-size": 10480,
"http-resp-content-type": "text/plain"
}
"active": true,
"name": "work10k",
"path": "work10k_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 10480,
"http-resp-headers": [],
"http-resp-size": 10480,
"http-resp-content-type": "text/plain"
}

@ -1,14 +1,14 @@
{
"active": "yes",
"name": "work1k",
"path": "work1k_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1200,
"http-resp-headers": [],
"http-resp-size": 1200,
"http-resp-content-type": "text/plain"
}
"active": true,
"name": "work1k",
"path": "work1k_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1200,
"http-resp-headers": [],
"http-resp-size": 1200,
"http-resp-content-type": "text/plain"
}

@ -1,14 +1,14 @@
{
"active": "yes",
"name": "work1m",
"path": "work1m_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1048776,
"http-resp-headers": [],
"http-resp-size": 1048776,
"http-resp-content-type": "text/plain"
}
"active": true,
"name": "work1m",
"path": "work1m_wasm.so",
"port": 10000,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "text/plain",
"http-req-size": 1048776,
"http-resp-headers": [],
"http-resp-size": 1048776,
"http-resp-content-type": "text/plain"
}

Loading…
Cancel
Save