topline - a disk/per-core CPU grapher/logger
topline [ -l ] [ -i 1.0 ] [ -o logfile
] [ program arg1 arg2 ... ]
While programs like htop can show per-core loads, they do
so interactively. There are loggers like dstat but, using numeric
data, they have no chance to fit per-CPU information within a line on modern
many-core processors. Thus, topline uses Unicode graphing symbols to
squash the data into a terse, two-hyperthreads-per-char, form. This allows
eyeballing NUMA separation, CPU hopping, etc.
Once per second, topline plots stats for that interval:
- per every disk,
- one character with two columns of dots gives that disk's utilization time
percentage. The left column shows reads, the right one shows writes. Disks
are grouped into parenthesised groups by interface type (NVMe, SATA, eMMC,
...).
- per every non-hyperthreaded
CPU or a pair of hyperthreaded siblings,
- a character with one or two columns is given. Non-HT CPUS are drawn with
bars, HT ones with dots, offline cores are marked with 'o'. The
parentheses group CPUs by their NUMA node.
- <program> <arg1> <arg2> ...
- Runs a program and terminates the graph once the program exits. The graph
still exhibits the global state of the system rather than just the program
you chose and its children.
If no program is given, topline will keep logging forever
(ie, until you press ^C or similar).
- -l, --line-output,
--linearize
- Marshalls the program's output line-by-line, avoiding mix-ups with
topline's data. They will be interspersed in separate lines.
The program will know it is being piped; if you want it to believe it's ran
on a terminal (to get colors, etc) you may use a tool like
pipetty.
- -i
<interval>
- Sets the interval between data samples; the default is 1s. Floating-point
values are allowed; the number may be suffixed by a "s"
(seconds, default), "m" (minutes), "h" (hours),
"d" (days), "ms" (milliseconds), "us" or
"µs" (microseconds).
- -o
<file>, --output
<file>
- Redirects topline's output to the given file. The program being ran
can then use stdout and stderr unimpeded.
If the machine's CPUs are hyperthreaded with more than one or two
per core, the graph won't make it obvious which columns share a core. All
siblings are still given consecutively, unless forced into separate NUMA
nodes with fakenuma settings.
Machines above 140-150 CPUs may not fit on an 80-column
terminal.