Golang实时获取GPU使用率的实现方法
在Golang中想要实时获取GPU使用率,有什么可靠的实现方法吗?目前查到的资料大多是Python或C++的方案,不太清楚Go语言是否有成熟的库可以直接调用,或者需要自己通过CGO封装底层API?如果能提供具体的代码示例就更好了,主要是想监控NVIDIA显卡的使用情况。
2 回复
在Golang中实时获取GPU使用率,可以通过以下方法实现:
-
调用NVIDIA管理库(NVML)
- 使用
go-nvml库(github.com/NVIDIA/go-nvml) - 初始化NVML后调用
DeviceGetUtilizationRates获取GPU利用率 - 示例代码:
nvml.Init() defer nvml.Shutdown() handle, _ := nvml.DeviceGetHandleByIndex(0) utilization, _ := handle.GetUtilizationRates() fmt.Printf("GPU使用率: %d%%\n", utilization.Gpu)
- 使用
-
执行系统命令
- 调用
nvidia-smi命令解析输出:cmd := exec.Command("nvidia-smi", "--query-gpu=utilization.gpu", "--format=csv,noheader,nounits") output, _ := cmd.Output() // 解析字符串输出为数字
- 调用
-
注意事项
- 需提前安装NVIDIA驱动和CUDA工具包
- 注意错误处理和资源释放
- 循环获取时可配合
time.Sleep实现定时采样
推荐优先使用NVML库,性能更好且无需解析文本。
更多关于Golang实时获取GPU使用率的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中实时获取GPU使用率,可以通过以下几种方法实现:
方法一:使用NVIDIA DCGM库(推荐)
package main
import (
"fmt"
"time"
"github.com/NVIDIA/go-dcgm/pkg/dcgm"
)
func main() {
// 初始化DCGM
cleanup, err := dcgm.Init(dcgm.Standalone, "0.0.0.0:5555", "localhost")
if err != nil {
panic(err)
}
defer cleanup()
// 获取GPU列表
gpus, err := dcgm.GetAllDevices()
if err != nil {
panic(err)
}
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
for range ticker.C {
for _, gpu := range gpus {
// 获取GPU利用率
utilization, err := dcgm.GetLatestValueForField(gpu, dcgm.DCGM_FI_DEV_GPU_UTIL)
if err != nil {
fmt.Printf("Error getting GPU %d utilization: %v\n", gpu, err)
continue
}
fmt.Printf("GPU %d: %.1f%%\n", gpu, utilization.Float64())
}
fmt.Println("---")
}
}
方法二:通过nvidia-smi命令解析
package main
import (
"bytes"
"encoding/json"
"fmt"
"os/exec"
"time"
)
type GPUInfo struct {
Utilization struct {
GPUUtil string `json:"gpu_util"`
} `json:"utilization"`
}
func getGPUUsage() (map[int]float64, error) {
cmd := exec.Command("nvidia-smi", "--query-gpu=index,utilization.gpu", "--format=csv,noheader,nounits")
var out bytes.Buffer
cmd.Stdout = &out
err := cmd.Run()
if err != nil {
return nil, err
}
result := make(map[int]float64)
lines := bytes.Split(out.Bytes(), []byte("\n"))
for _, line := range lines {
if len(line) == 0 {
continue
}
var gpuIndex int
var utilization float64
_, err := fmt.Sscanf(string(line), "%d, %f", &gpuIndex, &utilization)
if err == nil {
result[gpuIndex] = utilization
}
}
return result, nil
}
func main() {
ticker := time.NewTicker(1 * time.Second)
defer ticker.Stop()
for range ticker.C {
usage, err := getGPUUsage()
if err != nil {
fmt.Printf("Error: %v\n", err)
continue
}
for gpu, util := range usage {
fmt.Printf("GPU %d: %.1f%%\n", gpu, util)
}
fmt.Println("---")
}
}
安装依赖
对于方法一,需要安装DCGM库:
go mod init gpu-monitor
go get github.com/NVIDIA/go-dcgm/pkg/dcgm
对于方法二,需要确保系统已安装nvidia-smi工具。
推荐方案
- 生产环境:推荐使用DCGM方法,性能更好且更稳定
- 简单场景:使用nvidia-smi解析方法,部署更简单
两种方法都能实现实时监控GPU使用率,选择哪种取决于具体需求和环境配置。

