cybernet
MONITORSISTEMA
v1.0.0  ·  Qt 6 / C++20  ·  MIT  ·  Linux

Cruscotto di telemetria · Qt 6 Widgets · C++20 · MIT

La macchina,
in un colpo d'occhio.

Sette pannelli in una finestra sola: carico per ogni core, memoria e swap, temperature con il grafico, rete, disco, batteria e i processi più pesanti. Legge /proc e /sys e disegna tutto con QPainter: nessun widget di sistema, nessuna immagine, nessun asset — solo Qt 6. Il campionamento si regola: 5 volte al secondo per default, 25 con --interval 40.

Il cruscotto di Monitor di Sistema: carico del processore con 20 barre per core, memoria con donut e barre RAM/SWAP/batteria, temperature, rete, disco e la tabella dei processi più pesanti.
Il cruscotto in modalità --demo (dati sintetici, nessuna lettura di /proc): serve a far vedere i grafici pieni e i pannelli con valori realistici; i numeri veri si vedono all'avvio nella propria macchina.

Cosa c'è dentro

01 / PROCESSORE

Una barra per core

Percentuale totale, una barra per ogni core (20 su questa macchina), frequenza media, carico 1/5/15 e pressione CPU da /proc/pressure/cpu. Sotto il 80 % è ciano, sopra diventa ambra e poi rosso: si legge da lontano.

02 / MEMORIA

Donut e barre

RAM usata con MemAvailable (non MemFree, che racconta un'altra storia), swap e batteria, con i valori assoluti accanto alla percentuale.

03 / GRAFICI

Auto-scala, non 0–100

Una macchina che vive tra 76 e 96 °C su una scala fissa sembra una riga piatta: i grafici si normalizzano su min–max della finestra e scrivono il range vero accanto al valore. L'asse del tempo è ancorato a destra e parte corto.

Cosa legge, e dove si sbaglia

Niente demoni, niente librerie: solo i file che il kernel espone. Il sampler accetta una radice finta di /proc e /sys, quindi i test girano su una fixture e non sulla macchina che li esegue.

DatoSorgenteTrappola
CPU, per core/proc/statservono due campioni; il primo non ha delta
memoria/proc/meminfoMemAvailable, mai MemFree
rete/proc/net/devlo, docker*, veth*, br-*… contano due volte
disco/proc/diskstatssolo dischi interi: le partizioni raddoppiano i byte
temperature/sys/class/hwmonmilli-°C, etichetta per sensore
processi/proc/<pid>/statcomm può contenere parentesi: si taglia all'ultima )
I file di /proc hanno st_size 0. Con QTextStream atEnd() diventa vero al primo giro e i pannelli restano vuoti senza un errore: si legge con readAll(). È il bug che sembra «alcuni pannelli non funzionano».

Campionare tanto, disegnare il giusto

A 25 Hz il primo tentativo costava il 30 % di un core, quasi tutto in ridisegno. Adesso campionamento e disegno sono separati: il timer campiona all'intervallo scelto, il ridisegno avviene al massimo ogni 100 ms, la scansione dei processi una volta al secondo (con la lista riusata fra un giro e l'altro).

# 25 campioni al secondo nei grafici, ~10 ridisegni al secondo
./monitor-sistema --interval 40 --window 60

# e con la diagnostica del disegno
MON_PAINT_BENCH=1 ./monitor-sistema --interval 40
paint: 4.65 ms/frame, 150 frame, 23.2 campioni/s

Il paint è sceso da 12,65 a 3,3–5,2 ms per frame: fondo in una QPixmap ricostruita al resize, niente gradienti ricalcolati a ogni frame, antialiasing solo su testo e linee, decimazione min/max delle serie lunghe (i picchi restano), font in cache.

Verificato, non stimato. Su questo portatile a 20 core, 1280×820 a scala 1,4×: 12,8 % di un core a 25 Hz, ~4 % a 5 Hz. La velocità di scorrimento è larghezza diviso finestra temporale, quindi si regola con --window (60 s di default, 30 s per farlo correre).

Compilarlo

  1. Dipendenze

    Qt 6 (Core, Gui, Widgets, Test) e un compilatore C++20. Su Ubuntu: sudo apt install build-essential cmake qt6-base-dev.

  2. Build e test

    cmake -B build -S .
    cmake --build build -j"$(nproc)"
    ctest --test-dir build --output-on-failure
  3. Avvio, e installazione utente

    ./build/monitor-sistema
    
    # binario + icona + voce di menu «Monitor di Sistema (cruscotto)»
    cmake --install build --prefix ~/.local

    Non ci sono pacchetti da scaricare: è un programma da compilare, e in cambio non porta con sé niente che il sistema non abbia già.

Anche senza schermo. --once e --json costruiscono un QCoreApplication, non una QApplication: funzionano su SSH, cron e CI. --demo genera dati sintetici deterministici, --capture salva un PNG della finestra.