]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
sysrepo-lua: benchmarking scripts sysrepo-bench
authorVasek Sraier <git@vakabus.cz>
Mon, 27 Apr 2020 17:00:10 +0000 (19:00 +0200)
committerVasek Sraier <git@vakabus.cz>
Mon, 27 Apr 2020 17:09:16 +0000 (19:09 +0200)
bench_sysrepo.sh [new file with mode: 0755]
bench_sysrepo_statistics.sh [new file with mode: 0755]
modules/sysrepo-lua/model.lua

diff --git a/bench_sysrepo.sh b/bench_sysrepo.sh
new file mode 100755 (executable)
index 0000000..59b951c
--- /dev/null
@@ -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
+<kresd_input /tmp/kr/sbin/kresd -a ::@5353 >out.log 2>&1 &
+cat > kresd_input <<END
+os = require("os")
+start = os.clock()
+modules.load("sysrepo-lua")
+elapsed = os.clock() - start
+print("Module loaded in " .. tostring(elapsed) .. " seconds")
+END
+
+# wait for resolver to load data
+while ! grep "Module loaded in" out.log > /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 (executable)
index 0000000..257e62d
--- /dev/null
@@ -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
index 8c4e7954ab33b56288d1c7a8069febe060a91555..947447b048bf7afa8735ca5904d713fc9e9320e9 100644 (file)
@@ -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 ---------------------------------------