--- /dev/null
+#!/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
+
--- /dev/null
+#!/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
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")
res.apply_pre = apply_pre
res.apply_post = apply_post
+ res.serialize_pre = serialize_pre
+ res.serialize_post = serialize_post
return res
end
-- empty default
end
+function Hook:serialize_pre(self)
+ -- empty default
+end
+
+function Hook:serialize_post(self)
+ -- empty default
+end
+
local EMPTY_HOOK = Hook:create()
--- 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
end
end
+ hooks:serialize_post()
+
return cont
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)
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 ---------------------------------------