blob: c997e2fa5a3c8e63eff21d3fe7c2b05675492a80 [file] [log] [blame]
#!/bin/sh
# Copyright 2012 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This isn't the exact copy that will be used in production, but it's better
# than pointing shellcheck at /dev/null.
# shellcheck source=../../scripts/lib/shflags/shflags
. /usr/share/misc/shflags || exit 1
DEFINE_string directory /run/bootstat "Bootstat archive directory" d
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
NCPU="$(grep -c '^processor' /proc/cpuinfo)"
readonly NCPU
# shellcheck disable=SC2016 # We want a literal awk script.
SUMMARIZE_TIME='
BEGIN {
printf "%8s %4s %8s %4s %s\n", "time", "%cpu", "dt", "%dt", "event"
}
{
# input lines are like this:
# $1 = time since boot
# $2 = idle time since boot (normalized for NCPU)
# $3 = event name
# input lines are sorted by $1
uptime = $1 ; idle = $2
cum_util = (200 * (uptime - idle) / uptime + 1) / 2
delta = uptime - prev
if (delta != 0) {
util = (200 * (delta - idle + prev_idle) / delta + 1) / 2
} else {
util = 100
}
printf "%8d %3d%% %8d %3d%% %s\n", uptime, cum_util, delta, util, $3
prev = uptime ; prev_idle = idle
}
'
# If there are no arguments on the command line, summarize all the
# events. If there are arguments, summarize only the named events.
if [ $# -eq 0 ]; then
set -- "${FLAGS_directory}/uptime-"*
else
max=$#
i=0
while [ $((i += 1)) -le "${max}" ]; do
set -- "$@" "${FLAGS_directory}/uptime-$1"
shift
done
fi
max=$#
i=0
# Catch some basic errors so awk doesn't choke.
while [ $((i += 1)) -le "${max}" ]; do
if [ -r "$1" ]; then
set -- "$@" "$1"
else
echo "Error: file $1 is not readable" 1>&2
fi
shift
done
# Pipeline explained:
# 1st awk program: print times as milliseconds and normalize idle time
# by NCPU.
# sort: sort the events by the uptime timestamp.
# sed: remove '/run/bootstat/uptime-' from the event name.
# 2nd awk program: produce the summarized output
awk 'BEGIN{OFMT="%f"}
{print 1000*$1, 1000*$2/'"${NCPU}"', FILENAME}' "$@" |
sort -k 1n | sed 's=[^ ]*uptime-==' | awk "${SUMMARIZE_TIME}"