这个问题真的很奇怪。我时不时地会遇到非常令人不快的 CPU 峰值,大约 5 分钟内所有核心的 CPU 占用率达到 80-90%。当我在 htop 或系统监视器中查看 conky 并按 % CPU 排序时,我看不到任何占用如此多 CPU 的进程。
自此以后我唯一改变的是:
- 我转到了内核版本 2.6.35(家庭编译,从 2.6.24-1 升级)
- 我安装了 Nvidia 驱动程序 256.44(高于 256.34)
现在,我愿意降级其中一个或两个来查找问题,但我更愿意尽可能科学地进行操作,并在降级之前找出导致 CPU 爆炸的原因。
编辑:我的具体问题看起来像是他们最新驱动程序中的 nvidia 回归。其他人也出现了类似的峰值。
答案1
“大约 5 分钟内,所有核心的 CPU 繁忙程度达到 80-90%”
通过利用 sysstat 包中的 pidstat,您或许能够查明罪魁祸首。
只需运行pidstat -u | sort -nr -k 7,7 | head -10
,占用 CPU 最多的进程就应该位于最上面一行。
答案2
这可能是一个内核线程,大多数性能监视器默认隐藏这些线程。在 htop 中,您可以使用“K”(shift+k)隐藏/显示内核线程。
答案3
我将尝试使用一些 shell 脚本来查找问题的原因:
#!/bin/sh
MAXLOAD=100
CURRLOAD=`uptime | sed 's@.*load average: \([^,]*\).*@\1@' | sed 's@0\?.0\?@@'`
if [ $CURRLOAD -gt $MAXLOAD ]; then
ps -eo tid,pcpu,comm | sort -n -k 2 | tail -n 5 | \
mail -s "High load" -e [email protected]
fi
该脚本有两个变量MAXLOAD
和CURRLOAD
。第一个变量应为高负载乘以 100。因此,如果您遇到峰值并看到系统负载上升到 2 或 3,则应将其设置MAXLOAD
为 200 左右的某个值。$CURRLOAD
获取的输出uptime
,查找负载并删除点以及前导零。
如果某一时刻的负载过高,它会打印出 CPU 利用率最高的五个进程并将它们发送到[email protected]
。
该脚本应该可以帮助您找到峰值的原因,如果您知道原因,您也许可以解决您的问题。
答案4
最近修复了一些错误,可能会纠正此问题。如果您正在运行 Ubuntu,我建议您坚持使用 Ubuntu 内核,通过定期更新获取补丁。我建议安装 Lucid 以获得支持和稳定性。如果您知道 Lucid 中没有您需要的功能,您可以选择 Maverick。