#!/bin/zsh if [[ ! $1 ]]; then echo "Error: expected one argument (nginx code directory)" exit fi if [[ ! -d $1 ]]; then echo "Error: provided nginx code directory is invalid" exit fi PROFILE_OUTPUT=PROFILE.LOG if [ -f $PROFILE_OUTPUT ]; then mv $PROFILE_OUTPUT $PROFILE_OUTPUT.old fi KACLIENT=nginx-profile-setup-kaclient-1 KAPROXY=nginx-profile-setup-kaproxy-1 echo "Callgrind output info:" >> $PROFILE_OUTPUT echo "Dr: number of memory reads" >> $PROFILE_OUTPUT echo "D1mr: D1 cache read misses" >> $PROFILE_OUTPUT echo "DLmr: LL (last level) cache data read misses" >> $PROFILE_OUTPUT echo "Dw: number of memory writes" >> $PROFILE_OUTPUT echo "D1mw: D1 cache write misses" >> $PROFILE_OUTPUT echo "DLmw: LL (last level) cache data write misses" >> $PROFILE_OUTPUT echo "Ir: number of instructions executed" >> $PROFILE_OUTPUT echo "I1mr: I1 cache read misses" >> $PROFILE_OUTPUT echo "ILmr: LL (last level) cache instruction read misses" >> $PROFILE_OUTPUT echo "\n\n" >> $PROFILE_OUTPUT echo "[+] building and deploying containers" go build keepalive-svc.go mv keepalive-svc kasvc/ rsync -avz $1 kaproxy/ sudo docker-compose up --build -d sudo docker exec -it $KAPROXY callgrind_control -i off sudo docker wait $KACLIENT echo "[+] client finished, triggering reload" sudo docker exec -it $KAPROXY callgrind_control -i on sudo docker kill -s CONT $KAPROXY echo "[+] wait five seconds for reload complete" sleep 5 sudo docker exec -it $KAPROXY callgrind_control -i off echo " > restarting client" sudo docker-compose restart kaclient sudo docker wait $KACLIENT echo "[+] client finished again. Killing NGINX and fetching profile data" sudo docker kill -s INT $KAPROXY sudo docker exec -it $KAPROXY callgrind_control -d echo "[+] building profiling report" sudo docker exec $KAPROXY bash -c "find /tmp -iname \"callgrind.out*\"" | while read file do echo " > processing: " $file F=$(basename $file) sudo docker cp $KAPROXY:$file $F; sudo chmod 777 $F echo "Output file: $F" >> $PROFILE_OUTPUT callgrind_annotate \ --include=kaproxy \ --auto=yes \ $F >> $PROFILE_OUTPUT echo "End of profile: $F\n\n\n" >> $PROFILE_OUTPUT rm -f $F done echo "[+] cleaning up" sudo docker-compose down less $PROFILE_OUTPUT