main
hwwang 6 months ago
parent 75bf451df0
commit a6e464db44

@ -12,7 +12,7 @@
"_GNU_SOURCE"
],
"cStandard": "${default}",
"compilerPath": "/usr/bin/gcc",
"compilerPath": "/usr/bin/clang",
"cppStandard": "${default}"
}
],

@ -110,7 +110,7 @@ JSMNCFLAGS += -DJSMN_STRICT
all: thirdparty runtime
runtime:
@echo "Compiling runtime"
# @echo "Compiling runtime"
@mkdir -p bin/
@${CC} ${CC_OPTIONS} ${INCLUDES} ${CFLAGS} ${LDFLAGS} ${CFILES} ${JSMNCFLAGS} -L/usr/lib/ $^ -o bin/${BINARY_NAME}

@ -1,4 +1,4 @@
#pragma 78once
#pragma once
#include <string.h>
#include <sys/socket.h>
@ -85,8 +85,8 @@ struct module {
/* the left and right children module in the tree */
struct module *left_module;
struct module *right_module;
/* parent moudle or not?*/
bool *is_parent;
/* parent module or not?*/
bool is_parent;
};

@ -394,7 +394,10 @@ module_new_from_json(char *file_name)
}
}
}*/
struct module *nodes[total_tokens];
struct module **nodes = malloc(JSON_MAX_ELEMENT_COUNT * sizeof(struct module*));
if (nodes == NULL) {
fprintf(stderr, "Memory allocation failed for nodes array\n");
}
for (int i = 0; i < total_tokens; i++) {
assert(tokens[i].type == JSMN_OBJECT);
@ -599,10 +602,8 @@ module_new_from_json(char *file_name)
if (module == NULL) goto module_new_err;
assert(module);
if(is_tail_module) module->is_parent == true;
nodes[i] = malloc(sizeof(module));
if(is_tail_module) module->is_parent = true;
nodes[i] = module;
// if (tail_module != NULL) { tail_module->next_module = module; }
// tail_module = module;
// tail_module->next_module = NULL;
@ -620,13 +621,15 @@ module_new_from_json(char *file_name)
free(request_headers);
free(reponse_headers);
}
for (int i = 0; i < total_tokens; i++) {
if (module_count == 0) panic("%s contained no active modules\n", file_name);
for (int i = 0; i <= module_count; i++) {
int left_index = 2 * i + 1;
int right_index = 2 * i + 2;
if (left_index < total_tokens) nodes[i]->left_module = nodes[left_index];
if (right_index < total_tokens) nodes[i]->right_module = nodes[right_index];
if (left_index <= module_count) nodes[i]->left_module = nodes[left_index];
if (right_index <= module_count) nodes[i]->right_module = nodes[right_index];
}
if (module_count == 0) panic("%s contained no active modules\n", file_name);
free(nodes);
#ifdef LOG_MODULE_LOADING
debuglog("Loaded %d module%s!\n", module_count, module_count > 1 ? "s" : "");
#endif

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

@ -0,0 +1 @@
Subproject commit 9c30d84d708d9713ac1990330f033189c3d88b39

@ -0,0 +1 @@
Subproject commit 3507d3d0001db45eedbb65072f5fe7cad8bcb59b

@ -0,0 +1,59 @@
include Makefile.inc
#TESTS=fibonacci fibonacci2 fibonacci3 big_fibonacci C-Image-Manip empty work work1k work10k work100k work1m forever filesys sockserver sockclient empty
TESTS=fibonacci big_fibonacci C-Image-Manip empty work work1k work10k work100k work1m forever filesys sockserver sockclient empty
TESTSRT=$(TESTS:%=%_rt)
.PHONY: all clean rttests tinyekf cifar10 gocr sod
all: rttests tinyekf cifar10 gocr sod
@echo "Test Compilation done!"
rttests: $(TESTSRT)
clean:
@echo "Cleaning Test Applications"
@rm -rf ${TMP_DIR}
@rm -rf ${SLEDGE_BIN_DIR}/*_wasm.so
@make clean -C ./TinyEKF/extras/c/ -f wasm.mk
@make clean -C ./CMSIS_5_NN/ -f Makefile
@make clean -C ./gocr/src/ -f wasm.mk
@make clean -C ./sod/
tinyekf:
@echo "Making and Installing tinyekf"
@make gps_ekf_fn.so -C ./TinyEKF/extras/c/ -f wasm.mk
@cp ./TinyEKF/extras/c/gps_ekf_fn.so ${SLEDGE_BIN_DIR}/ekf_wasm.so
cifar10:
@echo "Making and Installing cifar10"
@make cifar10.so -C ./CMSIS_5_NN/ -f Makefile
@cp ./CMSIS_5_NN/cifar10.so ${SLEDGE_BIN_DIR}/cifar10_wasm.so
gocr:
@echo "Making and Installing gocr"
@make gocr.so -C ./gocr/src/ -f wasm.mk
@cp ./gocr/src/gocr.so ${SLEDGE_BIN_DIR}/gocr_wasm.so
sod:
@echo "Making and Installing license_plate_detection and image_resize"
@make dir samples.so -C ./sod/
@cp ./sod/bin/license_plate_detection.so ${SLEDGE_BIN_DIR}/lpd_wasm.so
@cp ./sod/bin/resize_image.so ${SLEDGE_BIN_DIR}/resize_wasm.so
C-Image-Manip:
@echo "Making and Installing pngPlay"
@make pngPlay.so -C ./C-Image-Manip -f Makefile
@cp ./C-Image-Manip/pngPlay.so ${SLEDGE_BIN_DIR}/pngPlay_wasm.so
%_rt:
@mkdir -p ${TMP_DIR}
@echo "Compiling $(@:%_rt=%)"
${WASMCC} ${$(@:%_rt=%)_CFLAGS} ${WASMCFLAGS} ${OPTFLAGS} $(@:%_rt=%)/*.c $(AWSM_DUMMY) -o ${TMP_DIR}/$(@:%_rt=%).wasm
${AWSM_NAME} --inline-constant-globals --runtime-globals ${TMP_DIR}/$(@:%_rt=%).wasm -o ${TMP_DIR}/$(@:%_rt=%).bc
${CC} --shared -fPIC ${OPTFLAGS} -I${SLEDGE_RT_INC} -D${USE_MEM} ${TMP_DIR}/$(@:%_rt=%).bc ${SLEDGE_MEMC} ${SLEDGE_WASMISA} -o ${TMP_DIR}/$(@:%_rt=%)_wasm.so
@cp ${TMP_DIR}/$(@:%_rt=%)_wasm.so ${SLEDGE_BIN_DIR}
# @rm -rf ${TMP_DIR}

@ -0,0 +1,43 @@
ARCH := $(shell uname -m)
CC=clang # Source -> Native
WASMCC=wasm32-unknown-unknown-wasm-clang # Source -> WebAssembly
OPTFLAGS=-O3 -flto
# OPTFLAGS=-O0 -flto -g
MEMC_64=64bit_nix.c
# MEMC_NO=no_protection.c
# MEMC_GEN=generic.c
# MEMC_MPX=mpx.c
# MEMC_SEG=segmented.c
TMP_DIR=tmp/
# same stack-size for all
WASMLINKFLAGS=-Wl,-z,stack-size=524288,--allow-undefined,--no-threads,--stack-first,--no-entry,--export-all,--export=main,--export=dummy
WASMCFLAGS=${WASMLINKFLAGS} -nostartfiles
# aWsm Compiler Runtime (WebAssembly -> LLVM Bitcode)
AWSM_NAME=awsm
AWSM_BASE_DIR=../../${AWSM_NAME}
AWSM_RT_DIR=${AWSM_BASE_DIR}/runtime/
AWSM_RT_MEM=${AWSM_RT_DIR}/memory/
AWSM_RT_LIBC=${AWSM_RT_DIR}/libc/libc_backing.c
AWSM_RT_RT=${AWSM_RT_DIR}/runtime.c
AWSM_RT_ENV=${AWSM_RT_DIR}/libc/env.c
# Is seems like the arch specific code no longer exists
# AWSM_RT_ENV=${AWSM_RT_DIR}/libc/env.c ${AWSM_RT_DIR}/libc/env_${ARCH}.c
AWSM_MEMC=${AWSM_RT_MEM}/${MEMC_64}
AWSM_DUMMY=${AWSM_BASE_DIR}/code_benches/dummy.c
# for SLEdge
SLEDGE_BASE_DIR=../../
SLEDGE_RT_DIR=${SLEDGE_BASE_DIR}/runtime/
SLEDGE_RT_INC=${SLEDGE_RT_DIR}/include/
SLEDGE_BIN_DIR=${SLEDGE_RT_DIR}/bin/
SLEDGE_WASMISA=${SLEDGE_RT_DIR}/compiletime/instr.c
USE_MEM=USE_MEM_VM
ifeq ($(USE_MEM),USE_MEM_VM)
SLEDGE_MEMC=${SLEDGE_RT_DIR}/compiletime/memory/${MEMC_64}
endif

@ -0,0 +1 @@
Subproject commit 76daf1da0546dd04896f20ae630cdeea0280c095

@ -0,0 +1,25 @@
#!/bin/bash
# Executes the runtime in GDB
# Substitutes the absolute path from the container with a path relatively derived from the location of this script
# This allows debugging outside of the Docker container
# Also disables pagination and stopping on SIGUSR1
# We are currently unclear why the image classifier isn't working properly
# Both bmp and png formats are added to the repo while debugging
# file_type=bmp
# file_type=png
file_type=jpg
batch_id=0
for class in airplane automobile bird cat deer dog frog horse ship truck; do
for instance in 1 2 3 4 5 6 7 8 9 10; do
echo "Classifying $class$instance.$file_type"
#curl -H 'Expect:' -H "Content-Type: Image/$file_type" --data-binary "@images/$file_type/$class$instance.$file_type" localhost:10000 2> /dev/null
hey -disable-compression -disable-keepalive -disable-redirects -c 1 -z 60s -cpus 1 -t 0 -m GET -D "images/$file_type/$class$instance.$file_type" "http://10.10.1.1:10000" > "client_$batch_id.txt" &
((batch_id++))
done
done
pids=$(pgrep hey | tr '\n' ' ')
[[ -n $pids ]] && wait -f $pids
printf "[OK]\n"

@ -0,0 +1,25 @@
#!/bin/bash
# Executes the runtime in GDB
# Substitutes the absolute path from the container with a path relatively derived from the location of this script
# This allows debugging outside of the Docker container
# Also disables pagination and stopping on SIGUSR1
# We are currently unclear why the image classifier isn't working properly
# Both bmp and png formats are added to the repo while debugging
# file_type=bmp
# file_type=png
file_type=jpg
batch_id=0
for image in airplane_0688.jpg car_0931.jpg car_0936.jpg cat_0865.jpg dog_0323.jpg dog_0658.jpg flower_0790.jpg motorbike_0334.jpg motorbike_0684.jpg motorbike_0706.jpg; do
for instance in 1 2 3; do
echo "Classifying $image"
#curl -H 'Expect:' -H "Content-Type: Image/$file_type" --data-binary "@images/$file_type/$class$instance.$file_type" localhost:10000 2> /dev/null
hey -disable-compression -disable-keepalive -disable-redirects -c 1 -z 120s -cpus 1 -t 0 -m GET -D "sample_images/$image" "http://10.10.1.1:10000" > "client_$batch_id.txt" &
((batch_id++))
done
done
pids=$(pgrep hey | tr '\n' ' ')
[[ -n $pids ]] && wait -f $pids
printf "[OK]\n"

@ -0,0 +1,40 @@
#!/bin/bash
# Executes the runtime in GDB
# Substitutes the absolute path from the container with a path relatively derived from the location of this script
# This allows debugging outside of the Docker container
# Also disables pagination and stopping on SIGUSR1
# We are currently unclear why the image classifier isn't working properly
# Both bmp and png formats are added to the repo while debugging
# file_type=bmp
# file_type=png
function usage {
echo "$0 [image_folder_path]"
exit 1
}
if [ $# != 1 ] ; then
usage
exit 1;
fi
batch_id=0
path=$1
files=$(ls $path)
for image in $files; do
for instance in 1; do
echo "Classifying $image"
#curl -H 'Expect:' -H "Content-Type: Image/$file_type" --data-binary "@images/$file_type/$class$instance.$file_type" localhost:10000 2> /dev/null
hey -disable-compression -disable-keepalive -disable-redirects -c 1 -z 120s -cpus 1 -t 0 -m GET -D "$path/$image" "http://10.10.1.1:10000" > "client_$batch_id.txt" &
((batch_id++))
done
done
pids=$(pgrep hey | tr '\n' ' ')
[[ -n $pids ]] && wait -f $pids
printf "[OK]\n"

@ -0,0 +1,44 @@
#ifndef GET_TIME_H
#define GET_TIME_H
#include <time.h>
#include <sys/time.h>
#include <stdio.h>
#ifndef WASM
#ifndef CPU_FREQ
#define CPU_FREQ 1000
#endif
#endif
static unsigned long long
get_time()
{
#if 0
unsigned long long int ret = 0;
unsigned int cycles_lo;
unsigned int cycles_hi;
__asm__ volatile ("rdtsc" : "=a" (cycles_lo), "=d" (cycles_hi));
ret = (unsigned long long int)cycles_hi << 32 | cycles_lo;
return ret;
#else
struct timeval Tp;
int stat;
stat = gettimeofday(&Tp, NULL);
if (stat != 0) printf("Error return from gettimeofday: %d", stat);
return (Tp.tv_sec * 1000000 + Tp.tv_usec);
#endif
}
static inline void
print_time(unsigned long long s, unsigned long long e)
{
#if 0
printf("%llu cycs, %llu us\n", e - s, (e - s) / CPU_FREQ);
#else
fprintf(stdout, "%llu us\n", e - s);
#endif
}
#endif /* GET_TIME_H */

@ -0,0 +1,177 @@
#include <stdio.h>
#include <stdlib.h>
// #include "get_time.h"
volatile unsigned long g_v = 0;
unsigned long int
/*fib(unsigned long int n)
{
if (n <= 1) return n;
return fib(n + g_v - 1) + fib(n + g_v - 2);
}*/
fib(unsigned long int n)
{
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
}
int
main(int argc, char **argv)
{
char * array = NULL;
unsigned long n = 0, r,r2,r3,r4,r5,r6,r7,r8,r9,r10;
scanf("%lu", &n);
// unsigned long long st = get_time(), en;
r = fib(n);
r2 = fib(n+1);
r3 = fib(n+2);
r4 = fib(n+3);
r5 = fib(n+4);
r6 = fib(n+5);
r7 = fib(n+6);
r8 = fib(n+7);
r9 = fib(n+8);
r10 = fib(n+9);
/*switch(n) {
case 0: {
array = malloc(4 * 1024);
memset(array, 'a', 4 * 1024 - 1);
array[4 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
case 1: {
array = malloc(100 * 1024);
memset(array, 'b', 100 * 1024 - 1);
array[100 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
case 2: {
array = malloc(200 * 1024);
memset(array, 'g', 200 * 1024 - 1);
array[200 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
case 4: {
array = malloc(400 * 1024);
memset(array, 'c', 400 * 1024 - 1);
array[400 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
case 6: {
array = malloc(600 * 1024);
memset(array, 'd', 600 * 1024 - 1);
array[600 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
case 8: {
array = malloc(800 * 1024);
memset(array, 'e', 800 * 1024 - 1);
array[800 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
case 10:{
array = malloc(1000 * 1024);
memset(array, 'f', 1000 * 1024 - 1);
array[1000 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
default: printf("error input of n\n");
}*/
// en = get_time();
printf("%lu \n", n+10);
printf("%lu \n", r10);
printf("%lu \n", r9);
printf("%lu \n", r8);
printf("%lu \n", r7);
printf("%lu \n", r6);
printf("%lu \n", r5);
printf("%lu \n", r4);
printf("%lu \n", r3);
printf("%lu \n", r2);
printf("%lu \n", r);
// print_time(st, en);
return 0;
}
/*
int
main(int argc, char **argv)
{
unsigned long n = 0, r = 0;
scanf("%lu", &n);
switch(n) {
case 0: {
char array[4 * 1024] = {0};
memset(array, 'a', 4 * 1024);
array[4 * 1024 - 1] = 0;
break;
}
case 1: {
char array[100 * 1024] = {'b'};
memset(array, 'b', 100 * 1024);
array[100 * 1024 - 1] = 0;
break;
}
case 2: {
char array[200 * 1024] = {'c'};
memset(array, 'c', 200 * 1024);
array[200 * 1024 - 1] = 0;
break;
}
case 4: {
char array[400 * 1024] = {'d'};
memset(array, 'd', 400 * 1024);
array[400 * 1024 - 1] = 0;
break;
}
case 6: {
char array[600 * 1024] = {'e'};
memset(array, 'e', 600 * 1024);
array[600 * 1024 - 1] = 0;
break;
}
case 8: {
char array[800 * 1024] = {'f'};
memset(array, 'f', 800 * 1024);
array[800 * 1024 - 1] = 0;
break;
}
case 10:{
char array[1000 * 1024] = {'g'};
memset(array, 'g', 1000 * 1024);
array[1000 * 1024 - 1] = 0;
break;
}
default: printf("error input of n\n");
}
// unsigned long long st = get_time(), en;
printf("%lu \n", r);
// print_time(st, en);
return 0;
}
*/

@ -0,0 +1,32 @@
#!/bin/sh
ITERS=$3
# before running this benchmark,
# copy fibonacci to fibonacci_native.out
testeach() {
tmp_cnt=${ITERS}
exe_relpath=$1
echo "${exe_relpath} ($2) for ${tmp_cnt}"
while [ ${tmp_cnt} -gt 0 ]; do
bench=$(echo $2 | $exe_relpath 2> /dev/null)
tmp_cnt=$((tmp_cnt - 1))
echo "$bench"
done
echo "Done!"
}
MAXNUM=$2
tmp1_cnt=${MAXNUM}
while [ ${tmp1_cnt} -gt 28 ]; do
testeach ./fibonacci_$1.out ${tmp1_cnt}
tmp1_cnt=$((tmp1_cnt - 1))
done
echo "All done!"

@ -0,0 +1,28 @@
#!/bin/bash
function usage {
echo "$0 [prefix] [port] [times] "
exit 1
}
if [ $# != 3 ] ; then
usage
exit 1;
fi
prefix=$1
port=$2
time=$3
path="/users/xiaosuGW/sledge-serverless-framework/runtime/tests"
chmod 400 $path/id_rsa
input=0
server_log="fibnacci_"$prefix".log"
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/start.sh $server_log >/dev/null 2>&1 &"
hey -c 1 -z 60s -disable-keepalive -m GET -d $input "http://10.10.1.1:$port" > $prefix"_"$time".txt"
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/kill_sledge.sh"

@ -0,0 +1,32 @@
#!/bin/bash
function usage {
echo "$0 [chain length] [repeat times]"
exit 1
}
if [ $# != 2 ] ; then
usage
exit 1;
fi
chain_len=$1
repeat_t=$2
server_log="noop_"$chain_len".log"
log="noop"$chain_len"-"$repeat_t".txt"
start_script="start-noop"$chain_len".sh"
echo $start_script
path="/users/xiaosuGW/sledge-serverless-framework/runtime/tests"
chmod 400 $path/id_rsa
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/$start_script $server_log >/dev/null 2>&1 &"
hey -c 1 -z 60s -disable-keepalive -m GET -d 29 "http://10.10.1.1:10000" > $log 2>&1 &
pid1=$!
wait -f $pid1
printf "[OK]\n"
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/kill_sledge.sh"

@ -0,0 +1,15 @@
#!/bin/bash
pushd loadtest
./one_shoot.sh
popd
pushd srsf_loadtest
./one_shoot.sh
popd
pushd loadtest_p80
./one_shoot.sh
popd

@ -0,0 +1,22 @@
#!/bin/bash
function usage {
echo "$0 [loop count]"
exit 1
}
if [ $# != 1 ] ; then
usage
exit 1;
fi
loop_count=$1
for ((i=1; i <=$loop_count; i++))
do
for ((j=1; j <=5; j++))
do
./noop.sh $j $i
done
done

@ -0,0 +1,69 @@
#!/bin/bash
function usage {
echo "$0 [prefix] [port] [times] "
exit 1
}
if [ $# != 3 ] ; then
usage
exit 1;
fi
prefix=$1
port=$2
time=$3
path="/users/xiaosuGW/sledge-serverless-framework/runtime/tests"
chmod 400 $path/id_rsa
input=0
server_log="mem_copy_"$input".log"
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/start.sh $server_log >/dev/null 2>&1 &"
hey -c 1 -z 60s -disable-keepalive -m GET -d $input "http://10.10.1.1:$port" > $prefix"_"$input"-"$time.txt
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/kill_sledge.sh"
input=1
server_log="mem_copy_"$input".log"
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/start.sh $server_log >/dev/null 2>&1 &"
hey -c 1 -z 60s -disable-keepalive -m GET -d $input "http://10.10.1.1:$port" > $prefix"_"$input"-"$time.txt
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/kill_sledge.sh"
input=2
server_log="mem_copy_"$input".log"
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/start.sh $server_log >/dev/null 2>&1 &"
hey -c 1 -z 60s -disable-keepalive -m GET -d $input "http://10.10.1.1:$port" > $prefix"_"$input"-"$time.txt
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/kill_sledge.sh"
input=4
server_log="mem_copy_"$input".log"
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/start.sh $server_log >/dev/null 2>&1 &"
hey -c 1 -z 60s -disable-keepalive -m GET -d $input "http://10.10.1.1:$port" > $prefix"_"$input"-"$time.txt
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/kill_sledge.sh"
input=6
server_log="mem_copy_"$input".log"
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/start.sh $server_log >/dev/null 2>&1 &"
hey -c 1 -z 60s -disable-keepalive -m GET -d $input "http://10.10.1.1:$port" > $prefix"_"$input"-"$time.txt
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/kill_sledge.sh"
input=8
server_log="mem_copy_"$input".log"
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/start.sh $server_log >/dev/null 2>&1 &"
hey -c 1 -z 60s -disable-keepalive -m GET -d $input "http://10.10.1.1:$port" > $prefix"_"$input"-"$time.txt
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/kill_sledge.sh"
input=10
server_log="mem_copy_"$input".log"
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/start.sh $server_log >/dev/null 2>&1 &"
hey -c 1 -z 60s -disable-keepalive -m GET -d $input "http://10.10.1.1:$port" > $prefix"_"$input"-"$time.txt
ssh -o stricthostkeychecking=no -i $path/id_rsa xiaosuGW@10.10.1.1 "$path/kill_sledge.sh"

@ -0,0 +1,23 @@
#!/bin/bash
function usage {
echo "$0 [loop count]"
exit 1
}
if [ $# != 1 ] ; then
usage
exit 1;
fi
loop_count=$1
for ((i=1; i <=$loop_count; i++))
do
./test_mem_copy.sh chain 10004 $i
#./test_mem_copy.sh single 10003 $i
#./cpu_insensive.sh chain 10009 $i
#./cpu_insensive.sh single 10003 $i
done

@ -0,0 +1,22 @@
#!/bin/bash
# Executes the runtime in GDB
# Substitutes the absolute path from the container with a path relatively derived from the location of this script
# This allows debugging outside of the Docker container
# Also disables pagination and stopping on SIGUSR1
declare project_path="$(
cd "$(dirname "$1")/../.."
pwd
)"
path=`pwd`
echo $project_path
cd $project_path/runtime/bin
export SLEDGE_SCHEDULER=SRSF
#export SLEDGE_DISABLE_PREEMPTION=true
export SLEDGE_SANDBOX_PERF_LOG=$path/srsf.log
export LD_LIBRARY_PATH="$(pwd):$LD_LIBRARY_PATH"
gdb --eval-command="handle SIGUSR1 nostop" \
--eval-command="set pagination off" \
--eval-command="set substitute-path /sledge/runtime $project_path/runtime" \
--eval-command="run ../tests/test_multiple_image_processing2.json" \
./sledgert

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

@ -0,0 +1,11 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int
main(int argc, char **argv)
{
printf("S\n");
return 0;
}

@ -0,0 +1,44 @@
#ifndef GET_TIME_H
#define GET_TIME_H
#include <time.h>
#include <sys/time.h>
#include <stdio.h>
#ifndef WASM
#ifndef CPU_FREQ
#define CPU_FREQ 1000
#endif
#endif
static unsigned long long
get_time()
{
#if 0
unsigned long long int ret = 0;
unsigned int cycles_lo;
unsigned int cycles_hi;
__asm__ volatile ("rdtsc" : "=a" (cycles_lo), "=d" (cycles_hi));
ret = (unsigned long long int)cycles_hi << 32 | cycles_lo;
return ret;
#else
struct timeval Tp;
int stat;
stat = gettimeofday(&Tp, NULL);
if (stat != 0) printf("Error return from gettimeofday: %d", stat);
return (Tp.tv_sec * 1000000 + Tp.tv_usec);
#endif
}
static inline void
print_time(unsigned long long s, unsigned long long e)
{
#if 0
printf("%llu cycs, %llu us\n", e - s, (e - s) / CPU_FREQ);
#else
fprintf(stdout, "%llu us\n", e - s);
#endif
}
#endif /* GET_TIME_H */

@ -0,0 +1,178 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// #include "get_time.h"
volatile unsigned long g_v = 0;
unsigned long int
/*fib(unsigned long int n)
{
if (n <= 1) return n;
return fib(n + g_v - 1) + fib(n + g_v - 2);
}*/
fib(unsigned long int n)
{
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
}
//int
//main(int argc, char **argv)
//{
// char * array = NULL;
// unsigned long n = 0, r;
// scanf("%lu", &n);
// unsigned long long st = get_time(), en;
// r = fib(n);
// en = get_time();
/*switch(n) {
case 0: {
array = malloc(4 * 1024);
memset(array, 'a', 4 * 1024 - 1);
array[4 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
case 1: {
array = malloc(100 * 1024);
memset(array, 'b', 100 * 1024 - 1);
array[100 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
case 2: {
array = malloc(200 * 1024);
memset(array, 'g', 200 * 1024 - 1);
array[200 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
case 4: {
array = malloc(400 * 1024);
memset(array, 'c', 400 * 1024 - 1);
array[400 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
case 6: {
array = malloc(600 * 1024);
memset(array, 'd', 600 * 1024 - 1);
array[600 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
case 8: {
array = malloc(800 * 1024);
memset(array, 'e', 800 * 1024 - 1);
array[800 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
case 10:{
array = malloc(1000 * 1024);
memset(array, 'f', 1000 * 1024 - 1);
array[1000 * 1024 - 1] = 0;
printf("%s\n", array);
break;
}
default: printf("error input of n\n");
}
free(array);*/
//printf("%lu\n", n);
// printf("%lu\n", n+1);
// printf("%lu\n", r);
//return 0;
//}
main(int argc, char **argv)
{
unsigned long n = 0, r;
scanf("%lu", &n);
FILE *f = stdout;
// unsigned long long st = get_time(), en;
//r = fib(29);
// en = get_time();
switch(n) {
case 0: {
char array[4 * 1024] = {0};
memset(array, 'a', 4 * 1024);
array[4 * 1024 - 1] = 0;
//printf("%s\n", array);
fwrite(array, 1, 4 * 1024 - 1, f);
break;
}
case 1: {
char array[100 * 1024] = {'b'};
memset(array, 'b', 100 * 1024);
array[100 * 1024 - 1] = 0;
//printf("%s\n", array);
fwrite(array, 1, 100 * 1024 - 1, f);
break;
}
case 2: {
char array[200 * 1024] = {'c'};
memset(array, 'c', 200 * 1024);
array[200 * 1024 - 1] = 0;
fwrite(array, 1, 200 * 1024 - 1, f);
//printf("%s\n", array);
break;
}
case 4: {
char array[400 * 1024] = {'d'};
memset(array, 'd', 400 * 1024);
array[400 * 1024 - 1] = 0;
fwrite(array, 1, 400 * 1024 - 1, f);
//printf("%s\n", array);
break;
}
case 6: {
char array[600 * 1024] = {'e'};
memset(array, 'e', 600 * 1024);
array[600 * 1024 - 1] = 0;
fwrite(array, 1, 600 * 1024 - 1, f);
//printf("%s\n", array);
break;
}
case 8: {
char array[800 * 1024] = {'f'};
memset(array, 'f', 800 * 1024);
array[800 * 1024 - 1] = 0;
fwrite(array, 1, 800 * 1024 - 1, f);
//printf("%s\n", array);
break;
}
case 10:{
char array[1000 * 1024] = {'g'};
memset(array, 'g', 1000 * 1024);
array[1000 * 1024 - 1] = 0;
fwrite(array, 1, 1000 * 1024 - 1, f);
//printf("%s\n", array);
break;
}
default: printf("error input of n\n");
}
fclose(f);
//printf("%lu\n", n);
//printf("%lu\n", r);
return 0;
}

@ -0,0 +1,32 @@
#!/bin/sh
ITERS=$3
# before running this benchmark,
# copy fibonacci to fibonacci_native.out
testeach() {
tmp_cnt=${ITERS}
exe_relpath=$1
echo "${exe_relpath} ($2) for ${tmp_cnt}"
while [ ${tmp_cnt} -gt 0 ]; do
bench=$(echo $2 | $exe_relpath 2> /dev/null)
tmp_cnt=$((tmp_cnt - 1))
echo "$bench"
done
echo "Done!"
}
MAXNUM=$2
tmp1_cnt=${MAXNUM}
while [ ${tmp1_cnt} -gt 28 ]; do
testeach ./fibonacci_$1.out ${tmp1_cnt}
tmp1_cnt=$((tmp1_cnt - 1))
done
echo "All done!"

@ -0,0 +1,44 @@
#ifndef GET_TIME_H
#define GET_TIME_H
#include <time.h>
#include <sys/time.h>
#include <stdio.h>
#ifndef WASM
#ifndef CPU_FREQ
#define CPU_FREQ 1000
#endif
#endif
static unsigned long long
get_time()
{
#if 0
unsigned long long int ret = 0;
unsigned int cycles_lo;
unsigned int cycles_hi;
__asm__ volatile ("rdtsc" : "=a" (cycles_lo), "=d" (cycles_hi));
ret = (unsigned long long int)cycles_hi << 32 | cycles_lo;
return ret;
#else
struct timeval Tp;
int stat;
stat = gettimeofday(&Tp, NULL);
if (stat != 0) printf("Error return from gettimeofday: %d", stat);
return (Tp.tv_sec * 1000000 + Tp.tv_usec);
#endif
}
static inline void
print_time(unsigned long long s, unsigned long long e)
{
#if 0
printf("%llu cycs, %llu us\n", e - s, (e - s) / CPU_FREQ);
#else
fprintf(stdout, "%llu us\n", e - s);
#endif
}
#endif /* GET_TIME_H */

@ -0,0 +1,40 @@
#include <stdio.h>
#include <stdlib.h>
// #include "get_time.h"
unsigned long int
fib(unsigned long int n)
{
if (n <= 1) return n;
return fib(n - 1) + fib(n - 2);
}
/*
int
main(int argc, char **argv)
{
unsigned long r = 0;
//scanf("%s", recv_buf);
r = fib(30);
printf("%lu\n", r);
return 0;
}*/
int
main(int argc, char **argv)
{
//char * recv_buf = malloc(1024 * 1024);
char recv_buf[1024 * 1024] = {0};
//memset(recv_buf, 0, 1024 * 1024);
unsigned long r = 0;
//scanf("%s", recv_buf);
r = read(0, recv_buf, 1024 * 1024);
//size_t rd = read(0, recv_buf, 1000*1024);
//if (rd <= 0) return -1;
// unsigned long long st = get_time(), en;
//r = fib(30);
// en = get_time();
printf("%lu\n", r);
// print_time(st, en);
return 0;
}

@ -0,0 +1,32 @@
#!/bin/sh
ITERS=$3
# before running this benchmark,
# copy fibonacci to fibonacci_native.out
testeach() {
tmp_cnt=${ITERS}
exe_relpath=$1
echo "${exe_relpath} ($2) for ${tmp_cnt}"
while [ ${tmp_cnt} -gt 0 ]; do
bench=$(echo $2 | $exe_relpath 2> /dev/null)
tmp_cnt=$((tmp_cnt - 1))
echo "$bench"
done
echo "Done!"
}
MAXNUM=$2
tmp1_cnt=${MAXNUM}
while [ ${tmp1_cnt} -gt 28 ]; do
testeach ./fibonacci_$1.out ${tmp1_cnt}
tmp1_cnt=$((tmp1_cnt - 1))
done
echo "All done!"

@ -0,0 +1,120 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/uio.h>
#define BUF_MAX 44
#define RDWR_MAX 1
#if RDWR_MAX > 1
int
main(int argc, char **argv) __attribute__((optnone))
{
char buf[RDWR_MAX][BUF_MAX] = { 0 };
printf("%s enter [in:%s, out:%s]\n", argv[0], argv[1], argv[2]);
int fdr = open(argv[1], O_RDONLY, S_IRUSR | S_IRGRP);
if (fdr < 0) {
perror("fopen");
return -1;
}
int fdw = creat(argv[2], S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
if (fdw < 0) {
perror("creat");
return -1;
}
int n = 0;
struct iovec iov[RDWR_MAX] = { 0 };
for (int i = 0; i < RDWR_MAX; i++) {
iov[i].iov_base = buf[i];
iov[i].iov_len = BUF_MAX;
}
while ((n = readv(fdr, iov, RDWR_MAX)) > 0) {
int wvcnt = n / BUF_MAX;
if (n % BUF_MAX) {
iov[wvcnt].iov_len = n % BUF_MAX;
wvcnt++;
}
if (writev(fdw, iov, wvcnt) != n) perror("writev");
memset(buf, 0, RDWR_MAX * BUF_MAX);
for (int i = 0; i < RDWR_MAX; i++) {
iov[i].iov_base = buf[i];
iov[i].iov_len = BUF_MAX;
}
n = 0;
}
close(fdr);
close(fdw);
printf("%s done\n", argv[0]);
return 0;
}
#else
int
main(int argc, char **argv) __attribute__((optnone))
{
char buf[BUF_MAX] = { 0 };
printf("%s enter [in:%s, out:%s]\n", argv[0], argv[1], argv[2]);
#ifdef USE_OPEN
int fdr = open(argv[1], O_RDONLY, S_IRUSR | S_IRGRP);
if (fdr < 0) {
perror("fopen");
return -1;
}
int fdw = creat(argv[2], S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
if (fdw < 0) {
perror("creat");
return -1;
}
int n = 0;
while ((n = read(fdr, buf, BUF_MAX)) > 0) {
if (write(fdw, buf, n) != n) perror("write");
memset(buf, 0, BUF_MAX);
n = 0;
}
if (n < 0) perror("read");
close(fdr);
close(fdw);
#else
FILE *fpr = fopen(argv[1], "r");
if (!fpr) {
perror("fopen");
return -1;
}
FILE *fpw = fopen(argv[2], "w");
if (!fpw) {
perror("fopen");
return -1;
}
while (!feof(fpr)) {
char *p = NULL;
if ((p = fgets(buf, BUF_MAX, fpr)) == NULL)
perror("fgets");
else {
if (fputs(p, fpw) < 0) perror("fputs");
p = NULL;
}
memset(buf, 0, BUF_MAX);
}
fclose(fpr);
fclose(fpw);
#endif
printf("%s done\n", argv[0]);
return 0;
}
#endif

@ -0,0 +1,27 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define ITERS 50000000
int
main(int argc, char **argv) __attribute__((optnone))
{
printf("%s enter\n", argv[0]);
int n = 0, e = 1;
if (argc == 2) {
n = atoi(argv[1]);
if (n > 0) e = 0;
}
while (e || n > 0) {
int i = ITERS;
n--;
while (i-- > 0) {
int j = ITERS;
while (j-- > 0) __asm__ __volatile__("nop" : : : "memory");
}
printf("%s\n", argv[0]);
}
printf("%s done\n", argv[0]);
}

@ -0,0 +1,101 @@
#!/bin/bash
function usage {
echo "$0 [loop count]"
exit 1
}
if [ $# != 1 ] ; then
usage
exit 1;
fi
json_file="test_multiple_image_processing4.json"
rm -rf $json_file
touch $json_file
base_exec_time=(39287 96381 8173 23912)
base_port=10000
base_m_index=1
func1_base_name="resize"
func2_base_name="png2bmp"
func3_base_name="cifar10_"
loop_count=$1
for ((i=1; i <=$loop_count; i++))
do
for ((j=1; j <=4; j++))
do
#new_deadline=$((${base_exec_time[$j-1]} * ($i+1)))
new_deadline=$((${base_exec_time[$j-1]} * (2**$i)))
#new_deadline=$((${base_exec_time[$j-1]} * 4))
func1_new_name=$func1_base_name$base_m_index
func1_new_port=$base_port
base_port=$(($base_port + 1))
cat >> $json_file << EOF
{
"active": true,
"name": "$func1_new_name",
"path": "resize_wasm.so",
"port": $func1_new_port,
"relative-deadline-us": $new_deadline,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/jpeg",
"http-req-size": 1024000,
"http-resp-headers": [],
"http-resp-size": 1024000,
"http-resp-content-type": "image/png"
},
EOF
func2_new_name=$func2_base_name$base_m_index
func2_new_port=$base_port
base_port=$(($base_port + 1))
cat >> $json_file << EOF
{
"active": true,
"name": "$func2_new_name",
"path": "C-Image-Manip_wasm.so",
"port": $func2_new_port,
"relative-deadline-us": $new_deadline,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/png",
"http-req-size": 4096000,
"http-resp-headers": [],
"http-resp-size": 4096000,
"http-resp-content-type": "image/bmp"
},
EOF
func3_new_name=$func3_base_name$base_m_index
func3_new_port=$base_port
base_port=$(($base_port + 1))
cat >> $json_file << EOF
{
"active": true,
"name": "$func3_new_name",
"path": "cifar10_wasm.so",
"port": $func3_new_port,
"relative-deadline-us": $new_deadline,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/bmp",
"http-req-size": 4096000,
"http-resp-headers": [],
"http-resp-size": 1024,
"http-resp-content-type": "text/plain",
"tail-module": true
},
EOF
echo "$func1_new_name, $func1_new_port, $func2_new_name, $func2_new_port, $func3_new_name, $func3_new_port, $new_deadline"
base_m_index=$(($base_m_index + 1))
done
done

@ -0,0 +1,104 @@
#!/bin/bash
function usage {
echo "$0 [loop count]"
exit 1
}
if [ $# != 1 ] ; then
usage
exit 1;
fi
json_file="test_multiple_image_processing4.json"
rm -rf $json_file
touch $json_file
base_exec_time=(39287 96381 8173 23912)
base_port=10000
base_m_index=1
func1_base_name="resize"
func2_base_name="png2bmp"
func3_base_name="cifar10_"
deadline_times=(2 10)
loop_count=$1
for ((i=0; i <$loop_count; i++))
do
for ((j=1; j <=4; j++))
do
#new_deadline=$((${base_exec_time[$j-1]} * ($i+1)))
#new_deadline=$((${base_exec_time[$j-1]} * (2**$i)))
#new_deadline=$((${base_exec_time[$j-1]} * (2**($i*2 + 1))))
#new_deadline=$((${base_exec_time[$j-1]} * 4))
new_deadline=$((${base_exec_time[$j-1]} * ${deadline_times[$i]}))
func1_new_name=$func1_base_name$base_m_index
func1_new_port=$base_port
base_port=$(($base_port + 1))
cat >> $json_file << EOF
{
"active": true,
"name": "$func1_new_name",
"path": "resize_wasm.so",
"port": $func1_new_port,
"relative-deadline-us": $new_deadline,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/jpeg",
"http-req-size": 1024000,
"http-resp-headers": [],
"http-resp-size": 1024000,
"http-resp-content-type": "image/png"
},
EOF
func2_new_name=$func2_base_name$base_m_index
func2_new_port=$base_port
base_port=$(($base_port + 1))
cat >> $json_file << EOF
{
"active": true,
"name": "$func2_new_name",
"path": "C-Image-Manip_wasm.so",
"port": $func2_new_port,
"relative-deadline-us": $new_deadline,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/png",
"http-req-size": 4096000,
"http-resp-headers": [],
"http-resp-size": 4096000,
"http-resp-content-type": "image/bmp"
},
EOF
func3_new_name=$func3_base_name$base_m_index
func3_new_port=$base_port
base_port=$(($base_port + 1))
cat >> $json_file << EOF
{
"active": true,
"name": "$func3_new_name",
"path": "cifar10_wasm.so",
"port": $func3_new_port,
"relative-deadline-us": $new_deadline,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/bmp",
"http-req-size": 4096000,
"http-resp-headers": [],
"http-resp-size": 1024,
"http-resp-content-type": "text/plain",
"tail-module": true
},
EOF
echo "$func1_new_name, $func1_new_port, $func2_new_name, $func2_new_port, $func3_new_name, $func3_new_port, $new_deadline"
base_m_index=$(($base_m_index + 1))
done
done

@ -0,0 +1,107 @@
#!/bin/bash
function usage {
echo "$0 [loop count]"
exit 1
}
if [ $# != 1 ] ; then
usage
exit 1;
fi
json_file="test_multiple_image_processing5.json"
rm -rf $json_file
touch $json_file
base_exec_time=(39287 96381 8173 23912)
base_port=10000
base_m_index=1
func1_base_name="resize"
func2_base_name="png2bmp"
func3_base_name="cifar10_"
deadline_times=(2 10)
loop_count=$1
for ((i=0; i <$loop_count; i++))
do
for ((j=1; j <=4; j++))
do
#new_deadline=$((${base_exec_time[$j-1]} * ($i+1)))
#new_deadline=$((${base_exec_time[$j-1]} * (2**$i)))
#new_deadline=$((${base_exec_time[$j-1]} * 4))
#new_deadline=$((${base_exec_time[$j-1]} * (2**($i*2 + 1))))
new_deadline=$((${base_exec_time[$j-1]} * ${deadline_times[$i]}))
func1_new_name=$func1_base_name$base_m_index
func1_new_port=$base_port
base_port=$(($base_port + 1))
cat >> $json_file << EOF
{
"active": true,
"name": "$func1_new_name",
"path": "resize_wasm.so",
"port": $func1_new_port,
"relative-deadline-us": $new_deadline,
"argsize": 1,
"admissions-percentile": 80,
"http-req-headers": [],
"http-req-content-type": "image/jpeg",
"http-req-size": 1024000,
"http-resp-headers": [],
"http-resp-size": 1024000,
"http-resp-content-type": "image/png"
},
EOF
func2_new_name=$func2_base_name$base_m_index
func2_new_port=$base_port
base_port=$(($base_port + 1))
cat >> $json_file << EOF
{
"active": true,
"name": "$func2_new_name",
"path": "C-Image-Manip_wasm.so",
"port": $func2_new_port,
"relative-deadline-us": $new_deadline,
"argsize": 1,
"admissions-percentile": 80,
"http-req-headers": [],
"http-req-content-type": "image/png",
"http-req-size": 4096000,
"http-resp-headers": [],
"http-resp-size": 4096000,
"http-resp-content-type": "image/bmp"
},
EOF
func3_new_name=$func3_base_name$base_m_index
func3_new_port=$base_port
base_port=$(($base_port + 1))
cat >> $json_file << EOF
{
"active": true,
"name": "$func3_new_name",
"path": "cifar10_wasm.so",
"port": $func3_new_port,
"relative-deadline-us": $new_deadline,
"argsize": 1,
"admissions-percentile": 80,
"http-req-headers": [],
"http-req-content-type": "image/bmp",
"http-req-size": 4096000,
"http-resp-headers": [],
"http-resp-size": 1024,
"http-resp-content-type": "text/plain",
"tail-module": true
},
EOF
echo "$func1_new_name, $func1_new_port, $func2_new_name, $func2_new_port, $func3_new_name, $func3_new_port, $new_deadline"
base_m_index=$(($base_m_index + 1))
done
done

@ -0,0 +1,102 @@
#!/bin/bash
function usage {
echo "$0 [func name index] [loop count]"
exit 1
}
if [ $# != 2 ] ; then
usage
exit 1;
fi
func_name_index=$1
func_name="w"$func_name_index
json_file="test_multiple_image_processing_single.json"
rm -rf $json_file
touch $json_file
base_exec_time=(49444 124753 10799 29602)
base_port=$((10000 + ($func_name_index - 1)*3))
base_m_index=1
func1_base_name="resize"
func2_base_name="png2bmp"
func3_base_name="cifar10_"
loop_count=$1
for ((i=1; i <=$loop_count; i++))
do
for ((j=1; j <=1; j++))
do
new_deadline=$((${base_exec_time[$j-1]} * ($i+1)))
func1_new_name=$func1_base_name$func_name_index
func1_new_port=$base_port
base_port=$(($base_port + 1))
cat >> $json_file << EOF
{
"active": true,
"name": "$func1_new_name",
"path": "resize_wasm.so",
"port": $func1_new_port,
"relative-deadline-us": $new_deadline,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/jpeg",
"http-req-size": 1024000,
"http-resp-headers": [],
"http-resp-size": 1024000,
"http-resp-content-type": "image/png"
},
EOF
func2_new_name=$func2_base_name$func_name_index
func2_new_port=$base_port
base_port=$(($base_port + 1))
cat >> $json_file << EOF
{
"active": true,
"name": "$func2_new_name",
"path": "C-Image-Manip_wasm.so",
"port": $func2_new_port,
"relative-deadline-us": $new_deadline,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/png",
"http-req-size": 4096000,
"http-resp-headers": [],
"http-resp-size": 4096000,
"http-resp-content-type": "image/bmp"
},
EOF
func3_new_name=$func3_base_name$func_name_index
func3_new_port=$base_port
base_port=$(($base_port + 1))
cat >> $json_file << EOF
{
"active": true,
"name": "$func3_new_name",
"path": "cifar10_wasm.so",
"port": $func3_new_port,
"relative-deadline-us": $new_deadline,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/bmp",
"http-req-size": 4096000,
"http-resp-headers": [],
"http-resp-size": 1024,
"http-resp-content-type": "text/plain",
"tail-module": true
},
EOF
echo "$func1_new_name, $func1_new_port, $func2_new_name, $func2_new_port, $func3_new_name, $func3_new_port, $new_deadline"
func_name_index=$(($func_name_index + 4))
done
base_port=$(($base_port + 9))
done

@ -0,0 +1 @@
Subproject commit 0976fd036462264f581a588fa6cfa46718c67716

@ -0,0 +1,33 @@
function usage {
echo "$0 [duration(s)] [concurrency]"
exit 1
}
if [ $# != 2 ] ; then
usage
exit 1;
fi
duration=$1
concurrency=$2
f1="105k_"$concurrency".txt"
echo $f1
f2="305k_"$concurrency".txt"
f3="5k_"$concurrency".txt"
f4="40k_"$concurrency".txt"
./test_8c.sh $f1 $duration $concurrency 105k.jpg 10000 2>&1 &
pid1=$!
./test_8c.sh $f2 $duration $concurrency 305k.jpg 10003 2>&1 &
pid2=$!
./test_8c.sh $f3 $duration $concurrency 5k.jpg 10006 2>&1 &
pid3=$!
./test_8c.sh $f4 $duration $concurrency 40k.jpg 10009 2>&1 &
pid4=$!
wait -f $pid1
wait -f $pid2
wait -f $pid3
wait -f $pid4
printf "[OK]\n"

@ -0,0 +1,14 @@
./test_total_request.sh 105.txt 5000 100 105k.jpg 10000 2>&1 &
pid1=$!
./test_total_request.sh 305.txt 5000 100 305k.jpg 10003 2>&1 &
pid2=$!
./test_total_request.sh 5.txt 5000 100 5k.jpg 10006 2>&1 &
pid3=$!
./test_total_request.sh 40.txt 5000 100 40k.jpg 10009 2>&1 &
pid4=$!
wait -f $pid1
wait -f $pid2
wait -f $pid3
wait -f $pid4
printf "[OK]\n"

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEoQIBAAKCAQEA2bxGJUQa7ywL7I6prE75oA2fE/AfTHTi5KzUEh+LezA/KObP
Aa7FgcWUu/QiwCz/aVMvIeVms7CZuu/QJJ9TEinSdxjHixoNhZvbBgLhweCje2YR
MUl9ynPsaVZwb/DebloVzlweXRkXKLCfx3s+HXDSHMpDgMhbF5AiehxQCXCUrNzE
/e6d217PmX02+VRQPwVWycu5/Mi+mMvlgN/e1XggHDYhvX6t4U0Am5KZ4kqdxXYP
T0x6gXxcLi6Ulb15LNCqbbdbFhfYg+tWlqxqIyTHJO2kSw4VNINxIR0dT5FYbxFV
4DL9msYQ+ePXUUym3LnPix0Bt9EQLPMeewYhYwIBIwKCAQAlU3m9PuALvmhxsg51
T13+LjiHEziQw5ScOuKGw5RBAPTicLXFxjB8pYc2KdoSUNtT4l/Z7M/HCFTeN71I
G1ARvgbSloibgM8eN/mpQlKWQ8RBCi7VP8xr2Vu6SVUagRAwLLNH8ojcwnj/qT/2
T6Q/j679nwRB9nYEChSJ9jmbN437tvrLSE1ZxvUIzV96Sd9aGaOjg4Ezyb7KqGSR
0pFKiufTAoAtUcpQ/hYrQ88KFgbFFNm4yRz0dfNpOekdio/IXs2WZ8688k8aZ1OS
DDmFiMLyHxZmp6s5d2pJsLQBIGGWMqxm7a2xeJHY6oLc3DVIRfoJqkFDNWXLlPyR
eBAbAoGBAPPvG4koPGbJ7MoJF6DXTg8bjdXDCPhKL5JoU7y/OX7vKdYLX69RYxs+
ubILTM/7TTC33nEhqty+GWVVOkwOlap99vmWp2hhrjelLYPJmUsQ7aMWUM2Fsxcw
S/NH8RUeaM0F1QqwJEDbdvKjOrgteVQmtPaFo8LFHKmyHF1PsrQ/AoGBAOSBay+J
Nx6FvsWHt5PYrKpAjJvM7lAEgFM89zNvBLsIzqxsnTFjvnZ0ySKT5OeBfPA6nf13
tx+GsurzIniwKjKeBgGUXRIQ5CjEuGtOdnox7rLfkiluiOyKVDyApUN/66d9FLLX
pEeJZSDlUSPGJBvlwfvNGBeVUj9XRv/awbndAoGAfXOnwuF+Jjv2HsLY86HtoV6g
txPYujTIAicGflO3K1ZtSYIxNZeSDgMAajGyeZcvAxy7iqOZs1pzdfFRLm3mkjIn
Pof+UvBoOd/rhZrhH0qI14fRyMhqu3fsi76ZPg+jnKPp6D1UeSBpDxIeMtWO2tIT
7H8+RukHbTcHRe55KX8CgYEAlikpLd3Tw5m34OQoLfTJPK4TQc/Pzi7X/C9gniRi
McP1h0APhtslY8kWdc7m4UZ2rH5KkJ8gkQ9fobW3kSNO7hASk1LeEy+r4EbCVSTu
xVQDQlhnXQ4fdt6PIHHLsAOa28c5fNbZq1pJxSj6zl2isz82VQMedeXIVYJ/HSla
u/cCgYAMNf9At68UjxBECLQOxfLU2GtJBQMP1r3QJzz6/PJqctgJZWzDL/SIg24F
hp6cEaaCiUYV158IShdeTUZpai7UNooQ9wijDYYcodXE/9HnNGgVjP+YqvpnizGx
yFiYiEcowoetWDVOkDzGHDVAtHdwlWBc4D4frJ5kNipMlEEw5Q==
-----END RSA PRIVATE KEY-----

@ -0,0 +1,6 @@
#!/bin/bash
pid=`ps -ef|grep "sledgert"|grep -v grep |awk '{print $2}'`
echo $pid
sudo kill -2 $pid

@ -0,0 +1,378 @@
import sys
import json
from collections import defaultdict
import numpy as np
def def_list_value():
return [0, 0, 0, 0, 0]
def def_value():
return 0
def count_miss_or_meet_deadline_requests(file_dir, percentage):
### each time for a request
request_times_dict = defaultdict(def_list_value)
#### get execution time
running_time_dict = defaultdict(def_value)
queuing_times_dict = defaultdict(def_value)
total_times_dict = defaultdict(def_value)
runnable_times_dict = defaultdict(def_value)
blocked_times_dict = defaultdict(def_value)
initializing_times_dict = defaultdict(def_value)
execution_times_dict = defaultdict(def_value)
### init overhead
### queuelength
queuelength_dict = defaultdict(list)
###
running_times = defaultdict(list)
queuing_times = defaultdict(list)
total_times = defaultdict(list)
runnable_times = defaultdict(list)
blocked_times = defaultdict(list)
initializing_times = defaultdict(list)
execution_times = defaultdict(list)
####
request_counter = defaultdict(def_value)
total_time_dist = defaultdict(list)
total_workload_dist = defaultdict(def_value)
total_real_time_workload_dist = defaultdict(def_value)
real_time_workload_times_dist = defaultdict(list)
real_time_workload_workloads_dist = defaultdict(list)
real_time_workload_requests_dist = defaultdict(list)
min_time = sys.maxsize
# list[0] is meet deadline number, list[1] is miss deadline number
delays_dict = defaultdict(list)
max_latency_dist = defaultdict(def_value)
total_deadline = 0
miss_deadline_dist = defaultdict(def_value)
meet_deadline_dist = defaultdict(def_value)
meet_deadline = 0
miss_deadline = 0
max_sc = 0
fo = open(file_dir, "r+")
for line in fo:
line = line.strip()
if "meet deadline" in line:
meet_deadline += 1
name = line.split(" ")[8]
request_counter[name] += 1
total_time = int(line.split(" ")[5])
total_time_dist[name].append(total_time)
if total_time > max_latency_dist[name]:
max_latency_dist[name] = total_time
meet_deadline_dist[name] += 1
if "miss deadline" in line:
miss_deadline += 1
name = line.split(" ")[11]
total_time = int(line.split(" ")[8])
if total_time > max_latency_dist[name]:
max_latency_dist[name] = total_time
delay = int(line.split(" ")[4])
func = line.split(" ")[11]
delays_dict[func].append(delay)
request_counter[name] += 1
total_time_dist[name].append(total_time)
miss_deadline_dist[name] += 1
#print("name:", name)
if "scheduling count" in line:
s_c = int(line.split(" ")[3])
if max_sc < s_c:
max_sc = s_c
if "total workload" in line:
thread = line.split(" ")[3]
time = line.split(" ")[1]
if min_time > int(time):
min_time = int(time)
real_time_workload = line.split(" ")[11]
total_workload = int(line.split(" ")[8])
total_real_time_workload = int(line.split(" ")[15])
real_time_request = line.split(" ")[5]
real_time_workload_times_dist[thread].append(int(time))
real_time_workload_workloads_dist[thread].append(int(real_time_workload))
real_time_workload_requests_dist[thread].append(int(real_time_request))
if total_workload_dist[thread] < total_workload:
total_workload_dist[thread] = total_workload
if total_real_time_workload_dist[thread] < total_real_time_workload:
total_real_time_workload_dist[thread] = total_real_time_workload
if "thread id" in line:
part1,queue_len = line.split(":")
thread_id = part1.split(" ")[2]
queuelength_dict[thread_id] = queue_len.split(" ")
### calculate the execution time
if "memory" in line or "total_time" in line or "min" in line or "miss" in line or "meet" in line or "time " in line or "scheduling count" in line or "thread id" in line:
continue
t = line.split(",")
id = t[1] #request id
func_idx = t[2][-9] #function id
if t[2][-10] == "1":
#func_idx = t[2][-10:-9]
func_idx = t[2][-10] + t[2][-9]
joined_key = id + "_" + func_idx
running_time_dict[joined_key] += int(t[9])
queuing_times_dict[joined_key] += int(t[6])
total_times_dict[joined_key] += int(t[5])
runnable_times_dict[joined_key] += int(t[8])
blocked_times_dict[joined_key] += int(t[10])
initializing_times_dict[joined_key] += int(t[7])
### get each time for a request
request_times_dict[id][0] += int(t[6]) # global queuing time
request_times_dict[id][1] += int(t[8]) # local queuing time
request_times_dict[id][2] += int(t[10]) # blocking time
request_times_dict[id][3] += int(t[5]) # total latency
###
miss_deadline_percentage = (miss_deadline * 100) / (miss_deadline + meet_deadline)
print("meet deadline num:", meet_deadline)
print("miss deadline num:", miss_deadline)
print("total num:", meet_deadline + miss_deadline)
print("miss deadline percentage:", miss_deadline_percentage)
print("scheduling counter:", max_sc)
# func_name_dict = {
# "cifar10_1": "105k-2",
# "cifar10_2": "305k-2",
# "cifar10_3": "5k-2",
# "cifar10_4": "545k-2",
# "cifar10_5": "105k-4",
# "cifar10_6": "305k-4",
# "cifar10_7": "5k-4",
# "cifar10_8": "545k-4",
# "cifar10_9": "105k-8",
# "cifar10_10": "305k-8",
# "cifar10_11": "5k-8",
# "cifar10_12": "545k-8",
# "resize": "resize",
# "fibonacci": "fibonacci",
# "resize3": "resize3"
# }
func_name_with_id = {
"1": "105k-2",
"2": "305k-2",
"3": "5k-2",
"4": "40k-2",
"5": "105k-10",
"6": "305k-10",
"7": "5k-10",
"8": "40k-10",
"9": "105k-8",
"10": "305k-8",
"11": "5k-8",
"12": "40k-8",
"noop1" : "noop1",
"noop2" : "noop2",
"noop3" : "noop3",
"noop4" : "noop4",
"noop5" : "noop5"
}
func_name_dict = {
"cifar10_1": "105k-2",
"cifar10_2": "305k-2",
"cifar10_3": "5k-2",
"cifar10_4": "40k-2",
"cifar10_5": "105k-10",
"cifar10_6": "305k-10",
"cifar10_7": "5k-10",
"cifar10_8": "40k-10",
"cifar10_9": "105k-8",
"cifar10_10": "305k-8",
"cifar10_11": "5k-8",
"cifar10_12": "40k-8",
"resize": "resize",
"fibonacci": "fibonacci",
"fibonacci5": "fibonacci5",
"resize3": "resize3",
"noop1" : "noop1",
"noop2" : "noop2",
"noop3" : "noop3",
"noop4" : "noop4",
"noop5" : "noop5"
}
# func_name_dict = {
# "cifar10_1": "105k-2",
# "cifar10_2": "305k-2",
# "cifar10_3": "5k-2",
# "cifar10_4": "40k-2",
# "cifar10_5": "105k-8",
# "cifar10_6": "305k-8",
# "cifar10_7": "5k-8",
# "cifar10_8": "40k-4",
# "cifar10_9": "105k-8",
# "cifar10_10": "305k-8",
# "cifar10_11": "5k-8",
# "cifar10_12": "40k-8",
# "resize": "resize",
# "fibonacci": "fibonacci",
# "resize3": "resize3"
# }
fun_execution_time = {
"cifar10_1": 39786,
"cifar10_2": 98794,
"cifar10_3": 8985,
"cifar10_4": 23826,
"cifar10_5": 39786,
"cifar10_6": 98794,
"cifar10_7": 8985,
"cifar10_8": 23826,
"cifar10_9": 39786,
"cifar10_10": 98794,
"cifar10_11": 8985,
"cifar10_12": 23826,
"fibonacci5": 0,
"fibonacci4": 0,
"noop1" : 0,
"noop2" : 0,
"noop3" : 0,
"noop4" : 0,
"noop5" : 0
}
# func_name_with_id = {
# "1": "105k-2",
# "2": "305k-2",
# "3": "5k-2",
# "4": "40k-2",
# "5": "305k-4",
# "6": "5k-4",
# "7": "105k-8",
# "8": "305k-8",
# "9": "5k-8",
# "10": "305k-8",
# "11": "5k-8",
# "12": "40k-8"
# }
# func_name_with_id = {
# "1": "105k-2",
# "2": "305k-2",
# "3": "5k-2",
# "4": "40k-2",
# "5": "105k-8",
# "6": "305k-8",
# "7": "5k-8",
# "8": "305k-8",
# "9": "5k-8",
# "10": "305k-8",
# "11": "5k-8",
# "12": "40k-8"
# }
### get execution time
for key,value in running_time_dict.items():
func_idx = key.split("_")[1]
running_times[func_idx].append(value)
for key,value in queuing_times_dict.items():
func_idx = key.split("_")[1]
queuing_times[func_idx].append(value)
for key,value in runnable_times_dict.items():
func_idx = key.split("_")[1]
runnable_times[func_idx].append(value)
for key,value in blocked_times_dict.items():
func_idx = key.split("_")[1]
blocked_times[func_idx].append(value)
for key,value in initializing_times_dict.items():
func_idx = key.split("_")[1]
initializing_times[func_idx].append(value)
for key,value in total_times_dict.items():
func_idx = key.split("_")[1]
total_times[func_idx].append(value)
for key,value in request_counter.items():
print(func_name_dict[key], ":", str(value), "proportion:", (100*value)/(meet_deadline + miss_deadline))
for key,value in total_time_dist.items():
a = np.array(value)
p = np.percentile(a, int(percentage))
print(func_name_dict[key] + " " + percentage + " percentage is:" + str(p) + " mean is:" + str(np.mean(value)) + " max latency is:" + str(max_latency_dist[key]))
total_cpu_times = 0
for key,value in meet_deadline_dist.items():
total_cpu_times += value * fun_execution_time[key]
miss_value = miss_deadline_dist[key]
total_request = miss_value + value
miss_rate = (miss_value * 100) / total_request
print(func_name_dict[key] + " miss deadline rate:" + str(miss_rate) + " miss count is:" + str(miss_value) + " total request:" + str(total_request))
print("effective total cpu times:", total_cpu_times)
for key,value in real_time_workload_times_dist.items():
real_time_workload_times_dist[key] = [x - min_time for x in value]
for key,value in running_times.items():
#print("function times:", func_name_with_id[key], np.median(total_times[key]), np.median(running_times[key]), np.median(queuing_times[key]), np.median(runnable_times[key]), np.median(blocked_times[key]), np.median(initializing_times[key]))
print("function times:", func_name_with_id[key], np.median(total_times[key]), np.median(running_times[key]), np.median(queuing_times[key]), np.median(runnable_times[key]), np.median(blocked_times[key]), np.mean(initializing_times[key]))
for key, value in delays_dict.items():
new_value = [i/1000 for i in value]
p99 = np.percentile(new_value, 99)
print("function:", key, " delays:", p99)
total_workload = 0
with open("total_workload.txt", "w") as f:
for key,value in total_workload_dist.items():
total_workload += value
#print("thread " + key + " total workload:" + str(value))
pair = [key + " "]
pair.append(str(value))
f.writelines(pair)
f.write("\n")
print("total workload is:", total_workload)
with open("total_real_time_workload.txt", "w") as f:
for key,value in total_real_time_workload_dist.items():
#print("thread " + key + " total real time workload:" + str(value))
pair = [key + " "]
pair.append(str(value))
f.writelines(pair)
f.write("\n")
js = json.dumps(total_time_dist)
f = open("total_time.txt", 'w')
f.write(js)
f.close()
js2 = json.dumps(real_time_workload_times_dist)
f2 = open("real_workload_times.txt", 'w')
f2.write(js2)
f2.close()
js3 = json.dumps(real_time_workload_workloads_dist)
f3 = open("real_workload_workloads.txt", 'w')
f3.write(js3)
f3.close()
js4 = json.dumps(real_time_workload_requests_dist)
f4 = open("real_workload_requests.txt", 'w')
f4.write(js4)
f4.close()
js5 = json.dumps(running_times)
f5 = open("running_time.txt", 'w')
f5.write(js5)
f5.close()
js6 = json.dumps(total_times)
f6 = open("total_time2.txt", 'w')
f6.write(js6)
f6.close()
js7 = json.dumps(delays_dict)
f7 = open("delays.txt", 'w')
f7.write(js7)
f7.close()
js8 = json.dumps(request_times_dict)
f8 = open("request_time.txt", 'w')
f8.write(js8)
f8.close()
js9 = json.dumps(queuelength_dict)
f9 = open("5m_queuelength.txt", "w")
f9.write(js9)
f9.close()
for key,value in total_time_dist.items():
print(key + ": time list length is ", len(value))
for key,value in queuelength_dict.items():
print("thread id:", key, " queuelength:", len(value))
if __name__ == "__main__":
argv = sys.argv[1:]
if len(argv) < 1:
print("usage ", sys.argv[0], " file dir" " percentage")
sys.exit()
count_miss_or_meet_deadline_requests(argv[0], argv[1])

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@ -0,0 +1,90 @@
{
"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": 1024000,
"http-resp-headers": [],
"http-resp-size": 1024000,
"http-resp-content-type": "image/png"
},
{
"active": true,
"name": "png2bmp",
"path": "C-Image-Manip_wasm.so",
"port": 10001,
"relative-deadline-us": 60000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/png",
"http-req-size": 4096000,
"http-resp-headers": [],
"http-resp-size": 4096000,
"http-resp-content-type": "image/bmp"
},
{
"active": true,
"name": "cifar10",
"path": "cifar10_wasm.so",
"port": 10002,
"relative-deadline-us": 50000,
"argsize": 1,
"http-req-headers": [],
"http-req-content-type": "image/bmp",
"http-req-size": 4096000,
"http-resp-headers": [],
"http-resp-size": 1024,
"http-resp-content-type": "text/plain",
"tail-module": true
},
{
"active": true,
"name": "fibonacci",
"path": "fibonacci_wasm.so",
"port": 10003,
"expected-execution-us": 600,
"relative-deadline-us": 2000,
"argsize": 2,
"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": "fibonacci2",
"path": "fibonacci2_wasm.so",
"port": 10004,
"expected-execution-us": 600,
"relative-deadline-us": 2000,
"argsize": 2,
"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": "fibonacci3",
"path": "fibonacci3_wasm.so",
"port": 10005,
"expected-execution-us": 600,
"relative-deadline-us": 2000,
"argsize": 2,
"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",
"tail-module": true
}

@ -0,0 +1,45 @@
{
"active": true,
"name": "fibonacci",
"path": "fibonacci_wasm.so",
"port": 10000,
"expected-execution-us": 600,
"relative-deadline-us": 2000,
"argsize": 2,
"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": "fibonacci2",
"path": "fibonacci2_wasm.so",
"port": 10001,
"expected-execution-us": 600,
"relative-deadline-us": 2000,
"argsize": 2,
"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": "fibonacci3",
"path": "fibonacci3_wasm.so",
"port": 10002,
"expected-execution-us": 600,
"relative-deadline-us": 2000,
"argsize": 2,
"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"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save