#!/usr/bin/env bash # Startup performance tests for different formats and startup modes. # Magic line must be first in script (see README.md) s="$_" ; . ./lib.sh || if [ "$s" = $0 ]; then exit 0; else return 0; fi # Number of list/leaf-list entries in file : ${perfnr:=10000} : ${pretty:=false} APPNAME=example cfg=$dir/scaling-conf.xml fyang=$dir/scaling.yang # NOTE, added a deep yang structure (x0,x1,x2) to expose performance due to turned off caching. cat < $fyang module scaling{ yang-version 1.1; namespace "urn:example:clixon"; prefix ip; container "x0" { container x1 { list x2 { key "name"; leaf name { type string; } container x { list y { key "a"; leaf a { type int32; } leaf b { type int32; } } leaf-list c { type string; } } } } } } EOF cat < $cfg $cfg $dir /usr/local/share/clixon $fyang /usr/local/var/$APPNAME/$APPNAME.sock /usr/local/var/example/$APPNAME.pidfile false $dir false example /usr/local/lib/example/cli /usr/local/lib/example/clispec 0 ietf-netconf:startup EOF if [ $BE -ne 0 ]; then new "kill old backend" sudo clixon_backend -zf $cfg -y $fyang if [ $? -ne 0 ]; then err fi fi # First generate large XML file # Use it latter to generate startup-db in xml, tree formats tmpx=$dir/tmp.xml new "generate large startup config ($tmpx) with $perfnr entries" if $pretty; then cat< $tmpx ip EOF for (( i=0; i<$perfnr; i++ )); do echo " " >> $tmpx echo " $i" >> $tmpx echo " $i" >> $tmpx echo " " >> $tmpx done cat<> $tmpx EOF else echo -n "ip" > $tmpx for (( i=0; i<$perfnr; i++ )); do echo -n "$i$i" >> $tmpx done echo "" >> $tmpx fi if false; then # XXX JSON dont work as datastore yet # Then generate large JSON file (cant translate namespace - long story) tmpj=$dir/tmp.json new "generate large startup config ($tmpj) with $perfnr entries" echo -n '{"config": {"scaling:x":{"y":[' > $tmpj for (( i=0; i<$perfnr; i++ )); do if [ $i -ne 0 ]; then echo -n ",{\"a\":$i,\"b\":$i}" >> $tmpj else echo -n "{\"a\":$i,\"b\":$i}" >> $tmpj fi done echo "]}}}" >> $tmpj fi # Loop over mode and format for mode in startup running; do file=$dir/${mode}_db for format in xml; do # json - something w namespaces sudo rm -f $file sudo touch $file sudo chmod 666 $file case $format in xml) echo "cp $tmpx $file" cp $tmpx $file ;; json) cp $tmpj $file ;; esac new "Startup format: $format mode:$mode" echo "time sudo $clixon_backend -F1 -D $DBG -s $mode -f $cfg -y $fyang -o CLICON_XMLDB_FORMAT=$format" # Cannot use start_backend here due to expected error case { time -p sudo $clixon_backend -F1 -D $DBG -s $mode -f $cfg -y $fyang -o CLICON_XMLDB_FORMAT=$format 2> /dev/null; } 2>&1 | awk '/real/ {print $2}' exit done done rm -rf $dir # unset conditional parameters unset perfnr