fix: client only collect PCIe GPUs, filter virtual/integrated GPUs, add GC for memory optimization
This commit is contained in:
+34
-18
@@ -981,6 +981,9 @@ func collectLoop(done <-chan struct{}, wsURL, name string, interval time.Duratio
|
|||||||
case dataCh <- data:
|
case dataCh <- data:
|
||||||
default: // 满了就丢弃
|
default: // 满了就丢弃
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 每 10 轮触发一次 GC,减少内存占用
|
||||||
|
runtime.GC()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1162,37 +1165,50 @@ func collectGPUs() []GPUInfo {
|
|||||||
switch runtime.GOOS {
|
switch runtime.GOOS {
|
||||||
case "windows":
|
case "windows":
|
||||||
gpus := tryNvidiaSMI()
|
gpus := tryNvidiaSMI()
|
||||||
|
if len(gpus) > 0 {
|
||||||
|
return gpus
|
||||||
|
}
|
||||||
wmi := tryWMIGPU()
|
wmi := tryWMIGPU()
|
||||||
return mergeGPULists(gpus, wmi)
|
return filterPCIeGPUs(wmi)
|
||||||
case "linux":
|
case "linux":
|
||||||
gpus := tryNvidiaSMI()
|
gpus := tryNvidiaSMI()
|
||||||
|
if len(gpus) > 0 {
|
||||||
|
return gpus
|
||||||
|
}
|
||||||
lspci := tryLinuxGPU()
|
lspci := tryLinuxGPU()
|
||||||
return mergeGPULists(gpus, lspci)
|
return filterPCIeGPUs(lspci)
|
||||||
case "darwin":
|
case "darwin":
|
||||||
gpus := tryNvidiaSMI()
|
gpus := tryNvidiaSMI()
|
||||||
mac := tryMacGPU()
|
mac := tryMacGPU()
|
||||||
return mergeGPULists(gpus, mac)
|
return filterPCIeGPUs(append(gpus, mac...))
|
||||||
}
|
}
|
||||||
return tryNvidiaSMI()
|
return tryNvidiaSMI()
|
||||||
}
|
}
|
||||||
|
|
||||||
func mergeGPULists(nvidia, fallback []GPUInfo) []GPUInfo {
|
func filterPCIeGPUs(gpus []GPUInfo) []GPUInfo {
|
||||||
if len(nvidia) == 0 {
|
var result []GPUInfo
|
||||||
return fallback
|
for _, g := range gpus {
|
||||||
}
|
if !isVirtualGPU(g.Name) {
|
||||||
if len(fallback) == 0 {
|
result = append(result, g)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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 {
|
func tryNvidiaSMI() []GPUInfo {
|
||||||
|
|||||||
Reference in New Issue
Block a user