Skip to content

SysMon 3.1.0

Choose a tag to compare

@RamenFast RamenFast released this 01 Oct 11:53
· 14 commits to main since this release

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
    from statm, which matches ps (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 marked plausible: false and folded away in the window.
  • Disk numbers now have a referee too. Partition write rate, busy %
    and per-process disk writes are checked against iostat and
    pidstat while a known 64 MB/s writer runs (67.3 vs 67.1 MB/s).
  • A shared sysmon serve gave 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: probe printed 1.6357687711715698 where tap printed
    1.5370705; sysmon probe | head crashed with exit 101 (and a full
    disk exited 0 as if the answer arrived: now exit 4); a freshly
    started sysmon serve answered 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 schema documents every field; a contract test now fails if a
    live field goes undocumented.
  • sysmon probe processes takes 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.
  • --background works from a Wayland session, and a quit sent 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 / RHEL

Motherboard 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.