如何使用 Linux 命令行查找占用资源的进程
要点
- Linux 上的所有进程都需要 RAM 和 CPU 周期,这可能会导致对这些资源的竞争。
- free、top 和 htop 等工具可帮助识别内存占用和 CPU 使用率较高的情况。
- 使用 ps 和 top 等命令来识别并终止有问题的进程并恢复系统性能。
Linux 计算机中运行的每一段代码都需要 RAM 和 CPU 周期。一个进程占用超过其公平份额的进程会减慢其他进程的速度。以下是如何找到罪魁祸首。
流程和资源平衡法
RAM 和 CPU 周期是有限的资源。当程序的代码被执行时,就形成了一个进程。除了操作系统进程之外,还有运行桌面环境的进程以及您启动的任何命令或应用程序。它们都需要 CPU 时间和 RAM。
Linux 和 CPU 必须管理 RAM 的分配,并平衡和调度跨内核和线程的 CPU 工作负载,以确保所有进程都能获得共享。
应用程序的编写应该确保它们不会独占您的机器,但有时会出现问题,进程可能会尝试霸占您的所有 RAM 并独占您的 CPU。
这时您需要能够识别跑道流程。
研究高内存使用情况
Linux 使用空闲 RAM 作为缓存。尽管看起来您的所有 RAM 都已被使用,但这可能是一个错误的印象。如果需要,会从缓存中删除项目,以将 RAM 分配给常规进程。
自由命令
free 命令为您提供内存使用情况的快照概览。 -h(人类)选项使输出更易于阅读。
我在终端窗口中运行该命令三次。在另一个终端窗口中,我运行了一个需要大量 RAM 的程序。
free -h
free -h
free -h
可用 RAM 以惊人的速度下降。我们需要确定其背后的一个或多个流程。
读取/proc/meminfo
像 top 和 htop 这样的工具从 /proc/meminfo 伪文件中提取内存信息。因为 /proc/meminfo 的行为就像一个文件,所以我们可以使用常见的实用程序(例如 cat 和 less)来查看其内容。
less /proc/meminfo
输出根据您运行的内核和 CPU 架构而有所不同,但标准字段始终存在。这是一个很好的方法,可以更详细地显示哪种类型的内存使用占用了 RAM 的最大部分,但它无法识别各个进程。
使用 vmstat 命令查找内存占用
vmstat 命令可以让我们了解一段时间内虚拟内存的使用情况。
要查看四组结果(相隔五秒)以及 MiB 中显示的值,我们可以使用以下命令:
vmstat 5 4 -S M
使用 top 和 htop 查找内存消耗
top 和 htop 都提供了系统信息的动态仪表板,其中一个进程表显示每个进程的一行信息。
要按 RAM 使用情况对进程表进行排序,请按 Shift+M。
一个名为 gobble 的程序已经启动了两次。它使用了三分之二的内存。我们将杀死这两个进程。
按 k, 启动终止功能。
在顶部,我们需要提供我们想要终止的进程的进程 ID。默认情况下,kill 函数将使用顶行的进程 ID。因为我们按 RAM 使用情况对表进行排序,这就是我们要使用的 ID,所以我们只需按 Enter 键即可。
我们被询问应该向进程发送哪个信号。 SIGKILL 是第九号信号。我们需要输入数字九,然后再次按 Enter 键。
如果我们重复这个过程两次,gobble 程序的两个实例都会被终止。
在 htop 中,情况非常相似。将突出显示栏移动到要终止的进程。按 k 启动终止进程。信号列表出现在窗口左侧。
将小突出显示条移至 9 SIGKILL 条目,然后按 Enter。
使用 ps 命令查找内存占用
ps 命令为我们提供进程 ID,还可以为我们提供父进程 ID。如果您有许多消耗内存的进程是由同一父进程启动的,则终止父进程也会终止其子进程。
我们将使用 -e(每个进程)选项和 -o(用户定义的输出格式)选项。在我们的输出中,我们要求:
- pid:进程ID。
- ppid:父进程ID。
- comm:命令名称。
- %mem:此进程使用的 RAM 百分比。
- rss:常驻集大小。这是进程已使用的非交换物理内存(以千字节为单位)。请注意,这不计算尚未实际使用的保留内存,也不计算虚拟内存。不过,对于手头的任务来说,这是一个非常好的指标。
- %cpu:这是进程迄今为止所拥有的 CPU 时间,除以进程运行的时间。
我们按记忆排序。减号表示反向排序。我们可以通过将结果传送到 head 来获得 10 个最严重的违规者。
ps -e -o pid,ppid,comm,%mem,rss,%cpu --sort=-%mem | head -10
调查高 CPU 使用率
追踪 CPU 占用的过程与我们讨论的内存占用的过程非常相似。我们需要识别有问题的进程,并获取它们的进程 ID。
使用 top 和 htop 查找 CPU 占用率
我们几乎可以像追踪消耗内存的进程一样使用 top 和 htop。默认情况下,top 和 htop 按 %CPU 列对进程表进行排序。如果您更改了排序列,则可以按 Shift+P(对于处理器)恢复按 %CPU 排序。
有一个进程称为“耗尽”,几乎占用了它自己的所有 CPU 时间。确定了罪魁祸首后,我们可以按 k 来调用终止进程函数。
使用mpstat命令监控CPU使用率
终止进程时需要小心。有些进程,尤其是系统进程,应该保留。 mpstat 命令为您提供用户和系统进程的 CPU 使用情况快照。
您需要在 Fedora 和 Manjaro 上安装 mpstat,但它已经安装在我们的 Ubuntu PC 上。
在 Fedora 上,您需要输入:
sudo dnf install sysstat
在 Manjaro 上,命令是:
sudo pacman -S sysstat
我们将使用 -P all(所有处理器)选项,并要求每两秒提供一次报告,总共五个报告。
mpstat -P all 2 5
我们可以看到CPU的负载来自用户端,而不是系统端。第六行是我们要求的五份报告的平均值。
使用 ps 查找 CPU 占用率
我们也可以使用 ps 来查找 CPU 密集型进程。通过对之前的命令稍作调整,我们可以按 CPU 排序。
ps -e -o pid,ppid,comm,%mem,rss,%cpu --sort=-%cpu | head -10
关于 ps 的条目是一个错误标志,我们知道它只运行了不到一秒。在第二行中,我们可以看到独占CPU的进程的进程ID。有了这些信息,我们就可以使用 top 或 htop 或 Kill 命令来终止进程。
一点家务
大多数时候,您的 Linux 计算机运行得很好,所有进程都在可接受的容差范围内运行。如果您发现计算机变得缓慢,请使用这些工具进行调查。您可能会发现内存或 CPU 过度消耗。