From: Vasek Sraier Date: Mon, 27 Apr 2020 17:00:10 +0000 (+0200) Subject: sysrepo-lua: benchmarking scripts X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Fsysrepo-bench;p=thirdparty%2Fknot-resolver.git sysrepo-lua: benchmarking scripts --- diff --git a/bench_sysrepo.sh b/bench_sysrepo.sh new file mode 100755 index 000000000..59b951c8e --- /dev/null +++ b/bench_sysrepo.sh @@ -0,0 +1,107 @@ +#!/bin/bash + +if test -z "$DATA_SIZE"; then + DATA_SIZE=25000 +fi + +if test -z "$(which meson)" || test -z "$(which ninja)" || test -z "$(which sysrepocfg)" || test -z "$(which time)" +then + echo "Missing dependency - these are required:" + echo "meson, ninja, sysrepo, time" + exit 1 +fi + +time="$(which time) -f %U -o /dev/stdout -a" + +# build knot +# rm -rf build_dir /tmp/kr +meson build_dir --prefix=/tmp/kr --default-library=static +ninja -C build_dir +ninja -C build_dir install > /dev/null + +# init sysrepo +git clone https://gitlab.labs.nic.cz/labs/resolvers-yang.git +cd resolvers-yang +git checkout sysrepo-test +cd .. +sysrepoctl -i resolvers-yang/yang-modules/cznic-test-sysrepo.yang + +echo +echo "Generating dataset" +rm input* +python3 resolvers-yang/data_generator.py -n $DATA_SIZE -f input +mv $(eval "echo input*") input.json +echo + +echo +echo "Loading data into sysrepo" +sysrepo_load=$($time sysrepocfg -C input.json) +echo "Elapsed $sysrepo_load" +echo + +echo +SECONDS=0 +echo "Starting Knot Resolver, output file out.log" +rm kresd_input +mkfifo kresd_input +rm out.log +out.log 2>&1 & +cat > kresd_input < /dev/null; do + sleep 1 +done +knot_apply=$(grep "Data loading finished in" out.log | grep -o "[0-9.]* sec" | cut -d" " -f1) +knot_module_load=$(grep "Module loaded in " out.log | grep -o "[0-9.]* sec" | cut -d" " -f1) +knot_startup_whole=$SECONDS +echo "Config application: $knot_apply" +echo "Module load: $knot_module_load" +echo "Whole startup: $knot_startup_whole" +echo + +echo +echo "Requesting data" +sysrepo_get=$($time sysrepocfg --export=/dev/null --format json -d operational -t 30) +echo "Elapsed $sysrepo_get" +echo + +# wait for resolver to complete the serialization +echo +echo "Waiting for kresd to log about serialization" +while ! grep "Data serialization finished" out.log > /dev/null; do + sleep 1 +done +echo "Log of kresd says:" +knot_serialize=$(grep "Data serialization finished" out.log | grep -o "[0-9.]* sec" | cut -f1 -d" ") +echo "Data serialization took $knot_serialize" +echo + +echo +echo "Cleaning up" +echo 'modules.unload("sysrepo-lua")' > kresd_input +echo "quit()" > kresd_input +sleep 1 +killall -SIGKILL kresd +sysrepoctl -u cznic-test-sysrepo +rm -rf /tmp/kr input.json kresd_input +rm -rf /dev/shm/sr* + +echo "If the script gets stuck next time its run, please delete repository of sysrepo" +echo "Output of the resolver left in a file out.log" + +if test -z "$1"; then + statfile="/dev/stdout" +else + statfile="$1" +fi + +echo +echo "$DATA_SIZE;$sysrepo_load;$sysrepo_get;$knot_apply;$knot_serialize;$knot_module_load;$knot_startup_whole" >> $statfile + diff --git a/bench_sysrepo_statistics.sh b/bench_sysrepo_statistics.sh new file mode 100755 index 000000000..257e62d52 --- /dev/null +++ b/bench_sysrepo_statistics.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +SAMPLES_PER_SIZE=2 +SIZES=$(seq 500 500 50000) + +echo "DATA_SIZE;sysrepo_load;sysrepo_get;knot_apply;knot_serialize;knot_module_load;knot_startup_whole" > stat.csv + +# DATA_SIZE - počet položek v datasetu +# sysrepo_load - jak dlouho trvalo načíst data do sysrepa ze souboru pomocí programu sysrepocfg +# sysrepo_get - jak dlouho trvalo získat data z operational datastoru programem sysrepocfg +# knot_apply - jak dlouho trval v resolveru callback zpracovavajici data +# knot_serialize - jak dlouho trval callback v resolveru serializujici data +# knot_module_load - jak dlouho trvalo volani modules.load("sysrepo-lua"). Obsahuje knot_apply +# knot_startup_whole - jak dlouho trvalo nastartovat resolver, pouze cele sekundy, melo by byt stejne jako knot_module_load + +for size in $SIZES; do + for i in $(seq $SAMPLES_PER_SIZE); do + DATA_SIZE="$size" ./bench_sysrepo.sh stat.csv + done +done diff --git a/modules/sysrepo-lua/model.lua b/modules/sysrepo-lua/model.lua index 8c4e7954a..947447b04 100644 --- a/modules/sysrepo-lua/model.lua +++ b/modules/sysrepo-lua/model.lua @@ -145,7 +145,7 @@ end local Hook = {} Hook.__index = Hook -function Hook:create(apply_pre, apply_post) +function Hook:create(apply_pre, apply_post, serialize_pre, serialize_post) assert(apply_pre == nil or type(apply_pre) == "function") assert(apply_post == nil or type(apply_post) == "function") @@ -154,6 +154,8 @@ function Hook:create(apply_pre, apply_post) res.apply_pre = apply_pre res.apply_post = apply_post + res.serialize_pre = serialize_pre + res.serialize_post = serialize_post return res end @@ -166,6 +168,14 @@ function Hook:apply_post(self) -- empty default end +function Hook:serialize_pre(self) + -- empty default +end + +function Hook:serialize_post(self) + -- empty default +end + local EMPTY_HOOK = Hook:create() @@ -324,6 +334,8 @@ local function ContainerNode(name, container_model, hooks) --- Node's serialize function local function handle_cont_write(self, parent_node) + hooks:serialize_pre() + local cont = clib().node_new_container(parent_node, self.module, self.name) for _,v in ipairs(container_model) do @@ -348,6 +360,8 @@ local function ContainerNode(name, container_model, hooks) end end + hooks:serialize_post() + return cont end @@ -664,8 +678,17 @@ end local function post_load() local elapsed_cpu_time = os.clock() - start_time - debug.log("[BENCH] Data loading finished in {} sec (cpu time), the dataset follows", elapsed_cpu_time) - -- debug.dump_table(items) + debug.log("[BENCH] Data loading finished in {} sec (cpu time). There are {} items", elapsed_cpu_time, #items) +end + +local function pre_serialize() + start_time = os.clock() +end + +local function post_serialize() + local elapsed_cpu_time = os.clock() - start_time + + debug.log("[BENCH] Data serialization finished in {} sec (cpu time). There are {} items", elapsed_cpu_time, #items) end local function ItemNodeFactory(name) @@ -689,7 +712,7 @@ end local model = ContainerNode("tests", { ListChild(get_items, ItemNodeFactory, "items") - }, Hook:create(pre_load, post_load)) + }, Hook:create(pre_load, post_load, pre_serialize, post_serialize)) ------------------------------------------------------------------------------- ------------------------ Module Exports ---------------------------------------