我怎样才能查看几秒钟前导致CPU使用率飙升并冻结系统的进程?

我的Ubuntu 18.04会随机冻结几秒钟。我可以移动鼠标指针(有时),但操作系统无响应,我无法切换到其他应用程序。 当它恢复后,我可以打开系统监视器,看到几秒钟前CPU使用率的飙升(尽管只有70%),但这不能告诉我是什么导致了CPU的使用。 你怎样才能找出最近是什么进程占用了CPU?(我不认为这是由于磁盘I/O引起的)。 更新: 与此同时,通过隔离可疑的应用程序,我已确定罪魁祸首是WebStorm,一款基于Java的IDE。在使用VS Code时,没有出现冻结问题。 以下是评论中要求的一些附加诊断信息。
$ free -h
              total        used        free      shared  buff/cache   available
Mem:            15G        8.6G        2.3G        2.0G        4.5G        4.4G
Swap:           15G        487M         15G
$ sysctl vm.swappiness
vm.swappiness = 10
当WebStorm冻结时,系统监视器中的负载确实会出现峰值,但远未达到100%。

编辑您的问题并向我展示free -hsysctl vm.swappiness。与我交流时,请以@heynnema开头,否则我可能会错过您的评论。 - heynnema
dmesg可能会或可能不会有帮助,这取决于特定的机制。 - chrylis -cautiouslyoptimistic-
关于像top -bn1 -o %CPU -c | head -17 >> $HOME/Desktop/monitor-top.txt这样的东西怎么样? - DK Bose
我将其作为脚本的一部分,使用了sleepwhile - DK Bose
可能你的内存不足 - Vertexwahn
@Vertexwahn:我使用Chrome时从来没有发生过这种情况,只有在使用WebStorm时才会出现。原来是WebStorm会冻结 - Dan Dascalescu
3个回答

获取CPU利用率的历史记录是不可能的,除非使用能够捕获CPU活动的工具监控系统。一种方法是运行cpustat并捕获输出,查看CPU利用率发生的位置,例如:
sudo apt-get install cpustat
cpustat -xS | tee cpu.log
当你遇到减速时,可以查看cpu.log文件,了解是什么在忙碌运行。

理论上是个好答案,但实际上输出结果没有显示超过6%的CPU使用率 - Dan Dascalescu
或许这是很多短暂进程。你可以使用forkstat来找到它们。 - Colin Ian King
如果在内核中启用并在系统上进行配置,进程账户可能会提供更好的记录。追踪一个经常出现的问题可能是值得的。 - mpez0
@DanDascalescu 如果您不以root身份运行cpustat,使其能够查看所有进程,我会期望出现这种输出。 - john01dav

试试atop

以一种更图形化的方式连续捕获系统状态快照的过去活动,可以使用atopatop类似于像tophtop这样的程序,但有一个显著的区别,它运行定期的cron作业来生成和保留完整的进程和系统活动数据。这使您可以在以后的时间回溯来调查问题。 atop还提供了一个实用程序atopsar,类似于传统的Unix sar。这两个实用程序共享相同的系统数据快照数据库。

下面是一个atop截图,显示了在磁盘利用率压力下的系统情况。请注意,红色高亮显示了sda和LVM上的100%磁盘利用率。图片来源:atop作者Gerlof Langeveld,atoptool.nl

atop screen showing disk-utilization stress in red (credit Gerlof Langeveld, atoptool.nl)

安装方法:

    sudo apt-get install atop
现在您需要等待约10分钟进行第一次会计快照。每个指标点每个实体使用快照。跟踪的实体包括: - 进程(按可执行文件) - 每个核心的CPU利用率、频率和缩放,系统与用户 - 内存和交换使用情况 - 磁盘分区:读取、写入、%利用率 - 网络接口:数据包进/出(UDP和TCP),错误,数据包重传等 所有指标都是对所观察到的快照的累积总数。

查看过去的活动

这实际上为您提供了一个小的“时间机器”。您可以向前或向后移动时间,以查看过去观察到的每个时间片段中发生的情况。
   atop -r [/var/log/atop/...]

没有快照文件参数,atop将显示过去一天的视图(选择任何现有的快照文件来显示不同的一天),从午夜开始。最重要的记住键是:

t        向前移动时间(到下一个时间片段)

T        向后移动时间(到上一个时间片段)

h        帮助

q        退出

快照增量通过在每个进程的exit()处使用进程账户正确实现,因此即使您有许多运行时间很短的进程,它们的部分总和也会被正确添加,并正确归属于适当的可执行文件和适当的时间片。

不仅仅捕捉进程,还捕捉整个系统状态。屏幕的上半部分显示了所有重要的系统指标,包括CPU、内存、磁盘和网络利用率。数据包括CPU频率和缩放因子、网络错误等等。为了更加有帮助性,异常值会以颜色进行突出显示,例如任何时间片磁盘利用率达到100%时会显示为鲜红色,接近最大值的数值会显示为不同的颜色,这样任何负载过高的实体都不容易被忽视。 如果你更喜欢批处理风格,可以使用"atopsar"而不是"atop"。例如,要以批处理方式转储完整的时间范围,可以使用以下命令:
   atopsar -D -b 14:05 -e 14:45

今天在14:05和14:45之间,显示前3个磁盘利用率(-D)最高的进程。详细使用方法请参考man atopsar

如果你想关注特定的子区域,你可以使用这些atopsar选项(atop以相同的字母进行交互):

    -C  sort processes in order of cpu-consumption (default)
    -M  sort processes in order of memory-consumption
    -D  sort processes in order of disk-activity
    -N  sort processes in order of network-activity
    -A  sort processes in order of most active resource (auto mode)

你可以利用 atopatopsar 做更多的事情。使用 man atopman atopsar 获取详细信息。上述是其要点。


很好的工具,谢谢!你可以简单地使用atopsar -O来打印所有过去时间间隔中的三个最耗CPU的进程。 - vlz

根据我的经验,Linux由于仅仅是CPU使用率过高而变得无响应是不常见的。过高的CPU使用率往往只会使一切变得有点迟缓。 另一方面,I/O问题(写入许多/大文件、交换、磁盘故障等)很容易导致系统无响应,所有事情似乎都停滞不前,然后可能再继续一段时间,然后再次停滞。甚至你的鼠标停止移动有时候也让我相信你的问题属于这个范畴。 一个相对简单且有效的确定是否是I/O问题的方法是使用标准工具vmstat。你可以在某个地方运行vmstat -w 5(在screen中或者只是在终端中);这将每5秒打印一行统计数据。然后你可以回头检查这些数字(和/或在AskUbuntu上发布它们 ;))在你遇到冻结之后。 输出看起来像这样:
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu--------
 r  b         swpd         free         buff        cache   si   so    bi    bo   in   cs  us  sy  id  wa  st
 3  0       865332       328876     18014392      8262980    0    0   108    89    7    7  21   6  73   0   0
 0  0       865332       330016     18006044      8267348    0    1     0   332 2169 8117  25   6  69   0   0
有趣的栏目(为此目的)包括: - CPU:`wa` 表示阻塞在等待 I/O 完成的 CPU 百分比。这里的高数值表明问题是 I/O,而不是 CPU 使用率。还可以用于确定瓶颈。 - 交换空间:`si` 和 `so` 分别显示每秒交换的 KiB 数量。如果你有足够的内存,应该几乎为 0。较高的数值表明你的内存需求超过了内存大小。 - I/O:`bi` 和 `bo` 显示从磁盘读取/写入的每秒 KiB 数量(交换活动也包括在内)。意外的高写入数值可能需要查找进行写入的进程(例如使用 `iotop`)。低/中等数值的冻结表明你的磁盘速度较慢。