SysMon 3.1.0
SysMon 3.1.0 — can I trust the numbers?
This release started with one question: are these statistics right?
So every number the window shows was put next to the tool a skeptic
would open beside it (free, turbostat, mpstat, sensors, df,
lspci, the firmware's DIMM tables), on real hardware, idle and under
load.
3.0.3 agreed on 34 of 50 checks. 3.1.0 agrees on 56 of 56.
The audit ships with the repo (scripts/accuracy-audit.sh), so you can
run it on your own machine.
What was wrong, and is now right
- The CPU's busy clock read up to 2.1 GHz low. It was one instant
read per core, so a core that was busy for most of the window but
idle at the moment of the read reported its idle clock. It now comes
from the clock each core actually delivered over the window (ACPI
CPPC, the same counters turbostat reads, over the same window):
4 MHz from turbostat idle and 62 MHz under load, where it was
855–1655 MHz off. - GPU clocks were a coin toss. RDNA4's clock moves every few
milliseconds between 0 and boost, and a single read can land anywhere
in that range. It's now the mean across the update window. - "Weird things about RAM." Three totals are now told apart:
installed (your sticks, read from firmware), usable (what the
kernel gets), and reserved (the difference). The subtitle names the
sticks and the speed they actually run at. Process memory now comes
fromstatm, which matchesps(the old figure ran up to 6.4 MiB
low). - Per-process CPU moved in 4% steps in
sysmon probe. It now
measures over a full second, so the steps are 1%. - Sensors showed −62 °C and 0 °C from unconnected inputs. They're
now markedplausible: falseand folded away in the window. - Disk numbers now have a referee too. Partition write rate, busy %
and per-process disk writes are checked againstiostatand
pidstatwhile a known 64 MB/s writer runs (67.3 vs 67.1 MB/s). - A shared
sysmon servegave some clients zeros. While one client
kept it busy, another's first ask for different sections answered
with every rate at 0 (or an old average under a new label). Each
section now has its own window. - Plus:
probeprinted1.6357687711715698wheretapprinted
1.5370705;sysmon probe | headcrashed with exit 101 (and a full
disk exited 0 as if the answer arrived: now exit 4); a freshly
startedsysmon serveanswered its first question with all-zero
rates; the GPU name could read "Device 7551";bash -lc "…"showed
its command text as its name; group-by-app merged unrelated Python
programs into one row. All fixed, each with a failing test first.
New
- The Inspector. Click any process and its whole story opens beside
the table: where it came from (the parent chain, each step
clickable), live CPU and memory, its memory told honestly (resident
vs fair share vs what quitting it would free), open files, OOM score,
cgroup, working directory, children to drill into, and its sockets. - Overview ↔ Processes, both ways. A top-3 row opens the Inspector
on that process; "all by memory" opens the table sorted that way; the
strip above the table links each figure back to its card. - Group by app. A browser's forty renderers become one row.
- °F, °C, or both ("131°F · 55°C"). Sizes in decimal GB by default,
binary one click away. - A sensors card you can read. Grouped by what each sensor measures
(CPU, each drive by model, motherboard), with plain names, heat bars
against each sensor's own limit, and fan duty beside rpm, so a fan
driven at 50% that reads 0 rpm stands out. - 29 hand-painted glyphs for sections, process states and sensors.
- GPU VRM temperatures; a busy clock and IO wait on the CPU
card. - The right-click menu now always acts on the process you right-clicked,
even if the list re-sorts while the menu is open.
Lighter
The sampler costs 54% less CPU than 3.0.3 (12.7% → 5.8% of a core
sampling everything at 1 Hz, measured interleaved on the same machine).
The GUI is unchanged. The GPU clock poller parks with no timer when
nobody's watching, so an idle sysmon serve still costs nothing.
For scripts and agents
sysmon ctl temperature celsius|fahrenheit|both. JSON stays in °C.- New fields:
cpu.frequency_busy_mhz+frequency_busy_source,
cpu.iowait_percent,cpu.temperature_source,
memory.installed_bytes,memory.modules[],gpu.clock_source,
gpu.temperature_vrm_*_celsius,processes[].display_name,
sensors.chips[].kind,temps[].plausible,fans[].duty_percent. sysmon schemadocuments every field; a contract test now fails if a
live field goes undocumented.sysmon probe processestakes 1 s (was 0.25 s) for honest
per-process CPU. Probe only the sections you need, or ask a running
instance, for instant answers.--backgroundworks from a Wayland session, and aquitsent while
the GUI is still starting is honored.
Install
sudo apt install ./sysmon_3.1.0_amd64.deb # Debian / Ubuntu / Mint
sudo dnf install ./sysmon-3.1.0-1.x86_64.rpm # Fedora / RHELMotherboard fan and voltage sensors need your board's Super-I/O driver
(sudo modprobe nct6775 on most AMD boards).
Built in Jcode with Claude Opus
5.5, with two read-only Opus 5.5 workers: one audited (22 findings),
one reviewed the result (11 more, all fixed before release).
Receipts: cargo test --release green, clippy clean, conformance
17/17, e2e on X11 and native Wayland, accuracy audit 56/56.