{"id":1920,"date":"2026-04-16T23:16:35","date_gmt":"2026-04-16T15:16:35","guid":{"rendered":"https:\/\/www.dataz8.com\/?p=1920"},"modified":"2026-04-17T00:32:15","modified_gmt":"2026-04-16T16:32:15","slug":"go%e8%af%ad%e8%a8%80%e5%bc%80%e5%8f%91%e7%9a%84gpu-monitor%e9%a1%b9%e7%9b%ae%e4%bb%a3%e7%a0%81%e6%a1%86%e6%9e%b6%e4%b8%8e%e8%bf%90%e8%a1%8c%e5%8e%9f%e7%90%86%e5%88%86%e6%9e%90%ef%bc%88%e5%ae%9e","status":"publish","type":"post","link":"https:\/\/www.dataz8.com\/?p=1920","title":{"rendered":"Go\u8bed\u8a00\u5f00\u53d1\u7684GPU-Monitor\u9879\u76ee\u4ee3\u7801\u6846\u67b6\u4e0e\u8fd0\u884c\u539f\u7406\u5206\u6790\uff08\u5b9e\u6218\uff09"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_89 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#1_%E9%A1%B9%E7%9B%AE%E6%A6%82%E8%A7%88\" >1. \u9879\u76ee\u6982\u89c8<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#2_%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84\" >2. \u5f53\u524d\u76ee\u5f55\u7ed3\u6784<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#3_%E4%BB%A3%E7%A0%81%E6%A1%86%E6%9E%B6\" >3. \u4ee3\u7801\u6846\u67b6<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#31_%E5%8D%95%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1%E7%BB%93%E6%9E%84\" >3.1 \u5355\u6587\u4ef6\u670d\u52a1\u7ed3\u6784<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#4_%E6%A0%B8%E5%BF%83%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84\" >4. \u6838\u5fc3\u6570\u636e\u7ed3\u6784<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#41_gpuStat\" >4.1 gpuStat<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#42_snapshot\" >4.2 snapshot<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#43_monitor\" >4.3 monitor<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#5_%E6%9C%8D%E5%8A%A1%E5%90%AF%E5%8A%A8%E6%AD%A5%E9%AA%A4\" >5. \u670d\u52a1\u542f\u52a8\u6b65\u9aa4<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#51_%E8%A7%A3%E6%9E%90%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0\" >5.1 \u89e3\u6790\u547d\u4ee4\u884c\u53c2\u6570<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#52_%E5%88%9D%E5%A7%8B%E5%8C%96%E6%9C%8D%E5%8A%A1%E7%8A%B6%E6%80%81\" >5.2 \u521d\u59cb\u5316\u670d\u52a1\u72b6\u6001<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#53_%E5%88%9B%E5%BB%BA%E5%8F%AF%E5%8F%96%E6%B6%88%E4%B8%8A%E4%B8%8B%E6%96%87\" >5.3 \u521b\u5efa\u53ef\u53d6\u6d88\u4e0a\u4e0b\u6587<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#54_%E5%90%AF%E5%8A%A8%E5%90%8E%E5%8F%B0%E9%87%87%E9%9B%86%E5%8D%8F%E7%A8%8B\" >5.4 \u542f\u52a8\u540e\u53f0\u91c7\u96c6\u534f\u7a0b<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#55_%E6%B3%A8%E5%86%8C_HTTP_%E8%B7%AF%E7%94%B1\" >5.5 \u6ce8\u518c HTTP \u8def\u7531<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#56_%E5%90%AF%E5%8A%A8_HTTP_Server\" >5.6 \u542f\u52a8 HTTP Server<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#6_%E5%90%8E%E5%8F%B0%E9%87%87%E9%9B%86%E6%B5%81%E7%A8%8B%E5%8E%9F%E7%90%86\" >6. \u540e\u53f0\u91c7\u96c6\u6d41\u7a0b\u539f\u7406<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#61_run\" >6.1 run()<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#62_refresh\" >6.2 refresh()<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#7_GPU_%E9%87%87%E9%9B%86%E5%8E%9F%E7%90%86\" >7. GPU \u91c7\u96c6\u539f\u7406<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#71_%E8%B0%83%E7%94%A8%E5%A4%96%E9%83%A8%E5%91%BD%E4%BB%A4\" >7.1 \u8c03\u7528\u5916\u90e8\u547d\u4ee4<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#72_CSV_%E8%A7%A3%E6%9E%90\" >7.2 CSV \u89e3\u6790<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#73_%E5%AD%97%E6%AE%B5%E8%BD%AC%E6%8D%A2\" >7.3 \u5b57\u6bb5\u8f6c\u6362<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#74_%E5%AE%B9%E9%94%99%E6%96%B9%E5%BC%8F\" >7.4 \u5bb9\u9519\u65b9\u5f0f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#8_HTTP_%E6%8E%A5%E5%8F%A3%E5%8E%9F%E7%90%86\" >8. HTTP \u63a5\u53e3\u539f\u7406<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#81_apiv1gpus\" >8.1 \/api\/v1\/gpus<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#82_healthz\" >8.2 \/healthz<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#83\" >8.3 \/<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#9_Dashboard_%E9%A1%B5%E9%9D%A2%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86\" >9. Dashboard \u9875\u9762\u5de5\u4f5c\u539f\u7406<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#91_%E9%A6%96%E6%AC%A1%E5%8A%A0%E8%BD%BD\" >9.1 \u9996\u6b21\u52a0\u8f7d<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#92_%E5%AE%9A%E6%97%B6%E5%88%B7%E6%96%B0\" >9.2 \u5b9a\u65f6\u5237\u65b0<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#93_load_%E5%81%9A%E4%BA%86%E4%BB%80%E4%B9%88\" >9.3 load() \u505a\u4e86\u4ec0\u4e48<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#94_%E9%A1%B5%E9%9D%A2%E5%91%88%E7%8E%B0%E6%A8%A1%E5%9E%8B\" >9.4 \u9875\u9762\u5448\u73b0\u6a21\u578b<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-33\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#10_%E5%B9%B6%E5%8F%91%E4%B8%8E%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E8%AE%BE%E8%AE%A1\" >10. \u5e76\u53d1\u4e0e\u7ebf\u7a0b\u5b89\u5168\u8bbe\u8ba1<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-34\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#11_%E8%BF%90%E8%A1%8C%E6%AD%A5%E9%AA%A4%E5%8E%9F%E7%90%86\" >11. \u8fd0\u884c\u6b65\u9aa4\u539f\u7406<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-35\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#12_configconfigyaml_%E5%BD%93%E5%89%8D%E7%8A%B6%E6%80%81\" >12. config\/config.yaml \u5f53\u524d\u72b6\u6001<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-36\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#13_%E5%BD%93%E5%89%8D%E5%AE%9E%E7%8E%B0%E7%9A%84%E4%BC%98%E7%82%B9\" >13. \u5f53\u524d\u5b9e\u73b0\u7684\u4f18\u70b9<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-37\" href=\"https:\/\/www.dataz8.com\/?p=1920\/#14_%E7%9B%91%E6%8E%A7%E5%B1%95%E7%A4%BA\" >14. \u76d1\u63a7\u5c55\u793a<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_%E9%A1%B9%E7%9B%AE%E6%A6%82%E8%A7%88\"><\/span>1. \u9879\u76ee\u6982\u89c8<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u662f\u4e00\u4e2a\u975e\u5e38\u8f7b\u91cf\u7684 Go \u5355\u4f53\u670d\u52a1\uff0c\u804c\u8d23\u53ea\u6709\u4e00\u4ef6\u4e8b\uff1a\u5b9a\u65f6\u8c03\u7528 <code>nvidia-smi<\/code> \u91c7\u96c6 GPU \u6307\u6807\uff0c\u7136\u540e\u901a\u8fc7 HTTP \u63a5\u53e3\u548c\u5185\u5d4c Dashboard \u9875\u9762\u5c55\u793a\u51fa\u6765\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9879\u76ee\u5f53\u524d\u6ca1\u6709\u62c6\u5206\u591a\u5c42\u76ee\u5f55\uff0c\u4e5f\u6ca1\u6709\u5f15\u5165\u7b2c\u4e09\u65b9\u4f9d\u8d56\uff0c\u6838\u5fc3\u903b\u8f91\u51e0\u4e4e\u5168\u90e8\u96c6\u4e2d\u5728\u4e00\u4e2a\u6587\u4ef6\u91cc\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>cmd\/server\/main.go<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u610f\u5473\u7740\u5b83\u7684\u4f18\u70b9\u662f\u7ed3\u6784\u7b80\u5355\u3001\u542f\u52a8\u5feb\u3001\u4f9d\u8d56\u5c11\uff1b\u7f3a\u70b9\u662f\u968f\u7740\u529f\u80fd\u589e\u52a0\uff0c\u5355\u6587\u4ef6\u4f1a\u5f88\u5feb\u53d8\u5f97\u96be\u7ef4\u62a4\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84\"><\/span>2. \u5f53\u524d\u76ee\u5f55\u7ed3\u6784<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u57fa\u4e8e\u5f53\u524d\u4ed3\u5e93\uff0c\u548c\u4e1a\u52a1\u76f4\u63a5\u76f8\u5173\u7684\u6587\u4ef6\u4e3b\u8981\u662f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>cmd\/server\/main.go<\/code><\/li>\n\n\n\n<li><code>config\/config.yaml<\/code><\/li>\n\n\n\n<li><code>go.mod<\/code><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_%E4%BB%A3%E7%A0%81%E6%A1%86%E6%9E%B6\"><\/span>3. \u4ee3\u7801\u6846\u67b6<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"31_%E5%8D%95%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1%E7%BB%93%E6%9E%84\"><\/span>3.1 \u5355\u6587\u4ef6\u670d\u52a1\u7ed3\u6784<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>main.go<\/code> \u91cc\u4e3b\u8981\u5305\u542b\u4ee5\u4e0b\u51e0\u7c7b\u5185\u5bb9\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u6570\u636e\u7ed3\u6784\u5b9a\u4e49<\/li>\n\n\n\n<li>Dashboard HTML \u6a21\u677f<\/li>\n\n\n\n<li>\u670d\u52a1\u542f\u52a8\u903b\u8f91<\/li>\n\n\n\n<li>\u5b9a\u65f6\u91c7\u96c6\u903b\u8f91<\/li>\n\n\n\n<li>HTTP \u5904\u7406\u5668<\/li>\n\n\n\n<li>GPU \u6570\u636e\u91c7\u96c6\u4e0e\u89e3\u6790<\/li>\n\n\n\n<li>JSON \u8f93\u51fa\u548c\u6570\u503c\u8f6c\u6362\u8f85\u52a9\u51fd\u6570<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e5f\u5c31\u662f\u8bf4\uff0c\u8fd9\u4e2a\u9879\u76ee\u672c\u8d28\u4e0a\u662f\u4e00\u4e2a\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>\u91c7\u96c6\u5668 + \u5185\u5b58\u5feb\u7167 + HTTP \u670d\u52a1 + \u524d\u7aef\u6a21\u677f<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_%E6%A0%B8%E5%BF%83%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84\"><\/span>4. \u6838\u5fc3\u6570\u636e\u7ed3\u6784<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"41_gpuStat\"><\/span>4.1 <code>gpuStat<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7528\u4e8e\u8868\u793a\u5355\u5f20 GPU \u7684\u91c7\u96c6\u7ed3\u679c\uff0c\u5b57\u6bb5\u5305\u62ec\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Index<\/code><\/li>\n\n\n\n<li><code>Name<\/code><\/li>\n\n\n\n<li><code>Utilization<\/code><\/li>\n\n\n\n<li><code>MemoryUsedMB<\/code><\/li>\n\n\n\n<li><code>MemoryTotalMB<\/code><\/li>\n\n\n\n<li><code>TemperatureC<\/code><\/li>\n\n\n\n<li><code>PowerW<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e9b\u5b57\u6bb5\u6700\u7ec8\u4f1a\u88ab\u5e8f\u5217\u5316\u6210 JSON\uff0c\u7ed9\u524d\u7aef\u548c\u63a5\u53e3\u8c03\u7528\u65b9\u4f7f\u7528\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"42_snapshot\"><\/span>4.2 <code>snapshot<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7528\u4e8e\u8868\u793a\u67d0\u6b21\u5b8c\u6574\u91c7\u96c6\u7684\u5feb\u7167\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>CollectedAt<\/code>\uff1a\u91c7\u96c6\u65f6\u95f4<\/li>\n\n\n\n<li><code>GPUs<\/code>\uff1a\u5f53\u524d\u6240\u6709 GPU \u7684\u72b6\u6001<\/li>\n\n\n\n<li><code>LastError<\/code>\uff1a\u6700\u8fd1\u4e00\u6b21\u91c7\u96c6\u9519\u8bef<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8bbe\u8ba1\u4e0a\uff0c\u8fd9\u4e2a\u7ed3\u6784\u662f\u201c\u63a5\u53e3\u8f93\u51fa\u6a21\u578b\u201d\uff0c\u540e\u7aef\u6bcf\u6b21\u91c7\u96c6\u540e\u90fd\u4f1a\u6574\u4f53\u66ff\u6362\u5b83\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"43_monitor\"><\/span>4.3 <code>monitor<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">type monitor struct {<br> &nbsp; &nbsp;mu &nbsp; &nbsp; &nbsp; sync.RWMutex<br> &nbsp; &nbsp;snapshot snapshot<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b83\u662f\u6574\u4e2a\u670d\u52a1\u7684\u72b6\u6001\u5bb9\u5668\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>snapshot<\/code> \u4fdd\u5b58\u6700\u65b0\u4e00\u4efd GPU \u72b6\u6001<\/li>\n\n\n\n<li><code>mu<\/code> \u7528\u6765\u4fdd\u62a4\u5e76\u53d1\u8bfb\u5199<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u662f\u9879\u76ee\u7684\u72b6\u6001\u4e2d\u5fc3\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5_%E6%9C%8D%E5%8A%A1%E5%90%AF%E5%8A%A8%E6%AD%A5%E9%AA%A4\"><\/span>5. \u670d\u52a1\u542f\u52a8\u6b65\u9aa4<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>main()<\/code> \u7684\u542f\u52a8\u6b65\u9aa4\u6bd4\u8f83\u6e05\u6670\uff0c\u53ef\u4ee5\u6309\u987a\u5e8f\u7406\u89e3\uff1a<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"51_%E8%A7%A3%E6%9E%90%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0\"><\/span>5.1 \u89e3\u6790\u547d\u4ee4\u884c\u53c2\u6570<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">interval := flag.Duration(\"interval\", 2*time.Second, \"poll interval, e.g. 2s\")<br>addr := flag.String(\"addr\", \":8080\", \"http listen address\")<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u652f\u6301\u4e24\u4e2a\u53c2\u6570\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>-interval<\/code>\uff1a\u91c7\u96c6\u5468\u671f\uff0c\u9ed8\u8ba4 <code>2s<\/code><\/li>\n\n\n\n<li><code>-addr<\/code>\uff1a\u76d1\u542c\u5730\u5740\uff0c\u9ed8\u8ba4 <code>:8080<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"52_%E5%88%9D%E5%A7%8B%E5%8C%96%E6%9C%8D%E5%8A%A1%E7%8A%B6%E6%80%81\"><\/span>5.2 \u521d\u59cb\u5316\u670d\u52a1\u72b6\u6001<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">service := &amp;monitor{}<br>service.refresh()<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u4f1a\u5148\u6267\u884c\u4e00\u6b21 <code>refresh()<\/code>\uff0c\u76ee\u7684\u662f\u670d\u52a1\u521a\u542f\u52a8\u65f6\u5c31\u6709\u4e00\u4efd\u521d\u59cb\u5feb\u7167\uff0c\u800c\u4e0d\u662f\u7b49\u7b2c\u4e00\u4e2a\u5b9a\u65f6\u5668\u89e6\u53d1\u540e\u624d\u6709\u6570\u636e\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"53_%E5%88%9B%E5%BB%BA%E5%8F%AF%E5%8F%96%E6%B6%88%E4%B8%8A%E4%B8%8B%E6%96%87\"><\/span>5.3 \u521b\u5efa\u53ef\u53d6\u6d88\u4e0a\u4e0b\u6587<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e00\u6bb5\u7528\u6765\u76d1\u542c\u7cfb\u7edf\u9000\u51fa\u4fe1\u53f7\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>SIGINT<\/code><\/li>\n\n\n\n<li><code>SIGTERM<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u6536\u5230\u4fe1\u53f7\u540e\uff0c\u540e\u53f0\u91c7\u96c6\u5faa\u73af\u548c HTTP \u670d\u52a1\u90fd\u4f1a\u8d70\u4f18\u96c5\u9000\u51fa\u6d41\u7a0b\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"54_%E5%90%AF%E5%8A%A8%E5%90%8E%E5%8F%B0%E9%87%87%E9%9B%86%E5%8D%8F%E7%A8%8B\"><\/span>5.4 \u542f\u52a8\u540e\u53f0\u91c7\u96c6\u534f\u7a0b<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">go service.run(ctx, *interval)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u91cc\u542f\u52a8\u4e00\u4e2a goroutine\uff0c\u6309\u56fa\u5b9a\u5468\u671f\u6267\u884c GPU \u91c7\u96c6\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"55_%E6%B3%A8%E5%86%8C_HTTP_%E8%B7%AF%E7%94%B1\"><\/span>5.5 \u6ce8\u518c HTTP \u8def\u7531<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">mux.HandleFunc(\"\/\", service.handleDashboard)<br>mux.HandleFunc(\"\/healthz\", service.handleHealthz)<br>mux.HandleFunc(\"\/api\/v1\/gpus\", service.handleGPUs)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u524d\u53ea\u6709 3 \u4e2a\u8def\u7531\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>\/<\/code>\uff1a\u8fd4\u56de HTML Dashboard<\/li>\n\n\n\n<li><code>\/healthz<\/code>\uff1a\u8fd4\u56de\u5065\u5eb7\u72b6\u6001<\/li>\n\n\n\n<li><code>\/api\/v1\/gpus<\/code>\uff1a\u8fd4\u56de GPU \u5feb\u7167 JSON<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"56_%E5%90%AF%E5%8A%A8_HTTP_Server\"><\/span>5.6 \u542f\u52a8 HTTP Server<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">server.ListenAndServe()<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u540c\u65f6\u8fd8\u8d77\u4e86\u4e00\u4e2a goroutine \u76d1\u542c <code>ctx.Done()<\/code>\uff0c\u5728\u6536\u5230\u9000\u51fa\u4fe1\u53f7\u540e\u8c03\u7528\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">server.Shutdown(shutdownCtx)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u5c31\u662f\u6807\u51c6\u7684 Go \u4f18\u96c5\u505c\u673a\u6a21\u578b\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"6_%E5%90%8E%E5%8F%B0%E9%87%87%E9%9B%86%E6%B5%81%E7%A8%8B%E5%8E%9F%E7%90%86\"><\/span>6. \u540e\u53f0\u91c7\u96c6\u6d41\u7a0b\u539f\u7406<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u540e\u53f0\u91c7\u96c6\u7684\u6838\u5fc3\u5728 <code>run()<\/code> \u548c <code>refresh()<\/code>\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"61_run\"><\/span>6.1 <code>run()<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">ticker := time.NewTicker(interval)<br>for {<br> &nbsp; &nbsp;select {<br> &nbsp; &nbsp;case &lt;-ctx.Done():<br> &nbsp; &nbsp; &nbsp; &nbsp;return<br> &nbsp; &nbsp;case &lt;-ticker.C:<br> &nbsp; &nbsp; &nbsp; &nbsp;m.refresh()<br> &nbsp;  }<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u903b\u8f91\u5f88\u76f4\u63a5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u521b\u5efa\u4e00\u4e2a\u5468\u671f\u5b9a\u65f6\u5668<\/li>\n\n\n\n<li>\u6bcf\u6b21 tick \u5230\u8fbe\u65f6\u6267\u884c\u4e00\u6b21 <code>refresh()<\/code><\/li>\n\n\n\n<li>\u6536\u5230\u9000\u51fa\u4fe1\u53f7\u65f6\u7ed3\u675f\u5faa\u73af<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"62_refresh\"><\/span>6.2 <code>refresh()<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>refresh()<\/code> \u505a 3 \u4ef6\u4e8b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8c03\u7528 <code>collectGPUStats()<\/code> \u91c7\u96c6 GPU \u6570\u636e<\/li>\n\n\n\n<li>\u7ec4\u88c5\u6210\u65b0\u7684 <code>snapshot<\/code><\/li>\n\n\n\n<li>\u7528\u5199\u9501\u66ff\u6362\u65e7\u5feb\u7167<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u5173\u952e\u70b9\u662f\u201c\u6574\u4f53\u66ff\u6362\u5feb\u7167\u201d\uff0c\u800c\u4e0d\u662f\u8fb9\u91c7\u96c6\u8fb9\u66f4\u65b0\u67d0\u51e0\u4e2a\u5b57\u6bb5\u3002\u8fd9\u6837\u505a\u7684\u597d\u5904\u662f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u63a5\u53e3\u8bfb\u53d6\u5230\u7684\u6570\u636e\u662f\u4e00\u81f4\u7684<\/li>\n\n\n\n<li>\u4e0d\u5bb9\u6613\u51fa\u73b0\u534a\u66f4\u65b0\u72b6\u6001<\/li>\n\n\n\n<li>\u5e76\u53d1\u6a21\u578b\u7b80\u5355<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"7_GPU_%E9%87%87%E9%9B%86%E5%8E%9F%E7%90%86\"><\/span>7. GPU \u91c7\u96c6\u539f\u7406<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u91c7\u96c6\u6838\u5fc3\u5728 <code>collectGPUStats()<\/code>\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"71_%E8%B0%83%E7%94%A8%E5%A4%96%E9%83%A8%E5%91%BD%E4%BB%A4\"><\/span>7.1 \u8c03\u7528\u5916\u90e8\u547d\u4ee4<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">exec.Command(<br> &nbsp; &nbsp;\"nvidia-smi\",<br> &nbsp; &nbsp;\"--query-gpu=index,name,utilization.gpu,memory.used,memory.total,temperature.gpu,power.draw\",<br> &nbsp; &nbsp;\"--format=csv,noheader,nounits\",<br>)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e5f\u5c31\u662f\u8bf4\uff0c\u8fd9\u4e2a\u9879\u76ee\u5e76\u4e0d\u76f4\u63a5\u8c03\u7528 NVIDIA SDK\uff0c\u800c\u662f\u4f9d\u8d56\u7cfb\u7edf\u91cc\u5df2\u6709\u7684 <code>nvidia-smi<\/code>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u5e26\u6765\u4e24\u4e2a\u524d\u63d0\u6761\u4ef6\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u673a\u5668\u5fc5\u987b\u5b89\u88c5 NVIDIA \u9a71\u52a8<\/li>\n\n\n\n<li><code>nvidia-smi<\/code> \u5fc5\u987b\u5728 PATH \u4e2d\u53ef\u6267\u884c<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"72_CSV_%E8%A7%A3%E6%9E%90\"><\/span>7.2 CSV \u89e3\u6790<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u547d\u4ee4\u8f93\u51fa\u540e\uff0c\u4ee3\u7801\u4f7f\u7528\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">csv.NewReader(strings.NewReader(string(output)))<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u89e3\u6790\u4e3a\u591a\u884c\u8bb0\u5f55\uff0c\u6bcf\u4e00\u884c\u4ee3\u8868\u4e00\u5f20 GPU\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"73_%E5%AD%97%E6%AE%B5%E8%BD%AC%E6%8D%A2\"><\/span>7.3 \u5b57\u6bb5\u8f6c\u6362<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6bcf\u6761\u8bb0\u5f55\u957f\u5ea6\u5fc5\u987b\u662f 7\uff0c\u5426\u5219\u62a5\u9519\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if len(record) != 7 {<br> &nbsp; &nbsp;return nil, fmt.Errorf(\"unexpected nvidia-smi record length: got %d, want 7\", len(record))<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u7136\u540e\u5206\u522b\u8f6c\u6362\u6210\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>int<\/li>\n\n\n\n<li>float64<\/li>\n\n\n\n<li>string<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u6700\u7ec8\u62fc\u6210 <code>[]gpuStat<\/code>\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"74_%E5%AE%B9%E9%94%99%E6%96%B9%E5%BC%8F\"><\/span>7.4 \u5bb9\u9519\u65b9\u5f0f<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>mustAtoi()<\/code> \u548c <code>mustAtof()<\/code> \u8f6c\u6362\u5931\u8d25\u65f6\u76f4\u63a5\u8fd4\u56de <code>0<\/code>\uff0c\u4e0d\u4f1a\u4e2d\u65ad\u6574\u4e2a\u6d41\u7a0b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u79cd\u7b56\u7565\u7684\u7279\u70b9\u662f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u670d\u52a1\u66f4\u7a33\u5b9a<\/li>\n\n\n\n<li>\u5355\u4e2a\u5b57\u6bb5\u5f02\u5e38\u4e0d\u4f1a\u5bfc\u81f4\u6574\u6b21\u91c7\u96c6\u5931\u8d25<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4f46\u526f\u4f5c\u7528\u4e5f\u5f88\u660e\u663e\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u67d0\u4e9b\u89e3\u6790\u95ee\u9898\u4f1a\u88ab\u9759\u9ed8\u541e\u6389<\/li>\n\n\n\n<li>\u6570\u636e\u9519\u8bef\u4e0d\u4e00\u5b9a\u80fd\u88ab\u7b2c\u4e00\u65f6\u95f4\u53d1\u73b0<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"8_HTTP_%E6%8E%A5%E5%8F%A3%E5%8E%9F%E7%90%86\"><\/span>8. HTTP \u63a5\u53e3\u539f\u7406<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"81_apiv1gpus\"><\/span>8.1 <code>\/api\/v1\/gpus<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u903b\u8f91\u6700\u7b80\u5355\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u52a0\u8bfb\u9501<\/li>\n\n\n\n<li>\u8bfb\u53d6\u5f53\u524d\u5feb\u7167<\/li>\n\n\n\n<li>\u8f93\u51fa JSON<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u662f\u771f\u6b63\u7ed9\u524d\u7aef\u4f7f\u7528\u7684\u4e3b\u6570\u636e\u63a5\u53e3\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"82_healthz\"><\/span>8.2 <code>\/healthz<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5065\u5eb7\u68c0\u67e5\u7684\u5224\u5b9a\u89c4\u5219\u662f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5982\u679c <code>LastError == \"\"<\/code>\uff0c\u8fd4\u56de <code>200 ok<\/code><\/li>\n\n\n\n<li>\u5982\u679c <code>LastError != \"\"<\/code>\uff0c\u8fd4\u56de <code>503 degraded<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd4\u56de\u5185\u5bb9\u5305\u542b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>status<\/code><\/li>\n\n\n\n<li><code>collected_at<\/code><\/li>\n\n\n\n<li><code>gpu_count<\/code><\/li>\n\n\n\n<li><code>last_error<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u63a5\u53e3\u9002\u5408\u88ab\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u53cd\u5411\u4ee3\u7406<\/li>\n\n\n\n<li>\u5bb9\u5668\u63a2\u9488<\/li>\n\n\n\n<li>\u76d1\u63a7\u7cfb\u7edf<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u7528\u4e8e\u5224\u65ad\u670d\u52a1\u662f\u5426\u6b63\u5e38\u91c7\u96c6\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"83\"><\/span>8.3 <code>\/<\/code><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6839\u8def\u5f84\u76f4\u63a5\u8f93\u51fa <code>dashboardTemplate<\/code>\uff0c\u6ca1\u6709\u72ec\u7acb\u524d\u7aef\u5de5\u7a0b\uff0c\u4e5f\u6ca1\u6709\u9759\u6001\u8d44\u6e90\u76ee\u5f55\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e5f\u5c31\u662f\u8bf4\u524d\u7aef\u662f\u201c\u540e\u7aef\u5185\u5d4c\u6a21\u677f\u9875\u9762\u201d\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"9_Dashboard_%E9%A1%B5%E9%9D%A2%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86\"><\/span>9. Dashboard \u9875\u9762\u5de5\u4f5c\u539f\u7406<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9875\u9762\u6a21\u677f\u5b8c\u5168\u5199\u5728 Go \u6e90\u7801\u5b57\u7b26\u4e32\u91cc\uff0c\u901a\u8fc7\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">template.Must(template.New(\"dashboard\").Parse(...))<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u542f\u52a8\u65f6\u5b8c\u6210\u89e3\u6790\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u524d\u7aef\u903b\u8f91\u662f\u7eaf\u539f\u751f JavaScript\uff0c\u6ca1\u6709\u4efb\u4f55\u6846\u67b6\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"91_%E9%A6%96%E6%AC%A1%E5%8A%A0%E8%BD%BD\"><\/span>9.1 \u9996\u6b21\u52a0\u8f7d<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u9875\u9762\u52a0\u8f7d\u540e\u7acb\u5373\u6267\u884c\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">load();<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"92_%E5%AE%9A%E6%97%B6%E5%88%B7%E6%96%B0\"><\/span>9.2 \u5b9a\u65f6\u5237\u65b0<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7136\u540e\u6bcf 2 \u79d2\u6267\u884c\u4e00\u6b21\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">setInterval(load, 2000);<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"93_load_%E5%81%9A%E4%BA%86%E4%BB%80%E4%B9%88\"><\/span>9.3 <code>load()<\/code> \u505a\u4e86\u4ec0\u4e48<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><code>load()<\/code> \u7684\u6b65\u9aa4\u5982\u4e0b\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u8c03\u7528 <code>\/api\/v1\/gpus<\/code><\/li>\n\n\n\n<li>\u628a\u8fd4\u56de JSON \u89e3\u6790\u6210\u5bf9\u8c61<\/li>\n\n\n\n<li>\u66f4\u65b0 GPU \u6570\u91cf\u548c\u91c7\u96c6\u65f6\u95f4<\/li>\n\n\n\n<li>\u6e32\u67d3\u6bcf\u5f20 GPU \u5361\u7247<\/li>\n\n\n\n<li>\u5982\u679c\u6709 <code>last_error<\/code>\uff0c\u663e\u793a\u964d\u7ea7\u72b6\u6001<\/li>\n\n\n\n<li>\u5982\u679c\u8bf7\u6c42\u5931\u8d25\uff0c\u663e\u793a\u65ad\u8fde\u72b6\u6001<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"94_%E9%A1%B5%E9%9D%A2%E5%91%88%E7%8E%B0%E6%A8%A1%E5%9E%8B\"><\/span>9.4 \u9875\u9762\u5448\u73b0\u6a21\u578b<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u524d\u7aef\u4e0d\u4f1a\u4fdd\u7559\u590d\u6742\u72b6\u6001\uff0c\u800c\u662f\u6bcf\u6b21\u62ff\u5230\u5b8c\u6574\u5feb\u7167\u540e\u6574\u4f53\u91cd\u7ed8\u5361\u7247\u533a\u57df\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u79cd\u65b9\u5f0f\u9002\u5408\u5f53\u524d\u8fd9\u79cd\u5c0f\u4f53\u91cf\u9875\u9762\uff0c\u56e0\u4e3a\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6570\u636e\u91cf\u5f88\u5c0f<\/li>\n\n\n\n<li>\u5b9e\u73b0\u7b80\u5355<\/li>\n\n\n\n<li>\u4e0d\u9700\u8981\u5f15\u5165\u72b6\u6001\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"10_%E5%B9%B6%E5%8F%91%E4%B8%8E%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E8%AE%BE%E8%AE%A1\"><\/span>10. \u5e76\u53d1\u4e0e\u7ebf\u7a0b\u5b89\u5168\u8bbe\u8ba1<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e2a\u9879\u76ee\u7684\u5e76\u53d1\u6a21\u578b\u975e\u5e38\u7b80\u5355\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e00\u4e2a goroutine \u5468\u671f\u6027\u5199\u5feb\u7167<\/li>\n\n\n\n<li>\u591a\u4e2a HTTP \u8bf7\u6c42\u5e76\u53d1\u8bfb\u5feb\u7167<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u901a\u8fc7 <code>sync.RWMutex<\/code> \u5b9e\u73b0\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>refresh()<\/code> \u7528\u5199\u9501<\/li>\n\n\n\n<li><code>handleHealthz()<\/code> \/ <code>handleGPUs()<\/code> \u7528\u8bfb\u9501<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u5957\u8bbe\u8ba1\u5bf9\u5f53\u524d\u573a\u666f\u662f\u8db3\u591f\u7684\uff0c\u56e0\u4e3a\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5199\u9891\u7387\u4f4e<\/li>\n\n\n\n<li>\u6bcf\u6b21\u5199\u5165\u5185\u5bb9\u5f88\u5c0f<\/li>\n\n\n\n<li>\u8bfb\u8bf7\u6c42\u53ea\u8bfb\u5185\u5b58<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"11_%E8%BF%90%E8%A1%8C%E6%AD%A5%E9%AA%A4%E5%8E%9F%E7%90%86\"><\/span>11. \u8fd0\u884c\u6b65\u9aa4\u539f\u7406<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5982\u679c\u4ece\u6e90\u7801\u8fd0\u884c\uff0c\u5b9e\u9645\u6b65\u9aa4\u662f\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Go \u7f16\u8bd1 <code>cmd\/server\/main.go<\/code><\/li>\n\n\n\n<li>\u8fdb\u7a0b\u542f\u52a8\u540e\u89e3\u6790\u53c2\u6570<\/li>\n\n\n\n<li>\u7acb\u5373\u6267\u884c\u4e00\u6b21 GPU \u91c7\u96c6<\/li>\n\n\n\n<li>\u542f\u52a8\u5b9a\u65f6\u91c7\u96c6 goroutine<\/li>\n\n\n\n<li>\u542f\u52a8 HTTP \u670d\u52a1\u76d1\u542c\u7aef\u53e3<\/li>\n\n\n\n<li>\u6d4f\u89c8\u5668\u8bbf\u95ee <code>\/<\/code><\/li>\n\n\n\n<li>\u9875\u9762\u6bcf 2 \u79d2\u8f6e\u8be2 <code>\/api\/v1\/gpus<\/code><\/li>\n\n\n\n<li>\u9875\u9762\u5c55\u793a\u6700\u65b0 GPU \u5feb\u7167<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u5c31\u662f\u5b8c\u6574\u7684\u6570\u636e\u6d41\u95ed\u73af\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u53ef\u4ee5\u7b80\u5316\u4e3a\uff1a<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>nvidia-smi -&gt; Go \u540e\u7aef\u91c7\u96c6 -&gt; \u5185\u5b58\u5feb\u7167 -&gt; JSON \u63a5\u53e3 -&gt; Dashboard \u8f6e\u8be2\u5c55\u793a<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"12_configconfigyaml_%E5%BD%93%E5%89%8D%E7%8A%B6%E6%80%81\"><\/span>12. <code>config\/config.yaml<\/code> \u5f53\u524d\u72b6\u6001<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ed3\u5e93\u91cc\u867d\u7136\u5b58\u5728 <code>config\/config.yaml<\/code>\uff0c\u4f46\u5f53\u524d\u4ee3\u7801\u6ca1\u6709\u8bfb\u53d6\u5b83\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e5f\u5c31\u662f\u8bf4\u8fd9\u4e2a\u914d\u7f6e\u6587\u4ef6\u73b0\u5728\u53ea\u662f\u201c\u58f0\u660e\u6027\u6587\u4ef6\u201d\uff0c\u6ca1\u6709\u53c2\u4e0e\u5b9e\u9645\u8fd0\u884c\u903b\u8f91\u3002\u5f53\u524d\u771f\u6b63\u751f\u6548\u7684\u662f\u547d\u4ee4\u884c\u53c2\u6570\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>-addr<\/code><\/li>\n\n\n\n<li><code>-interval<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u8bf4\u660e\u9879\u76ee\u5904\u4e8e\u4e00\u4e2a\u201c\u9884\u7559\u914d\u7f6e\u6587\u4ef6\uff0c\u4f46\u5c1a\u672a\u63a5\u5165\u201d\u7684\u72b6\u6001\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"13_%E5%BD%93%E5%89%8D%E5%AE%9E%E7%8E%B0%E7%9A%84%E4%BC%98%E7%82%B9\"><\/span>13. \u5f53\u524d\u5b9e\u73b0\u7684\u4f18\u70b9<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6ca1\u6709\u7b2c\u4e09\u65b9\u4f9d\u8d56\uff0c\u90e8\u7f72\u7b80\u5355<\/li>\n\n\n\n<li>\u540e\u7aef\u548c\u524d\u7aef\u90fd\u5f88\u8f7b\u91cf<\/li>\n\n\n\n<li>\u6570\u636e\u6d41\u77ed\uff0c\u8c03\u8bd5\u6210\u672c\u4f4e<\/li>\n\n\n\n<li>\u4f7f\u7528\u5185\u5b58\u5feb\u7167\uff0c\u63a5\u53e3\u54cd\u5e94\u5feb<\/li>\n\n\n\n<li>\u6709\u57fa\u672c\u7684\u5065\u5eb7\u68c0\u67e5\u63a5\u53e3<\/li>\n\n\n\n<li>\u6709\u4f18\u96c5\u505c\u673a\u903b\u8f91<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"14_%E7%9B%91%E6%8E%A7%E5%B1%95%E7%A4%BA\"><\/span>14. \u76d1\u63a7\u5c55\u793a<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"1396\" style=\"aspect-ratio: 2560 \/ 1396;\" width=\"2560\" controls src=\"https:\/\/www.dataz8.com\/wp-content\/uploads\/2026\/04\/gpu-monitor\u91c7\u96c6GPU\u72b6\u6001-1.mp4\"><\/video><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>1. \u9879\u76ee\u6982\u89c8 \u8fd9\u662f\u4e00\u4e2a\u975e\u5e38\u8f7b\u91cf\u7684 Go \u5355\u4f53\u670d\u52a1\uff0c\u804c\u8d23\u53ea\u6709 &#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_zb_attr":"","zolo_post_video_link":"","footnotes":""},"categories":[23,37],"tags":[],"series":[],"class_list":["post-1920","post","type-post","status-publish","format-standard","hentry","category-go","category-gpu"],"_links":{"self":[{"href":"https:\/\/www.dataz8.com\/index.php?rest_route=\/wp\/v2\/posts\/1920","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dataz8.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dataz8.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dataz8.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dataz8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1920"}],"version-history":[{"count":5,"href":"https:\/\/www.dataz8.com\/index.php?rest_route=\/wp\/v2\/posts\/1920\/revisions"}],"predecessor-version":[{"id":1929,"href":"https:\/\/www.dataz8.com\/index.php?rest_route=\/wp\/v2\/posts\/1920\/revisions\/1929"}],"wp:attachment":[{"href":"https:\/\/www.dataz8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1920"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dataz8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1920"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dataz8.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1920"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.dataz8.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=1920"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}