1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0+ 3# 4# Analyze a given results directory for rcuscale scalability measurements. 5# 6# Usage: kvm-recheck-rcuscale.sh resdir 7# 8# Copyright (C) IBM Corporation, 2016 9# 10# Authors: Paul E. McKenney <paulmck@linux.ibm.com> 11 12i="$1" 13if test -d "$i" -a -r "$i" 14then 15 : 16else 17 echo Unreadable results directory: $i 18 exit 1 19fi 20PATH=`pwd`/tools/testing/selftests/rcutorture/bin:$PATH; export PATH 21. functions.sh 22 23if kvm-recheck-rcuscale-ftrace.sh $i 24then 25 # ftrace data was successfully analyzed, call it good! 26 exit 0 27fi 28 29configfile=`echo $i | sed -e 's/^.*\///'` 30 31sed -e 's/^\[[^]]*]//' < $i/console.log | 32awk ' 33/-scale: .* gps: .* batches:/ { 34 ngps = $9; 35 nbatches = 1; 36} 37 38/-scale: .*writer-duration/ { 39 gptimes[++n] = $5 / 1000.; 40 sum += $5 / 1000.; 41} 42 43/rcu_scale: Grace-period kthread CPU time/ { 44 cputime = $6; 45} 46 47END { 48 newNR = asort(gptimes); 49 if (newNR <= 0) { 50 print "No rcuscale records found???" 51 exit; 52 } 53 pct50 = int(newNR * 50 / 100); 54 if (pct50 < 1) 55 pct50 = 1; 56 pct90 = int(newNR * 90 / 100); 57 if (pct90 < 1) 58 pct90 = 1; 59 pct99 = int(newNR * 99 / 100); 60 if (pct99 < 1) 61 pct99 = 1; 62 div = 10 ** int(log(gptimes[pct90]) / log(10) + .5) / 100; 63 print "Histogram bucket size: " div; 64 last = gptimes[1] - 10; 65 count = 0; 66 for (i = 1; i <= newNR; i++) { 67 current = div * int(gptimes[i] / div); 68 if (last == current) { 69 count++; 70 } else { 71 if (count > 0) 72 print last, count; 73 count = 1; 74 last = current; 75 } 76 } 77 if (count > 0) 78 print last, count; 79 print "Average grace-period duration: " sum / newNR " microseconds"; 80 print "Minimum grace-period duration: " gptimes[1]; 81 print "50th percentile grace-period duration: " gptimes[pct50]; 82 print "90th percentile grace-period duration: " gptimes[pct90]; 83 print "99th percentile grace-period duration: " gptimes[pct99]; 84 print "Maximum grace-period duration: " gptimes[newNR]; 85 if (cputime != "") 86 cpustr = " CPU: " cputime; 87 print "Grace periods: " ngps + 0 " Batches: " nbatches + 0 " Ratio: " ngps / nbatches cpustr; 88 print "Computed from rcuscale printk output."; 89}' 90