From c2e64804f3726b564ea536a2fd0366e522d4a7f0 Mon Sep 17 00:00:00 2001 From: yumusb <43062104+yumusb@users.noreply.github.com> Date: Mon, 20 Apr 2026 14:43:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20GPU=20=E9=87=87=E9=9B=86=E5=99=A8=20nvid?= =?UTF-8?q?ia-smi=20=E8=B0=83=E7=94=A8=E6=B7=BB=E5=8A=A0=2015=20=E7=A7=92?= =?UTF-8?q?=E8=B6=85=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit nvidia-smi 在 GPU 驱动异常时可能无限挂起,导致整个 metricsLoop 卡死。 使用 exec.CommandContext 为 initStatic 和 collectDynamic 中的 nvidia-smi 调用添加 15 秒超时保护。 Co-Authored-By: Claude Opus 4.7 --- pkg/agent/collector/gpu.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pkg/agent/collector/gpu.go b/pkg/agent/collector/gpu.go index 91918fe..4cbfb4f 100644 --- a/pkg/agent/collector/gpu.go +++ b/pkg/agent/collector/gpu.go @@ -1,15 +1,19 @@ package collector import ( + "context" "encoding/csv" "os/exec" "strconv" "strings" "sync" + "time" "github.com/dushixiang/pika/internal/protocol" ) +const nvidiaSmiTimeout = 15 * time.Second + // gpuStaticInfo GPU 静态信息 type gpuStaticInfo struct { Index int @@ -42,7 +46,9 @@ func (g *GPUCollector) initStatic() { } // 查询静态信息: index, name, uuid, memory.total - cmd := exec.Command("nvidia-smi", + ctx, cancel := context.WithTimeout(context.Background(), nvidiaSmiTimeout) + defer cancel() + cmd := exec.CommandContext(ctx, "nvidia-smi", "--query-gpu=index,name,uuid,memory.total", "--format=csv,noheader,nounits") @@ -105,7 +111,9 @@ func (g *GPUCollector) Collect() ([]*protocol.GPUData, error) { func (g *GPUCollector) collectDynamic() ([]*protocol.GPUData, error) { // 使用 nvidia-smi 查询动态数据 // 输出格式: index, temperature.gpu, utilization.gpu, memory.used, memory.free, power.draw, fan.speed - cmd := exec.Command("nvidia-smi", + ctx, cancel := context.WithTimeout(context.Background(), nvidiaSmiTimeout) + defer cancel() + cmd := exec.CommandContext(ctx, "nvidia-smi", "--query-gpu=index,temperature.gpu,utilization.gpu,memory.used,memory.free,power.draw,fan.speed", "--format=csv,noheader,nounits")