diff --git a/cmd/client/main.go b/cmd/client/main.go index 15e4329..b8c29bf 100644 --- a/cmd/client/main.go +++ b/cmd/client/main.go @@ -981,6 +981,9 @@ func collectLoop(done <-chan struct{}, wsURL, name string, interval time.Duratio case dataCh <- data: default: // 满了就丢弃 } + + // 每 10 轮触发一次 GC,减少内存占用 + runtime.GC() } } @@ -1162,37 +1165,50 @@ func collectGPUs() []GPUInfo { switch runtime.GOOS { case "windows": gpus := tryNvidiaSMI() + if len(gpus) > 0 { + return gpus + } wmi := tryWMIGPU() - return mergeGPULists(gpus, wmi) + return filterPCIeGPUs(wmi) case "linux": gpus := tryNvidiaSMI() + if len(gpus) > 0 { + return gpus + } lspci := tryLinuxGPU() - return mergeGPULists(gpus, lspci) + return filterPCIeGPUs(lspci) case "darwin": gpus := tryNvidiaSMI() mac := tryMacGPU() - return mergeGPULists(gpus, mac) + return filterPCIeGPUs(append(gpus, mac...)) } return tryNvidiaSMI() } -func mergeGPULists(nvidia, fallback []GPUInfo) []GPUInfo { - if len(nvidia) == 0 { - return fallback - } - if len(fallback) == 0 { - return nvidia - } - exist := make(map[string]bool) - for _, g := range nvidia { - exist[g.Name] = true - } - for _, g := range fallback { - if !exist[g.Name] { - nvidia = append(nvidia, g) +func filterPCIeGPUs(gpus []GPUInfo) []GPUInfo { + var result []GPUInfo + for _, g := range gpus { + if !isVirtualGPU(g.Name) { + result = append(result, g) } } - return nvidia + return result +} + +func isVirtualGPU(name string) bool { + name = strings.ToLower(name) + blacklist := []string{ + "microsoft", "basic render", "vmware", "virtual", "hyper-v", + "parallels", "virtualbox", "intel", "remote", "rdp", "citrix", + "teamviewer", "anydesk", "parsec", "splashtop", "oray", + "sunlogin", "todesk", "amdgpu-pro", + } + for _, v := range blacklist { + if strings.Contains(name, v) { + return true + } + } + return false } func tryNvidiaSMI() []GPUInfo {