有没有什么方法可以查看哪些进程占用了最多的 CPU?
我有 AMAZON EC2 Linux,其 CPU 利用率达到 100%,导致我不得不重启系统。我甚至无法通过 SSH 登录(使用 putty)。
有什么方法可以查看是什么原因导致 CPU 使用率如此之高以及哪个进程导致了这种情况?
我知道sar
和top
命令,但我在任何地方都找不到进程执行历史记录。这是来自 Amazon EC2 监控工具的图像,但我想知道哪个进程导致了该问题:
我也尝试过ps -eo pcpu,args | sort -k 1 -r | head -100
但是没有发现如此高的 CPU 使用率。
答案1
有几种方法可以实现这一点。请注意,失控情况下的多个进程(而不仅仅是一个进程)完全有可能导致这种情况。
第一种方法是设置 pidstat 在后台运行并生成数据。
pidstat -u 600 >/var/log/pidstats.log & disown $!
这将为您提供每隔十分钟的系统运行情况的非常详细的概览。我建议您首先使用它,因为它会产生最有价值/最可靠的数据。
这里存在一个问题,主要是如果盒子进入失控的 CPU 循环并产生巨大的负载——您无法保证您的实际进程将在负载期间及时执行(如果有的话),所以您实际上可能会错过输出!
寻找这一问题的第二种方法是启用流程核算。这可能是一个长期选择。
accton on
这将启用进程记账(如果尚未添加)。如果之前没有运行,则需要一些时间来运行。
运行 24 小时后,您可以运行这样的命令(它将产生如下输出)
# sa --percentages --separate-times
108 100.00% 7.84re 100.00% 0.00u 100.00% 0.00s 100.00% 0avio 19803k
2 1.85% 0.00re 0.05% 0.00u 75.00% 0.00s 0.00% 0avio 29328k troff
2 1.85% 0.37re 4.73% 0.00u 25.00% 0.00s 44.44% 0avio 29632k man
7 6.48% 0.00re 0.01% 0.00u 0.00% 0.00s 44.44% 0avio 28400k ps
4 3.70% 0.00re 0.02% 0.00u 0.00% 0.00s 11.11% 0avio 9753k ***other*
26 24.07% 0.08re 1.01% 0.00u 0.00% 0.00s 0.00% 0avio 1130k sa
14 12.96% 0.00re 0.01% 0.00u 0.00% 0.00s 0.00% 0avio 28544k ksmtuned*
14 12.96% 0.00re 0.01% 0.00u 0.00% 0.00s 0.00% 0avio 28096k awk
14 12.96% 0.00re 0.01% 0.00u 0.00% 0.00s 0.00% 0avio 29623k man*
7 6.48% 7.00re 89.26% 0.00u 0.00% 0.00s
各列的排序如下:
- 呼叫次数
- 呼叫百分比
- 所有此类进程所花费的实际时间。
- 百分比。
- 用户 CPU 时间
- 百分比
- 系统 CPU 时间。
- 平均 IO 调用。
- 百分比
- 命令名称
您要寻找的是产生最多用户/系统 CPU 时间的进程类型。
这会将数据细分为 CPU 时间总量(顶行)以及 CPU 时间的分配方式。进程记账仅在进程生成时启用时才能正确记账,因此最好在启用后重新启动系统以确保所有服务都得到记账。
这实际上并不能让您确切地知道导致此问题的原因是什么,但可能会让您感觉良好。由于它可能是 24 小时的快照,因此结果可能会出现偏差,因此请记住这一点。它还应该始终记录,因为它是一项内核功能,并且与 pidstat 不同,即使在重负载下也始终会产生输出。
最后一个可用选项也使用进程记帐,因此您可以像上面一样将其打开,然后使用程序“lastcomm”生成在问题发生时执行的进程的一些统计信息以及每个进程的 CPU 统计信息。
lastcomm | grep "May 8 22:[01234]"
kworker/1:0 F root __ 0.00 secs Tue May 8 22:20
sleep root __ 0.00 secs Tue May 8 22:49
sa root pts/0 0.00 secs Tue May 8 22:49
sa root pts/0 0.00 secs Tue May 8 22:49
sa X root pts/0 0.00 secs Tue May 8 22:49
ksmtuned F root __ 0.00 secs Tue May 8 22:49
awk root __ 0.00 secs Tue May 8 22:49
这也可能会给你一些提示,让你知道是什么导致了问题。
答案2
答案3
答案4
一种解决方案是编写一个脚本,通过一分钟的 cron 或在睡眠循环中运行,并在发现平均负载超过一定限制时立即向您发送电子邮件/scp 作业/转储到 ebs 卷...并附带相关输出(dmesg、pstree -pa 和 ps aux,可能是 vmstat)...