如何找到占用机器的进程

如何找到占用机器的进程

场景:突然间,我的电脑运行缓慢。鼠标可以移动,但窗口需要很长时间才能打开等。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,请阅读顶部手册页并更改显示顺序。

相关内容