Skip to content

0.3.4 - stop pinning a CPU core

Choose a tag to compare

@GNP1-dev GNP1-dev released this 09 Sep 23:44
· 49 commits to main since this release

⚠️ Beta software, no warranty. PoolTerminal is early software and has mainly been exercised on one operator's setup. It is read-only by design and holds no key material, but it does hold SSH access to your block producer, and that limit is not a guarantee. It has had an AI-assisted code review, not an independent security audit. Provided as-is under Apache 2.0 with no warranty of any kind - you use it at your own risk. See SECURITY.md.

Fixed

  • PoolTerminal no longer pins a CPU core while it is open. The
    Dashboard's heartbeat trace, the upcoming blocks strip and the Relay
    tabs' ECG each ran a requestAnimationFrame loop that rewrote the page
    sixty times a second whether or not anything had changed, and the glow
    on every moving heartbeat complex was a Gaussian blur re-rasterised on
    every one of those frames. Under WebKitGTK that is a full software
    repaint per frame, and the web process sat at 100-135% CPU for as long
    as the app was open: fan noise and battery drain on a laptop, and on a
    machine shared with a node, CPU the node does not get. All motion now
    runs from one shared 1 Hz ticker (everything it animates is
    second-resolution), a write is skipped when the value has not changed,
    the glow is applied once to the static trace container instead of to
    each moving path, and the ticker and every CSS animation stop entirely
    while the window is hidden. Two smaller always-on animations went the
    same way: the KES hourglass's falling sand, which was a 60 fps SVG
    animation that could not be paused, now steps at 8 Hz from the same
    ticker, and the mempool sparkline's current-value marker, which pulsed
    continuously with a re-rendered glow, is now a static glow that moves
    with each 5-second redraw.

    A connected, live Dashboard had a second layer of the same problem: the
    tip-diff needle is re-set every second and its 1.2-second smooth CSS
    transition never finished, so it repainted every frame for as long as
    the node was live, and the Bloomberg flash, the mempool tanks, the
    hero bars, the epoch thermometer and the metadata-feed slide-in each
    added their own per-frame repaints whenever a value changed. Every
    transition and animation on a live-updating element now uses a stepped
    timing function, so a needle sweep costs eight paints instead of about
    seventy and a flash eight instead of about a hundred. The motion reads
    the same; the per-frame repaint is gone. The loading spinners were the
    last per-frame animation: infinite 60 fps rings shown until each panel's
    first data, which on a live node can be two minutes for the leadership
    schedule. They now step at 10 frames a second, so the first minutes
    after connecting no longer run at 15-20%.

    Measured on the release build on the same machine. Dashboard in demo
    mode behind the connect modal: WebKit web process from an average of
    135% CPU to 4%, and 0.2% with the window minimised. A controlled
    1440x1000 WebKitGTK page with one needle re-set each second plus one
    flash: 16% with the old smooth transition, 2.4% stepped, 0.3% with no
    transition. A live-connected Dashboard on 0.3.3 averaged 25-30% of a
    core over its whole run.

  • The Node Health Forge card flagged CHECK on healthy pools. It
    treated the node's slotsMissed counter as missed blocks and escalated
    on any non-zero value. That counter is late leadership checks: slots
    the forge loop did not evaluate in time because of CPU, IO or a GC
    pause, which every block producer accrues and on which the node was
    almost never leader. It had flagged a pool that had not been scheduled
    at all. The card now escalates only on nodeCannotForge, the counter
    that means the node was scheduled and could not mint.

Changed

  • Forge figures on Node Health carry their denominator. The card now
    reads "leader N · forged M", so a forged count of zero is seen against
    how often the node was actually scheduled. The Live detail grid gains
    Leader slots, Cannot-forge errors and Late leader checks, the last shown
    as "n of total (%)" against the number of leadership checks the node set
    out to run. Demo mode shows the same shape rather than a sterile zero.