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