An experiment in terminal-based heat maps. For example, witness the majesty of this mpstat(1) display of a 16-CPU zone in the JPC:
This version accepts input on stdin
of the form ...
10 8 6 6 3 3 4 4 3 4 2 3 4 5 3 5
46 2 6 6 4 1 57 2 10 0 3 2 3 8 3 12
97 3 6 8 5 1 2 4 0 11 1 1 4 2 11 4
... where each line is some number whitespace-separated integers between 0 and 100. The integers will be split up into buckets and the count of integers in each bucket determines that bucket's intensity in the heatmap.
The most natural usage is to take input from mpstat(1) and spit out
CPU Usage figures for all CPUs, once per second, using the provided
formatters/mpstat
script. For example:
ssh someserver mpstat 1 | ./formatters/mpstat | ./heatmap
You can decide the Y-axis for the heat map with a few options.
The default distribution of values between buckets is linear, with a minimum value of 0 and a maximum of 100. This is equivalent to:
someprogram | ./heatmap -l -m 0 -M 100
In a similar fashion to DTrace's llquantize() you can specify a log distribution with linear buckets within each order of magnitude. For instance: if I/O Latency is expressed in microseconds, it may be useful to draw a heatmap with a base of 10, from the second up to the sixth order of magnitude. i.e.
iolatency.d | ./someformatter | ./heatmap -L -b 10 -m 2 -M 6
Example output from iolatency.d during a ZFS pool scrub:
In the most recent C-based version I have used a Rank-based Colouring, as described in this blog post by Dave Pacheco.
If the darkest shades are not visible in your terminal, you can skip some
number of shades from the dark end of the spectrum with the -G
flag.