Linux CPU 使用率和进程执行历史记录

Linux CPU 使用率和进程执行历史记录

有没有什么方法可以查看哪些进程占用了最多的 CPU?

我有 AMAZON EC2 Linux,其 CPU 利用率达到 100%,导致我不得不重启系统。我甚至无法通过 SSH 登录(使用 putty)。

有什么方法可以查看是什么原因导致 CPU 使用率如此之高以及哪个进程导致了这种情况?

我知道sartop命令,但我在任何地方都找不到进程执行历史记录。这是来自 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    

各列的排序如下:

  1. 呼叫次数
  2. 呼叫百分比
  3. 所有此类进程所花费的实际时间。
  4. 百分比。
  5. 用户 CPU 时间
  6. 百分比
  7. 系统 CPU 时间。
  8. 平均 IO 调用。
  9. 百分比
  10. 命令名称

您要寻找的是产生最多用户/系统 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

在顶上是一个特别方便的守护进程,用于查看深入到进程级别的信息,默认情况下会将这些数据存档 28 天。除了提供出色的实时监控界面外,您还可以指定要打开并逐步查看的日志文件。

文章给出了一些功能的概念,你可以在手册页

这确实是一个非常棒的软件。

答案3

诸如普斯蒙监控也许对你有帮助。它们可以监控你系统上运行的进程,如果超过任何阈值(CPU 使用率、内存使用率……),你可以设置它们向你发送有关正在发生的事情的电子邮件报告。

还可以自动重新启动行为异常的进程。

答案4

一种解决方案是编写一个脚本,通过一分钟的 cron 或在睡眠循环中运行,并在发现平均负载超过一定限制时立即向您发送电子邮件/scp 作业/转储到 ebs 卷...并附带相关输出(dmesg、pstree -pa 和 ps aux,可能是 vmstat)...

相关内容