| #!/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}" |