我的 Ubuntu 18.04 随机冻结了几秒钟。我可以移动鼠标光标(有时),但除此之外操作系统没有响应,我无法切换到任何其他应用程序。
当它恢复时,我可以进入系统监视器并看到几秒钟前 CPU 使用率的峰值(虽然只达到 70%),但这并不能告诉我当时是什么使用了 CPU。
如何才能找出最近哪些进程占用了 CPU?(我不知道思考这是因为磁盘输入/输出)。
更新: 与此同时,我已经确定罪魁祸首是 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%。
答案1
除非使用捕获 CPU 活动的工具来监控系统,否则无法获取 CPU 利用率的历史记录。一种方法是运行 cpustat 并捕获输出,然后查看 CPU 利用率发生的位置,例如:
sudo apt-get install cpustat
cpustat -xS | tee cpu.log
当你遇到速度变慢的情况时,你可以查看 cpu.log 并查看哪些程序正在忙于运行。
答案2
尝试atop
通过连续进行系统状态快照来捕获过去活动的更图形化的方式是使用atop
。atop
类似于top
或 之类的程序htop
,但明显的区别在于它运行定期的 cron 作业来生成和保存完整的进程和系统活动数据。 这允许您稍后回到过去调查问题。atop
还提供了一个atopsar
类似于传统 Unix 的实用程序sar
。 这两个实用程序共享相同的系统数据快照数据库。
这是atop
显示磁盘利用率压力下的系统屏幕截图。请注意sda
LVM 上的 100% 磁盘利用率,它们以红色突出显示。来源:atop
作者 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
它将显示今天 ( :begin) 14:05 到 ( :end) 14:45-D
之间 () 磁盘使用率最高的 3 个进程。以了解更多详细使用情况。-b
-e
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)
您可以使用atop
和做更多的事情atopsar
。使用man atop
和man atopsar
了解详细信息。以上是它的要点。
答案3
根据我的经验,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
表示有多少百分比的CPU被阻塞哇等待 I/O 完成。此处的数字较大表明问题出在 I/O 上,而不是 CPU 使用率。还可用于确定瓶颈。 - Swap:
si
分别so
显示换入和换出的 KiB/s 数量。如果您有足够的 RAM,则应该几乎为 0。较高的数字表明您的内存需求超出了您的内存大小。 - I/O:
bi
并bo
显示从磁盘读取/写入的 KiB/s 数量(其中包括交换活动)。意外的高写入数字可能需要搜索执行该写入的进程(例如使用iotop
)。低/中数字的冻结表明您的磁盘很慢。