NVIDIA GPU 性能调优与诊断完全指南
本文为多 GPU 用户(如 3*RTX A4000 系统)提供一份全面的调优与诊断手册,涵盖功率限制、风扇控制、频率锁定、缓存清理、GPU 重置与性能测试工具等操作命令,适合开发者与研究人员在部署前进行系统级优化与验证。
📌 目录
- 基础信息查看
- 性能设置与调优
- 风扇控制
- 上下文与缓存清理
- GPU 重置与驱动重载
- 性能测试工具
- 多卡建议与 NUMA 绑定
📊 基础信息查看
nvidia-smi # 总览 GPU 状态
nvidia-smi -L # 查看 GPU 列表及 ID
nvidia-smi topo --matrix # GPU/CPU/NUMA 拓扑结构
nvidia-smi -q # 显卡完整诊断数据
nvidia-smi -q -d TEMPERATURE # 查看温度信息
nvidia-smi -q -d POWER # 功耗信息
nvidia-smi -q -d CLOCK # 当前频率与调频状态
🚀 性能设置与调优
设置所有 GPU 最大功耗(例如 A4000 为 140W)
for i in 0 1 2; dosudo nvidia-smi -i $i -pl 140
done
强制最大性能模式(保持 P0)
for i in 0 1 2; dosudo nvidia-settings -a "[gpu:$i]/GpuPowerMizerMode=2"
done
注意:需图形界面(X Server)下执行,可加
DISPLAY=:0
。
关于详细GPU P-State 模式说明 见博客: GPU P-State 模式说明
锁定 GPU 核心频率(如锁为 2100MHz)
for i in 0 1 2; dosudo nvidia-smi -i $i -lgc 2100,2100
done
恢复自动:
for i in 0 1 2; dosudo nvidia-smi -i $i -rgc
done
❄️ 风扇控制
开启手动风扇模式并设置为最大(建议冷却 A4000)
for i in 0 1 2; dosudo nvidia-settings -a "[gpu:$i]/GPUFanControlState=1"sudo nvidia-settings -a "[fan:$i]/GPUTargetFanSpeed=100"
done
关闭手动控制:
for i in 0 1 2; dosudo nvidia-settings -a "[gpu:$i]/GPUFanControlState=0"
done
🧽 上下文与缓存清理
rm -rf ~/.nv/
sudo rm -rf /tmp/*nvidia*
export CUDNN_CACHE_DISABLE=1
🔁 GPU 重置与驱动重载
GPU 热重置(前提是无占用)
for i in 0 1 2; dosudo nvidia-smi --gpu-reset -i $i
done
如遇失败,先杀掉占用 GPU 的进程:
sudo fuser -v /dev/nvidia*
sudo kill <PID>
驱动模块重载(关闭图形界面后操作)
sudo systemctl isolate multi-user.target
sudo rmmod nvidia_uvm nvidia_drm nvidia_modeset nvidia
sudo modprobe nvidia
sudo systemctl isolate graphical.target
🧪 性能测试工具
GPU-Burn:满载测试
(效果不佳,功率跑不满)
git clone https://github.com/wilicc/gpu-burn
cd gpu-burn
make
./gpu_burn 60
glmark2:OpenGL 图形压力测试
(对专业级显卡适应性感觉不太强)
sudo apt install glmark2
glmark2
stress-ng:联合 CPU/GPU/内存测试
sudo apt install stress-ng
stress-ng --cpu 8 --io 4 --vm 2 --vm-bytes 2G --timeout 60s
🎯 多卡建议与 NUMA 绑定
NUMA 对齐运行:确保任务绑定到与目标 GPU 同一 NUMA 节点的 CPU 上
numactl --cpunodebind=1 --membind=1 ./your_program_for_gpu1
可通过 nvidia-smi topo --matrix
查找 NUMA 对应关系。
建议:
- 同一进程内最好只绑定到一个 GPU 的 NUMA 区域 CPU;
- 多线程程序需使用 CPU 亲和性 API 或 OpenMP/Thread pinning 明确分配线程;
- 使用
cudaSetDevice()
+cudaMemcpyPeerAsync()
明确分配 GPU 资源,避免 GPU0、GPU1 跨 NUMA 频繁拷贝。
📈 实时监控建议
watch -n 1 'nvidia-smi --query-gpu=index,temperature.gpu,pstate,clocks.gr,clocks.mem,utilization.gpu --format=csv'
📘 本指南适用于服务器冷启动、任务预热、调试性能退化、对比首次与持续运行性能差异等多种场景,建议结合
nvprof
/nsys
做进一步 profiling。