场景:突然间,我的电脑运行缓慢。鼠标可以移动,但窗口需要很长时间才能打开等。uptime
显示负载为 7.69 并且还在增加。
找出导致负载增加的进程的最快方法是什么?
现在,“top”和类似的工具不是答案,因为它们要么显示 CPU 或内存使用情况,但不能同时显示两者。我需要的是一个我可以随时输入的命令——它可以找出任何
系统正在尝试将 8GB RAM 交换到磁盘,因为进程 X...
或者
进程 X 在整个磁盘上搜索
或者
进程 X 使用 400% CPU”
因此,我要寻找的是 iostat、htop/atop 和类似的工具,它们运行并具有如下输出:
1235 cp - Disk trashing
87 chrome - Uses 2 GB of RAM
137 nfs_bench - Uses 95% of the network bandwidth
我不想要一个可以给我一些数字以供分析的工具,而想要一个可以告诉我哪个进程导致当前负载的工具。假设键盘前的用户几乎不知道如何写“进程”,但当谈到“驻留大小”、“虚拟内存”或“进程生命周期”时,用户很快就会不知所措。
我的论点是这样的:用户注意到了一个问题。原因可能有成千上万个……好吧,差不多 :-) 用户想知道问题的根源。
目前的解决方案给了我很多数字,我需要知道这些数字的含义。我正在寻找一个元工具。99% 的数据与问题无关。因此,该工具应该做的是查找占用某些资源的进程,并仅列出这些进程以及“此进程需要大量 CPU,这会产生许多 IRQ,此进程分配大量 RAM(并且仍在增长)”。
这将是一个相对较短的列表。对于新手来说,从这个列表中找到罪魁祸首要比从输出中找到罪魁祸首简单得多,比如说,htop
它给了我大约 5000 个数字,但需要我自己折叠多线程进程(我有 50 行,VIRT 2750M
但只有 16 GB 的 RAM - 机器应该会自行交换到死机,但当然,这是对数据的误解,很快就会发生)。
答案1
我确实不得不对这些回复微笑,因为每个人都告诉你运行工具X。唯一的问题是,如果你看到的东西是断断续续的,那么就没有办法把任何东西联系起来。像特区如果你以足够高的频率运行它,可以有所帮助,但我认为收集甚至更好。
喜欢特区,你可以通过安装 RPM 并执行 来将其作为守护进程运行/etc/init.d/collectl start
。
现在,当您看到某些进程缓慢时,collectl -p /var/log/collectl/filename --top
将回放数据并向您显示最热门的进程。您也可以直接运行collectl --top
并实时查看它们。顺便说一句 - 任何您可以实时执行的操作都可以回放。
至于 CPU 负载,如果中断确实超载了怎么办? collectl -sC
不仅会显示各个 CPU 上的负载(或用于-sc
平均负载),还会显示它们的时间使用情况。包括-j
( -scj
),您将看到中断数/CPU。使用大写字母-J
,您将看到每个中断/CPU 的类型。
当然,如果你真的喜欢 vmstat,你可以随时回放 collectl 数据,--vmstat
它将以 vmstat 格式显示历史数据。
还有许多开关,我没有足够的时间一一列出,但你可以查看SourceForge或者直接用谷歌搜索。
答案2
只要你看正确的数字,“top” 就相当有效。让我们看看:
top - 13:11:45 up 13 days, 1:13, 21 users, load average: 0.06, 0.11, 0.26
Tasks: 271 total, 2 running, 267 sleeping, 0 stopped, 2 zombie
Cpu(s): 19.0%us, 6.3%sy, 0.0%ni, 74.0%id, 0.5%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 8183668k total, 8002712k used, 180956k free, 12476k buffers
Swap: 11847900k total, 723480k used, 11124420k free, 767016k cached
现在,如果由于 CPU 全部被占用而导致系统运行缓慢,则会显示“Cpu(s):”行上的“us”和“sy”列一起接近 100%。
如果由于交换而导致速度变慢,“Mem:”“free”会显示非常低的值,而“Swap:”“used”会显示高值。
如果由于以下原因导致速度缓慢输入/输出一般来说,“Cpu(s):” “wa”表示花在 I/O 等待上的时间。
现在,如果您知道 I/O 等待是问题所在,您可以使用程序“iotop”来了解哪些进程创建了最多的 I/O。
答案3
根据 400% 的使用率,我假设您有一个四核处理器。您的平均负载几乎是容量的两倍,并且一半的进程都在等待 CPU。
首先,renice
将 shell 设置为 0 或 -10 以获得更灵敏的系统,然后使用它htop
来查找有问题的进程,并在strace
给定进程上执行此操作。其他可能有用的工具包括:
vmsat
sar
iostat
pmap
答案4
vmstat 可以为您提供一般性的帮助。使用示例如下:
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 977908 426184 1543884 0 0 38 45 106 385 4 1 95 1
您也可以每 X 秒运行一次 - 只需在命令后添加数字 X。
编辑:鉴于评论...将以下内容写入文件并使该文件可执行。它将告诉您机器上的前 3 个进程。
top -n 1 | tail -16 | head -4 | awk '{print $13}'
如果您想知道哪个占用了内存而不是 CPU,请阅读顶部手册页并更改显示顺序。