diff --git a/src/gpustat/usr/local/emhttp/plugins/gpustat/GPUStatSettings.page b/src/gpustat/usr/local/emhttp/plugins/gpustat/GPUStatSettings.page index dc621f9..e610e20 100644 --- a/src/gpustat/usr/local/emhttp/plugins/gpustat/GPUStatSettings.page +++ b/src/gpustat/usr/local/emhttp/plugins/gpustat/GPUStatSettings.page @@ -98,14 +98,7 @@ Title="GPU Statistics" $cfg = NULL ; if ($_POST['#apply'] == "_(Apply)_") { array_map(function($k, $v) use (&$cfg) { if($k[0] != "#") $cfg[$k] = $v; }, array_keys($_POST), $_POST ); - save_cfg($cfg,$gpustat_data) ; - - // Restart nchan gpustat if not running when refresh setting set to Yes - $pid = exec('pgrep gpustat'); - if (!$pid && $_POST['UIREFRESH'] == '1' && $gpustat_cfg['UIREFRESH'] != '1') { - exec('/usr/local/emhttp/plugins/gpustat/nchan/gpustat &>/dev/null &'); - } - + save_cfg($cfg,$gpustat_data); $gpustat_cfg = parse_plugin_cfg("gpustat", true); unset($_POST); } diff --git a/src/gpustat/usr/local/emhttp/plugins/gpustat/css/style.css b/src/gpustat/usr/local/emhttp/plugins/gpustat/css/style.css index 66981c4..b1d67ed 100644 --- a/src/gpustat/usr/local/emhttp/plugins/gpustat/css/style.css +++ b/src/gpustat/usr/local/emhttp/plugins/gpustat/css/style.css @@ -26,13 +26,17 @@ margin-top: 0; } -span.gpu { +.gpustat span.gpu { width: 150px; display: inline-block; } -.gpu-image { +.gpustat .gpu-image { padding-left: 8px; height: 32px; width: 32px; +} + +.gpustat .usage-disk > span { + transition: width 0.5s; } \ No newline at end of file diff --git a/src/gpustat/usr/local/emhttp/plugins/gpustat/gpustatus.page b/src/gpustat/usr/local/emhttp/plugins/gpustat/gpustatus.page index f4fe4ef..67a68b2 100644 --- a/src/gpustat/usr/local/emhttp/plugins/gpustat/gpustatus.page +++ b/src/gpustat/usr/local/emhttp/plugins/gpustat/gpustatus.page @@ -1,6 +1,7 @@ Menu="Dashboard" Icon="gpustat.png" Cond="version_compare(parse_ini_file('/etc/unraid-version')['version'],'6.12.0-beta6', '<')" +Nchan="gpustat" --- - + @@ -164,13 +160,7 @@ Cond="version_compare(parse_ini_file('/etc/unraid-version')['version'],'6.12.0-b Active Apps - - - - - - - + @@ -353,10 +343,13 @@ Cond="version_compare(parse_ini_file('/etc/unraid-version')['version'],'6.12.0-b + diff --git a/src/gpustat/usr/local/emhttp/plugins/gpustat/gpustatus.php b/src/gpustat/usr/local/emhttp/plugins/gpustat/gpustatus.php index 6b0f28a..44d85f1 100644 --- a/src/gpustat/usr/local/emhttp/plugins/gpustat/gpustatus.php +++ b/src/gpustat/usr/local/emhttp/plugins/gpustat/gpustatus.php @@ -30,13 +30,11 @@ include 'lib/Nvidia.php'; include 'lib/Intel.php'; include 'lib/AMD.php'; -include 'lib/Error.php'; use gpustat\lib\AMD; use gpustat\lib\Main; use gpustat\lib\Nvidia; use gpustat\lib\Intel; -use gpustat\lib\Error; if (!isset($gpustat_cfg)) { $gpustat_cfg = Main::getSettings(); @@ -47,26 +45,4 @@ $gpustat_cfg['inventory'] = true; // Settings page looks for $gpustat_data specifically -- inventory all supported GPU types $gpustat_data = array_merge((new Nvidia($gpustat_cfg))->getInventory(), (new Intel($gpustat_cfg))->getInventory(), (new AMD($gpustat_cfg))->getInventory()); -} else { - - switch ($gpustat_cfg['VENDOR']) { - case 'amd': - $data = (new AMD($gpustat_cfg))->getStatistics(); - break; - case 'intel': - $data = (new Intel($gpustat_cfg))->getStatistics(); - break; - case 'nvidia': - $data = (new Nvidia($gpustat_cfg))->getStatistics(); - break; - default: - print_r(Error::get(Error::CONFIG_SETTINGS_NOT_VALID)); - } - $json = $data ; - header('Content-Type: application/json'); - header('Content-Length:' . ES . strlen($json)); - echo $json; - file_put_contents("/tmp/gpujson2","Time = ".date(DATE_RFC2822)."\n") ; - file_put_contents("/tmp/gpujson2",$json."\n",FILE_APPEND) ; - } diff --git a/src/gpustat/usr/local/emhttp/plugins/gpustat/gpustatusmovablemulti.page b/src/gpustat/usr/local/emhttp/plugins/gpustat/gpustatusmovablemulti.page index 0a906f7..7880451 100644 --- a/src/gpustat/usr/local/emhttp/plugins/gpustat/gpustatusmovablemulti.page +++ b/src/gpustat/usr/local/emhttp/plugins/gpustat/gpustatusmovablemulti.page @@ -90,7 +90,7 @@ foreach ($multigpus as $id=>$gpu) { $layout = GPULayout($gpu["vendor"],$gpustat_cfg) ; $mytiles[$pluginname.$k]['column'.$j] = << + $stats diff --git a/src/gpustat/usr/local/emhttp/plugins/gpustat/nchan/gpustat b/src/gpustat/usr/local/emhttp/plugins/gpustat/nchan/gpustat index f23545c..d752cd6 100755 --- a/src/gpustat/usr/local/emhttp/plugins/gpustat/nchan/gpustat +++ b/src/gpustat/usr/local/emhttp/plugins/gpustat/nchan/gpustat @@ -43,48 +43,69 @@ use gpustat\lib\Nvidia; use gpustat\lib\Intel; use gpustat\lib\Error; +$gpustat_multi_enable = version_compare(parse_ini_file('/etc/unraid-version')['version'], '6.12.0-beta5', '>'); + while (true) { $gpustat_cfg = Main::getSettings(); - $multi = urldecode($gpustat_cfg["MULTIGPUJSON"]); - $multigpus = json_decode($multi, true); - $data = array() ; + $data = array(); + + if ($gpustat_multi_enable) { + $multi = urldecode($gpustat_cfg["MULTIGPUJSON"]); + $multigpus = json_decode($multi, true); + } else { + $multigpus = [ + [ + 'vendor' => $gpustat_cfg["VENDOR"], + 'guid' => $gpustat_cfg["GPUID"], + 'id' => null, + ], + ]; + } foreach ($multigpus as $gpu) { - $gpustat_cfg["VENDOR"] = $gpu['vendor'] ; - $gpustat_cfg["GPUID"] = $gpu['guid'] ; - $gpustat_cfg["PCIID"] = $gpu['id'] ; + if ($gpustat_multi_enable) { + $gpustat_cfg["VENDOR"] = $gpu['vendor']; + $gpustat_cfg["GPUID"] = $gpu['guid']; + $gpustat_cfg["PCIID"] = $gpu['id']; + } switch ($gpu['vendor']) { case 'amd': $return = (new AMD($gpustat_cfg))->getStatistics(); - $decode = json_decode($return, true); - $data[$gpu["id"]] = $decode; break; case 'intel': $return = (new Intel($gpustat_cfg))->getStatistics(); - $decode = json_decode($return, true); - $data[$gpu["id"]] = $decode; break; case 'nvidia': - $return = (new Nvidia($gpustat_cfg))->getStatistics() ; - $decode = json_decode($return, true); - $data[$gpu["id"]] = $decode; + $return = (new Nvidia($gpustat_cfg))->getStatistics(); break; default: print_r(Error::get(Error::CONFIG_SETTINGS_NOT_VALID)); } - } - // Test data - // $data = array_merge($data, json_decode('{"00:02.0": {"clock": 100, "fan": 50, "memclock": 500, "memutil": 55, "memused": 55, "power": "100W", "powermax": 500, "rxutil": 50, "txutil": 60, "temp": 50, "tempmax": 200, "util": "40%", "vendor": "Intel", "name": "AlderLake-S GT1", "3drender": "50%", "blitter": "50%", "interrupts": 100, "powerutil": "10%", "video": "20%", "videnh": "30%"}, "09:00.0": {"clock": 0, "fan": "N\/A", "memclock": "N\/A", "memutil": "N\/A", "memused": "N\/A", "power": "N\/A", "powermax": "N\/A", "rxutil": "N\/A", "txutil": "N\/A", "temp": "N\/A", "tempmax": "N\/A", "util": "0%", "vendor": "Intel", "name": "DG2 [Arc A770]", "3drender": "0%", "blitter": "0%", "interrupts": 0, "powerutil": "0%", "video": "0%", "videnh": "0%"}, "08:00.0": {"active_apps":[{"name": "plex", "mem": 214, "count": 2}], "clock": "810", "fan": "30%", "memclock": "2808", "memutil": "50%", "memused": "50", "power": "28W", "powermax": "87", "rxutil": 50, "txutil": 60, "temp": "41 \u00b0C", "tempmax": "101 \u00b0C", "util": "77%", "vendor": "NVIDIA", "name": "Quadro K4000", "clockmax": "810", "memclockmax": "2808", "memtotal": "3018", "encutil": "50%", "decutil": "50%", "pciemax": 500, "perfstate": "P0", "throttled": "No", "thrtlrsn": "", "pciegen": 2, "pciegenmax": 2, "pciewidth": 1, "pciewidthmax": 16, "sessions": 2, "uuid": "GPU-ef6c0299-f1bc-7b5c-5291-7cd1a012f8bd"}, "0c:00.0": {"clock": 2110.5, "fan": 200, "memclock": 2220.1, "memutil": "21.2%", "memused": 47.51, "power": 50, "powermax": 200, "rxutil": "N\/A", "txutil": 67, "temp": "38 \u00b0C", "tempmax": 105, "util": "90%", "vendor": "AMD", "name": "Radeon RX 6400\/6500 XT\/6500M", "event": "80%", "vertex": "70%", "texture": "60%", "shaderexp": "50%", "sequencer": "40%", "shaderinter": "30%", "scancon": "30%", "primassem": "30%", "depthblk": "30%", "colorblk": "30%", "gfxtrans": "44.1%", "transused": 11.57, "memclockutil": "9.6%", "clockutil": "21.6%", "tempunit": "C", "fanmax": 5550, "voltage": 77.7, "voltageunit": "V"}}', true)); + if ($gpustat_multi_enable) { + $decode = json_decode($return, true); + + if ($decode != NULL) { + $data[$gpu["id"]] = $decode; + } + + // Test data + // $data = array_merge($data, json_decode('{"00:02.0": {"clock": 100, "fan": 50, "memclock": 500, "memutil": 55, "memused": 55, "power": "100W", "powermax": 500, "rxutil": 50, "txutil": 60, "temp": 50, "tempmax": 200, "util": "40%", "vendor": "Intel", "name": "AlderLake-S GT1", "3drender": "50%", "blitter": "50%", "interrupts": 100, "powerutil": "10%", "video": "20%", "videnh": "30%"}, "09:00.0": {"clock": 0, "fan": "N\/A", "memclock": "N\/A", "memutil": "N\/A", "memused": "N\/A", "power": "N\/A", "powermax": "N\/A", "rxutil": "N\/A", "txutil": "N\/A", "temp": "N\/A", "tempmax": "N\/A", "util": "0%", "vendor": "Intel", "name": "DG2 [Arc A770]", "3drender": "0%", "blitter": "0%", "interrupts": 0, "powerutil": "0%", "video": "0%", "videnh": "0%"}, "08:00.0": {"active_apps":[{"name": "plex", "mem": 214, "count": 2}], "clock": "810", "fan": "30%", "memclock": "2808", "memutil": "50%", "memused": "50", "power": "28W", "powermax": "87", "rxutil": 50, "txutil": 60, "temp": "41 \u00b0C", "tempmax": "101 \u00b0C", "util": "77%", "vendor": "NVIDIA", "name": "Quadro K4000", "clockmax": "810", "memclockmax": "2808", "memtotal": "3018", "encutil": "50%", "decutil": "50%", "pciemax": 500, "perfstate": "P0", "throttled": "No", "thrtlrsn": "", "pciegen": 2, "pciegenmax": 2, "pciewidth": 1, "pciewidthmax": 16, "sessions": 2, "uuid": "GPU-ef6c0299-f1bc-7b5c-5291-7cd1a012f8bd"}, "0c:00.0": {"clock": 2110.5, "fan": 200, "memclock": 2220.1, "memutil": "21.2%", "memused": 47.51, "power": 50, "powermax": 200, "rxutil": "N\/A", "txutil": 67, "temp": "38 \u00b0C", "tempmax": 105, "util": "90%", "vendor": "AMD", "name": "Radeon RX 6400\/6500 XT\/6500M", "event": "80%", "vertex": "70%", "texture": "60%", "shaderexp": "50%", "sequencer": "40%", "shaderinter": "30%", "scancon": "30%", "primassem": "30%", "depthblk": "30%", "colorblk": "30%", "gfxtrans": "44.1%", "transused": 11.57, "memclockutil": "9.6%", "clockutil": "21.6%", "tempunit": "C", "fanmax": 5550, "voltage": 77.7, "voltageunit": "V"}}', true)); - $json = json_encode($data) ; + $json = json_encode($data); + } else { + $json = $return; + } + } publish('gpustat', $json); - file_put_contents("/tmp/gpujson", "Time = " . date(DATE_RFC2822) . "\n" . $json . "\n") ; + file_put_contents("/tmp/gpujson", "Time = " . date(DATE_RFC2822) . PHP_EOL . $json . PHP_EOL); + // Stop nchan gpustat if refresh setting set to No and remove it from /var/run/nchan.pid if ($gpustat_cfg['UIREFRESH'] != '1') { + exec('sed -i "/plugins\/gpustat\/nchan\/gpustat/d" /var/run/nchan.pid'); exit; } diff --git a/src/gpustat/usr/local/emhttp/plugins/gpustat/scripts/gpustat.js b/src/gpustat/usr/local/emhttp/plugins/gpustat/scripts/gpustat.js index 828f12f..1a900cd 100644 --- a/src/gpustat/usr/local/emhttp/plugins/gpustat/scripts/gpustat.js +++ b/src/gpustat/usr/local/emhttp/plugins/gpustat/scripts/gpustat.js @@ -22,63 +22,85 @@ SOFTWARE. */ -const gpustat_status = () => { - $.getJSON('/plugins/gpustat/gpustatus.php', (data) => { - if (data) { - switch (data["vendor"]) { - case 'NVIDIA': - // Nvidia Slider Bars - $('.gpu-memclockbar').removeAttr('style').css('width', data["memclock"] / data["memclockmax"] * 100 + "%"); - $('.gpu-gpuclockbar').removeAttr('style').css('width', data["clock"] / data["clockmax"] * 100 + "%"); - $('.gpu-powerbar').removeAttr('style').css('width', parseInt(data["power"].replace("W","") / data["powermax"] * 100) + "%"); - $('.gpu-rxutilbar').removeAttr('style').css('width', parseInt(data["rxutil"] / data["pciemax"] * 100) + "%"); - $('.gpu-txutilbar').removeAttr('style').css('width', parseInt(data["txutil"] / data["pciemax"] * 100) + "%"); +const parseStats = (data) => { + if (data) { + switch (data["vendor"]) { + case 'NVIDIA': + // Nvidia Slider Bars + $('.gpu-memclockbar').removeAttr('style').css('width', data["memclock"] / data["memclockmax"] * 100 + "%"); + $('.gpu-gpuclockbar').removeAttr('style').css('width', data["clock"] / data["clockmax"] * 100 + "%"); + $('.gpu-powerbar').removeAttr('style').css('width', parseInt(data["power"].replace("W","") / data["powermax"] * 100) + "%"); + $('.gpu-rxutilbar').removeAttr('style').css('width', parseInt(data["rxutil"] / data["pciemax"] * 100) + "%"); + $('.gpu-txutilbar').removeAttr('style').css('width', parseInt(data["txutil"] / data["pciemax"] * 100) + "%"); - let nvidiabars = ['util', 'memutil', 'encutil', 'decutil', 'fan']; - nvidiabars.forEach(function (metric) { - $('.gpu-'+metric+'bar').removeAttr('style').css('width', data[metric]); - }); + let nvidiabars = ['util', 'memutil', 'encutil', 'decutil', 'fan']; + nvidiabars.forEach(function (metric) { + $('.gpu-'+metric+'bar').removeAttr('style').css('width', data[metric]); + }); - if (data["appssupp"]) { - data["appssupp"].forEach(function (app) { - if (data[app + "using"]) { - $('.gpu-img-span-'+app).css('display', "inline"); - $('#gpu-'+app).attr('title', "Count: " + data[app+"count"] + " Memory: " + data[app+"mem"] + "MB"); - } else { - $('.gpu-img-span-'+app).css('display', "none"); - $('#gpu-'+app).attr('title', ""); - } - }); - } - break; - case 'Intel': - // Intel Slider Bars - let intelbars = ['3drender', 'blitter', 'video', 'videnh', 'powerutil']; - intelbars.forEach(function (metric) { - $('.gpu-'+metric+'bar').removeAttr('style').css('width', data[metric]); - }); - break; - case 'AMD': - $('.gpu-powerbar').removeAttr('style').css('width', parseInt(data["power"] / data["powermax"] * 100) + "%"); - $('.gpu-fanbar').removeAttr('style').css('width', parseInt(data["fan"] / data["fanmax"] * 100) + "%"); - let amdbars = [ - 'util', 'event', 'vertex', - 'texture', 'shaderexp', 'sequencer', - 'shaderinter', 'scancon', 'primassem', - 'depthblk', 'colorblk', 'memutil', - 'gfxtrans', 'memclockutil', 'clockutil' - ]; - amdbars.forEach(function (metric) { - $('.gpu-'+metric+'bar').removeAttr('style').css('width', data[metric]); + if (data["appssupp"]) { + data["appssupp"].forEach(function (app) { + if (data[app + "using"]) { + $('.gpu-img-span-'+app).css('display', "inline"); + $('#gpu-'+app).attr('title', "Count: " + data[app+"count"] + " Memory: " + data[app+"mem"] + "MB"); + } else { + $('.gpu-img-span-'+app).css('display', "none"); + $('#gpu-'+app).attr('title', ""); + } }); - break; - } + } + break; + case 'Intel': + // Intel Slider Bars + let intelbars = ['3drender', 'blitter', 'video', 'videnh', 'powerutil']; + intelbars.forEach(function (metric) { + $('.gpu-'+metric+'bar').removeAttr('style').css('width', data[metric]); + }); + break; + case 'AMD': + $('.gpu-powerbar').removeAttr('style').css('width', parseInt(data["power"] / data["powermax"] * 100) + "%"); + $('.gpu-fanbar').removeAttr('style').css('width', parseInt(data["fan"] / data["fanmax"] * 100) + "%"); + let amdbars = [ + 'util', 'event', 'vertex', + 'texture', 'shaderexp', 'sequencer', + 'shaderinter', 'scancon', 'primassem', + 'depthblk', 'colorblk', 'memutil', + 'gfxtrans', 'memclockutil', 'clockutil' + ]; + amdbars.forEach(function (metric) { + $('.gpu-'+metric+'bar').removeAttr('style').css('width', data[metric]); + }); + break; + } - $.each(data, function (key, data) { - $('.gpu-'+key).html(data); - }) + if (data["active_apps"]) { + const appList = []; + $('.gpu-active-apps .gpu-img-span').each(function () { + appList.push($(this).data('name')); + }); + const active_apps = []; + data["active_apps"].forEach(function (app) { + active_apps.push(app.name); + const title = 'Count: ' + app.count + ' - Memory: ' + app.mem + 'MB'; + if (appList.includes(app.name)) { + $('.gpu-active-apps span[data-name="' + app.name + '"] img').attr('title', title); + } else { + const img = $(''); + const span = $(''); + span.append(img); + $('.gpu-active-apps').append(span); + } + }); + $('.gpu-active-apps td span.gpu-img-span').each(function () { + if (!active_apps.includes($(this).data('name'))) + $(this).remove(); + }); } - }); + + $.each(data, function (key, data) { + $('.gpu-'+key).html(data); + }) + } }; const gpustat_dash = () => {