blob: 83d2f38d125b1e74d9bfebc6076bcaee5da6fe01 [file] [log] [blame]
#!/bin/bash
#
# Reduce data gathered by cachetorture.sh. Run in the directory where
# you want the files deposited. Or you can place an absolute pathname
# in the tag, I suppose.
#
# Usage: bash reduce.sh [ tag [ cpu ] ] < cachetorture.sh.out
#
# If present, the "tag" will be included in the output filenames,
# for example, <tag>.atomicinc.dat. The output files are
# formatted for use as gnuplot data files. One format for <tag>
# is <system-id>.yyyy.mm.ddA. If "cpu" is given, only the data
# with that CPU as cpu0 will be considered.
#
# Files ending in .sctr.dat are data for scatterplots. Files ending
# in just .dat list average latencies.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, you can access it online at
# http://www.gnu.org/licenses/gpl-2.0.html.
#
# Copyright (C) Facebook, 2020
#
# Authors: Paul E. McKenney <paulmck@kernel.org>
tag="$1"
firstcpu="${2-0}"
# Gather data from each operation into a separate .raw file.
# Each line has the program name, the operation name, the pair of CPUs
# used, the duration, and finally the nanoseconds per operation.
awk -v tag="$tag" -v firstcpu="$firstcpu" '
{
opname = $2;
cpu0 = $4;
if (cpu0 != firstcpu)
next;
cpu1 = $5;
nsperop = $9;
i = opname ":" cpu0 ":" cpu1
# print "Read this: " opname, cpu0, cpu1, nsperop, "idx: " i
fn = tag "." opname ".sctr.raw"
print(cpu0, cpu1, nsperop) > fn
sum[i] += nsperop;
n[i]++;
if (min[i] == "" || min[i] > nsperop)
min[i] = nsperop;
if (max[i] == "" || max[i] < nsperop)
max[i] = nsperop;
}
END {
for (i in n) {
split(i, idx, ":");
opname = idx[1];
cpu0 = idx[2];
cpu1 = idx[3];
fn = tag "." opname ".raw"
# print fn ": " cpu0, cpu1, sum[i] / n[i], min[i], max[i]
print(cpu0, cpu1, sum[i] / n[i], min[i], max[i]) > fn
}
}'
# Extract the read-side data into a .dat file formatted for gnuplot
# (average then minimum then maximum).
for i in `ls $tag.*.raw`
do
bn=`echo $i | sed -e 's/\.raw//'`
sort -k2n < $i |
awk > $bn.dat '{ print $2, $3}'
done