![cpu 使用率为 100%,但 top 没有显示任何进程使用它](https://linux22.com/image/82764/cpu%20%E4%BD%BF%E7%94%A8%E7%8E%87%E4%B8%BA%20100%25%EF%BC%8C%E4%BD%86%20top%20%E6%B2%A1%E6%9C%89%E6%98%BE%E7%A4%BA%E4%BB%BB%E4%BD%95%E8%BF%9B%E7%A8%8B%E4%BD%BF%E7%94%A8%E5%AE%83.png)
首先,我忘记保存进程列表。我不得不重新启动服务器,所以我无法提供太多信息。
我有一个小型 VPS。顶部和控制面板图表中的 cpu 使用率都是 100%,并且整天都很高(我今天早上注意到网络服务器没有回复请求)。重新启动 VPS 后,CPU 回到 4% 以下(只有我使用网络服务器,所以没有任何实际负载)。
可能是什么原因?如果再次发生这种情况我该如何调查?
答案1
它可能是内核进程、驱动程序或中断中消耗的 CPU。
这不是答案,而是解决问题的一种方法。此方法的一些细节是 Linux 特定的。安装sysstat
akasar
软件包并修改或添加 sar-collection crontab(在 RedHat 系统上/etc/cron.d/sysstat
):
* * * * * root /usr/lib64/sa/sa1 -L -F -S XALL 10 6
准备好在 的月份累积 3 GB 或更多/var/lib/sa
。如果您的版本既不支持也不支持-L
,-F
则添加以下 cron 条目:
57 23 * * * root rm -f /var/log/sa/sa`date --date=tomorrow +\%d`
一天之后,使用sar -f /var/log/sa/saXX -C
XX 为该月昨天的日期作为 0 前导的整数(即 01、02、... 10、11 ... 31)。当您发现 CPU 较高的时间窗口时,您可以检查该时间窗口的 sar 报告:
- 中断 (
-I ALL
) - 网络使用情况 (
-n DEV
) - 磁盘 I/O (
-b
)
假设您看到 CPU 在 10:15 和 10:18 之间跳跃。在当天 (05) 运行 sar,如下所示:
sar -f /var/log/sa/sa05 -s 10:14:00 -e 10:19:00 -I ALL -n DEV -b | less
我们在两侧各增加一分钟,以便您可以在之前/期间/之后观察,而不仅仅是期间。
如果您仍然没有看到任何内容,并且您已经查看了其他 sar 参数,并且您仍然看不到任何东西,尝试将其添加到 cron:
* * * * * { date; /bin/ps -A --sort tty,comm,pid -ww -o pgrp:8,tty:7,pid,c,pmem:5,rss:8,sz:8,size:8=TSIZE,vsz:8,nlwp,lstart,args ;} >>/var/log/procscan
这个文件会变得非常大,所以一定要轮换它或在第二天禁用 cronjob。但从这个输出中,您可能会找到罪魁祸首。
为了解决这个 cronjob 的一些问题,我创建了一个包装脚本和一组支持文件,并将它们放在 github 上。你可以找到他们这里(链接到 github 上的项目)