Contents

监视单个过程的资源使用情况

1. 概述

在本教程中,我们将介绍一些终端命令和第三方插件,以帮助我们找到每个进程的资源使用情况。

2. Linux 内置命令

Linux 提供了几种不同的命令来检查系统资源的使用情况。我们今天将介绍的最流行的是 top 和 pidstat

2.1. top命令

通常,我们可以使用 Linux 内置的 top命令。此命令在命令提示符中显示正在运行的系统的实时视图。如果我们想了解单个进程,我们可以使用*-p*参数。

在使用 -p参数时,我们经常希望包含进程 ID。我们可以使用ps 命令找到命名进程的进程 ID 。找到进程 ID 后,我们可以通过以下方式将该数字输入到 top命令中:

$ top -p 2225
top - 15:47:16 up 24 min,  2 users,  load average: 0.30, 0.12, 0.11
Tasks:  1 total,  0 running,  1 sleeping,  0 stopped,  0 zombie
%Cpu(s):  0.3 us,  0.2 sy,  0.0 ni, 99.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8174276 total,  6455164 free, 862340 used, 856776 buff/cache
KiB Swap:  8257532 total,  8257532 free,      0 used, 6986028 avail Mem
 PID    USER        PR   NI       VIRT       RES      SHR    S   %CPU   %MEM      TIME+    COMMAND
2225    fcsvmus+    20    0    3299032    194052    72816    S    0.3    2.4    0:53.48    gnome-shell

Shell 将每隔几秒钟刷新一次此屏幕,为我们提供进程状态的更新视图。但是,显示不是很人性化。我们可能需要使用一些第三方插件来提供更好的想法。

2.2. pidstat命令

Linux 提供了另一个名为 pidstat的命令来检查正在使用的资源的百分比。但是,它仅在我们运行此命令时为我们提供了当前资源使用情况的快照,而不是像我们从top命令中所期望的那样提供实时视图 。另一方面,这使得这个命令成为一个轻量级的进程。

该命令是 sysstat 包的一部分,它不是 vanilla Linux,但我们仍然可以在手册页上找到该命令的文档。我们应该首先使用这个命令安装这个包:

$ sudo snap install sysstat

安装此软件包后,我们可以使用包含的 pidstat命令进行投标。如果我们不知道要查找的进程 id,我们需要首先使用 ps 命令查找该编号。下面是我们如何使用 pidstat命令:

$ ps aux
USER             PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
username        2888  0.0  0.0  10616  4948 pts/0    Ss   21:10   0:00 bash
...
$ pidstat --human -p 2888
Linux 5.13.0-40-generic (username-VirtualBox) 	2022-04-29 	_x86_64_	(4 CPU)
09:15:18 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
09:15:18 PM  1000      2888    0.0%    0.0%    0.0%    0.0%    0.0%     3  bash

–human 参数将以“*.*%”样式显示百分比数字。如果没有这个参数,它将只显示数字。

Linux 为我们提供了一些方便的命令来获取特定任务的系统资源使用情况。但是,它们只能在命令提示符下显示数字。如果我们想以人类可读的形式看到资源使用的逐渐变化,我们需要依靠一些第三方插件来绘制图表。

3. 第三方插件

以下附加组件需要 在 Linux 机器上安装Python 和pip 。一旦我们在我们的机器上安装了这两个,我们就可以使用 pip来安装这些包并监控特定进程的资源使用情况。

3.1. psrecord

psrecord 通过psutil 库记录 CPU 和内存使用情况 。在我们的 Linux 系统上使用起来很简单。

我们可以在命令提示符下输入这个命令来安装这个小程序:

$ pip install psrecord

在我们成功安装psrecord之后。我们需要先通过内置的 ps命令找到进程 id:

$ ps aux
USER         PID %CPU %MEM     VSZ    RSS TTY    STAT START   TIME COMMAND
...
username   24110  9.5  2.1 3229940 347564 ?      Sl   15:24   4:02 /usr/lib/firefox/firefox -private-window
...

找到我们感兴趣的进程 id 后,我们调用 psrecord来记录这个进程的资源使用情况,并将数据绘制成图像文件:

$ psrecord 24110 --interval 1 --duration 10 --plot 24110.png

在这里,我们指定 psrecord来监控进程 10 秒的持续时间,并每 1 秒记录一次。

如果系统正确处理该命令,当前目录中会出现一个名为“24110.png”的图像: /uploads/monitor_process_resource_usage/1.png

CPU 百分比有错误,因为小数点右移一位,导致 CPU 使用率超过 100% 容量。事实上,如果我们再次使用top命令检查,这个进程的 CPU 百分比只有 20% 左右 。

3.2. memory_profiler

有些人可能会问我们,如果我们不知道进程 ID,我们将如何监控资源使用情况。幸运的是,我们可以使用另一个名为 memory_profiler 的 Python 小程序来监控内存使用情况。请注意,此小程序仅检查内存使用情况。

我们可以使用 pip来安装这个小程序:

$ pip install memory_profiler

一旦安装了这个小程序,我们就可以使用这个命令来监控使用可执行文件目录的进程。这里我们仅以 bash为例:

$ mprof run bash

运行此命令后,  memory_profiler将在当前目录中生成一个 .dat文件。我们不需要为 memory_profiler指定文件,因为它会自行搜索可用文件。我们现在需要做的就是告诉 memory_profiler 为我们绘制图表。

因此,这一步我们需要做的就是在命令提示符下键入以下命令:

$ mprof plot

我们输入这个命令后,会出现一个 Matplotlib 下的窗口,显示bash进程的内存使用情况。然后,我们可以选择将图表作为图片保存到我们的本地端:

/uploads/monitor_process_resource_usage/2.png

请注意,memory_profiler不支持 CPU 性能监控。因此,如果我们要检查CPU使用率,我们需要使用其他工具。

通过 Python,我们可以很容易地找到一种更好的方法来衡量一个进程的资源使用情况。应该存在用不同语言编写和编译的其他附加组件,我们将在以后的文章中介绍它们。