feat: live disk I/O rates on array and pools cards
Adds vv_disk_io_rates() — snapshots /proc/diskstats each poll and computes per-device MB/s. Exposed as disk_io in the monitor API. JS: - Per-disk rows: ↓read ↑write inline next to disk name (green/amber, hidden when idle) - Pool rows: aggregate pool I/O next to pool name - Array header: total array I/O in the subtitle line Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
3e9c7b4921
commit
212b61ce15
@@ -536,6 +536,41 @@ function vv_array_disks(): array {
|
||||
return array_merge($parity, $data);
|
||||
}
|
||||
|
||||
function vv_disk_io_rates(): array {
|
||||
$snapFile = '/tmp/vv_diskio_snap.json';
|
||||
$now = microtime(true);
|
||||
|
||||
// Read current whole-disk stats from /proc/diskstats
|
||||
$current = [];
|
||||
foreach (@file('/proc/diskstats', FILE_IGNORE_NEW_LINES) ?: [] as $line) {
|
||||
$p = preg_split('/\s+/', trim($line));
|
||||
if (count($p) < 14) continue;
|
||||
$dev = $p[2];
|
||||
// Keep only whole disks: sda/sdb, nvme0n1, md*, not sda1/nvme0n1p1
|
||||
if (!preg_match('/^(sd[a-z]+|nvme\d+n\d+|md\d+)$/', $dev)) continue;
|
||||
$current[$dev] = [(int)$p[5], (int)$p[9]]; // [sectors_read, sectors_written]
|
||||
}
|
||||
|
||||
// Load previous snapshot
|
||||
$snap = @json_decode(@file_get_contents($snapFile) ?: '', true) ?: [];
|
||||
$prevTime = (float)($snap['t'] ?? $now);
|
||||
$prev = $snap['d'] ?? [];
|
||||
|
||||
// Save current snapshot
|
||||
@file_put_contents($snapFile, json_encode(['t' => $now, 'd' => $current], JSON_UNESCAPED_UNICODE));
|
||||
|
||||
$dt = max(0.5, $now - $prevTime);
|
||||
$rates = [];
|
||||
foreach ($current as $dev => [$rs, $ws]) {
|
||||
if (!isset($prev[$dev])) continue;
|
||||
[$prs, $pws] = $prev[$dev];
|
||||
$r = max(0.0, ($rs - $prs) * 512 / $dt / 1048576);
|
||||
$w = max(0.0, ($ws - $pws) * 512 / $dt / 1048576);
|
||||
if ($r > 0.01 || $w > 0.01) $rates[$dev] = [round($r, 1), round($w, 1)];
|
||||
}
|
||||
return $rates;
|
||||
}
|
||||
|
||||
function vv_disk_thresholds(): array {
|
||||
$cfg = @file_get_contents('/boot/config/plugins/dynamix/dynamix.cfg') ?: '';
|
||||
$get = function(string $key) use ($cfg): ?int {
|
||||
|
||||
Reference in New Issue
Block a user