网站搜索

LFCS:监控 Linux 进程资源使用情况并根据每个用户设置进程限制 - 第 14 部分


由于最近对 LFCS 认证考试目标进行了修改,自2016 年 2 月 2 日起生效,我们正在将所需的文章添加到此处发布的 LFCS 系列中。为了准备这项考试,我们强烈建议您也参加 LFCE 系列。

每个 Linux 系统管理员都需要知道如何验证硬件、资源和关键进程的完整性和可用性。此外,为每个用户设置资源限制也必须是他/她的技能的一部分。

在本文中,我们将探讨几种方法来确保系统硬件和软件均正常运行,以避免可能导致意外生产停机和金钱损失的潜在问题。

Linux 报告处理器统计信息

使用mpstat,您可以单独查看每个处理器或整个系统的活动,无论是作为一次性快照还是动态查看。

为了使用此工具,您需要安装sysstat

yum update && yum install sysstat              [On CentOS based systems]
aptitutde update && aptitude install sysstat   [On Ubuntu based systems]
zypper update && zypper install sysstat        [On openSUSE systems]

了解有关 sysstat 及其实用程序的更多信息,请参阅学习 Sysstat 及其实用程序 mpstat、pidstat、iostat 和 sar in Linux

安装mpstat后,使用它生成处理器统计信息报告。

以 2 秒的间隔显示所有 CPU(如 -P ALL 所示)的 3 CPU 利用率 (-u) 全局报告, 做:

mpstat -P ALL -u 2 3
样本输出
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:41:07  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:09  IST  all    5.85    0.00    1.12    0.12    0.00    0.00    0.00    0.00    0.00   92.91
11:41:09  IST    0    4.48    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   94.53
11:41:09  IST    1    2.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:09  IST    2    6.44    0.00    0.99    0.00    0.00    0.00    0.00    0.00    0.00   92.57
11:41:09  IST    3   10.45    0.00    1.99    0.00    0.00    0.00    0.00    0.00    0.00   87.56

11:41:09  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:11  IST  all   11.60    0.12    1.12    0.50    0.00    0.00    0.00    0.00    0.00   86.66
11:41:11  IST    0   10.50    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   88.50
11:41:11  IST    1   14.36    0.00    1.49    2.48    0.00    0.00    0.00    0.00    0.00   81.68
11:41:11  IST    2    2.00    0.50    1.00    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:41:11  IST    3   19.40    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   79.60

11:41:11  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:41:13  IST  all    5.69    0.00    1.24    0.00    0.00    0.00    0.00    0.00    0.00   93.07
11:41:13  IST    0    2.97    0.00    1.49    0.00    0.00    0.00    0.00    0.00    0.00   95.54
11:41:13  IST    1   10.78    0.00    1.47    0.00    0.00    0.00    0.00    0.00    0.00   87.75
11:41:13  IST    2    2.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00   97.00
11:41:13  IST    3    6.93    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   92.57

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    7.71    0.04    1.16    0.21    0.00    0.00    0.00    0.00    0.00   90.89
Average:       0    5.97    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   92.87
Average:       1    9.24    0.00    1.16    0.83    0.00    0.00    0.00    0.00    0.00   88.78
Average:       2    3.49    0.17    1.00    0.00    0.00    0.00    0.00    0.00    0.00   95.35
Average:       3   12.25    0.00    1.16    0.00    0.00    0.00    0.00    0.00    0.00   86.59

要查看特定 CPU(以下示例中为 CPU 0)的相同统计信息,请使用:

mpstat -P 0 -u 2 3
样本输出
Linux 3.19.0-32-generic (linux-console.net) 	Wednesday 30 March 2016 	_x86_64_	(4 CPU)

11:42:08  IST  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
11:42:10  IST    0    3.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00   96.50
11:42:12  IST    0    4.08    0.00    0.00    2.55    0.00    0.00    0.00    0.00    0.00   93.37
11:42:14  IST    0    9.74    0.00    0.51    0.00    0.00    0.00    0.00    0.00    0.00   89.74
Average:       0    5.58    0.00    0.34    0.85    0.00    0.00    0.00    0.00    0.00   93.23

上述命令的输出显示这些列:

  1. CPU:整数形式的处理器编号,或所有处理器的平均值“all”。
  2. %usr:运行用户级应用程序时的 CPU 利用率百分比。
  3. %nice:与%usr相同,但具有nice优先级。
  4. %sys:执行内核应用程序时发生的 CPU 使用率百分比。这不包括处理中断或处理硬件所花费的时间。
  5. %iowait:给定 CPU(或全部)空闲的时间百分比,在此期间该 CPU 上计划了资源密集型 I/O 操作。可以在此处找到更详细的解释(带有示例)。
  6. %irq:服务硬件中断所花费的时间百分比。
  7. %soft:与%irq相同,但具有软件中断。
  8. %steal:当虚拟机作为来宾在竞争 CPU 时“赢得”虚拟机管理程序的注意力时,花费在非自愿等待(窃取或窃取时间)上的时间百分比。该值应尽可能小。该字段的值较高意味着虚拟机正在停滞或很快就会停滞。
  9. %guest:运行虚拟处理器所花费的时间百分比。
  10. %idle:CPU 未执行任何任务的时间百分比。如果您观察到此列中的值较低,则表明系统负载较重。在这种情况下,您需要仔细查看进程列表(我们稍后将讨论),以确定导致该问题的原因。

要将处理器置于较高的负载下,请运行以下命令,然后在单独的终端中执行 mpstat(如图所示):

dd if=/dev/zero of=test.iso bs=1G count=1
mpstat -u -P 0 2 3
ping -f localhost # Interrupt with Ctrl + C after mpstat below completes
mpstat -u -P 0 2 3

最后,与“正常”情况下 mpstat 的输出进行比较:

如上图所示,在前两个示例中,CPU 0 负载很重,如 %idle 列所示。

在下一节中,我们将讨论如何识别这些消耗资源的进程,如何获取有关它们的更多信息,以及如何采取适当的行动。

报告 Linux 进程

要列出按 CPU 使用率排序的进程,我们将使用众所周知的 ps 命令以及 -eo(以选择具有用户定义格式的所有进程)和 --sort (指定自定义排序顺序)选项,如下所示:

ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu

上面的命令只会显示 PIDPPID、与进程关联的命令,以及按 CPU 使用率百分比降序排列的 CPU 和 RAM 使用率百分比。在创建 .iso 文件期间执行时,输出的前几行如下:

一旦我们确定了感兴趣的进程(例如带有 PID=2822 的进程),我们就可以导航到 /proc/PID (/proc/2822 在本例中)并列出目录。

该目录中保存了多个文件和子目录,其中包含该特定进程运行时的详细信息。

例如:
  1. /proc/2822/io 包含进程的 IO 统计信息(IO 操作期间读取和写入的字符和字节数等)。
  2. /proc/2822/attr/current 显示进程当前的 SELinux 安全属性。
  3. /proc/2822/cgroup 描述了启用 CONFIG_CGROUPS 内核配置选项后进程所属的控制组(简称 cgroup),您可以通过以下方式验证:
cat /boot/config-$(uname -r) | grep -i cgroups

如果启用该选项,您应该看到:

CONFIG_CGROUPS=y

使用cgroups,您可以管理每个进程允许的资源使用量,如《Red Hat Enterprise Linux 7 资源管理指南》第 1 章至第 4 章以及 openSUSE 系统分析第 9 章中所述和调优指南,以及 Ubuntu 14.04 服务器文档的控制组部分。

/proc/2822/fd 是一个目录,其中包含进程打开的每个文件描述符的一个符号链接。下图显示了在 tty1(第一个终端)中启动的用于创建 .iso 映像的进程的信息:

上图显示了stdin(文件描述符0)、stdout(文件描述符1)和 >stderr(文件描述符2)映射到/dev/zero/root/test.iso > /dev/tty1 分别。

有关 /proc 的更多信息可以在 Kernel.org 保存和维护的“The /proc filesystem”文档以及 Linux 程序员手册中找到。

在 Linux 中设置每个用户的资源限制

如果您不小心并允许任何用户运行无限数量的进程,您最终可能会遇到系统意外关闭或因系统进入不可用状态而被锁定。为了防止这种情况发生,您应该限制用户可以启动的进程数量。

为此,请编辑 /etc/security/limits.conf 并在文件底部添加以下行以设置限制:

*   	hard	nproc   10

第一个字段可用于指示用户、组或全部 (*),而第二个字段对进程 (nproc) 数量强制执行硬限制 10。要应用更改,注销并重新登录就足够了。

因此,让我们看看如果除 root 之外的某个用户(无论是否合法)尝试启动 shell fork 炸弹,会发生什么情况。如果我们没有实现限制,那么最初会启动一个函数的两个实例,然后在永无休止的循环中复制它们中的每个实例。因此,它最终会让你的系统陷入困境。

然而,有了上述限制,fork 炸弹不会成功,但用户仍然会被锁定,直到系统管理员杀死与其关联的进程:

提示:ulimit 实现的其他可能的限制记录在 limits.conf 文件中。

Linux 其他进程管理工具

除了前面讨论的工具之外,系统管理员可能还需要:

a) 使用renice修改进程的执行优先级(系统资源的使用)。这意味着内核将根据指定的优先级(通常称为“niceness”的数字,范围从 -2019)。

值越低,执行优先级越高。普通用户(root 除外)只能将其拥有的进程的良好性修改为较高的值(意味着较低的执行优先级),而 root 可以修改任何进程的该值,并且可以增加或减少它。

renice的基本语法如下:

renice [-n] <new priority> <UID, GID, PGID, or empty> identifier

如果新优先级值后面的参数不存在(空),则默认设置为 PID。在这种情况下,带有 PID=identifier 的进程的优先级设置为 <newpriority>

b) 在需要时中断进程的正常执行。这通常称为“杀死”进程。在幕后,这意味着向进程发送信号以正确完成其执行并有序地释放任何已使用的资源。

要终止进程,请使用 kill 命令,如下所示:

kill PID

或者,您可以使用 pkill 终止给定所有者 (-u) 或组所有者 (-G) 的所有进程,甚至具有 PPID 的进程共同点(-P)。这些选项后面可以跟数字表示形式或实际名称作为标识符:

pkill [options] identifier

例如,

pkill -G 1000

将终止 GID=1000 组拥有的所有进程。

和,

pkill -P 4993 

将杀死 PPID 为 4993 的所有进程。

在运行 pkill 之前,最好先使用 pgrep 测试结果,也许还可以使用 -l 选项列出进程的名称。它采用相同的选项,但仅返回使用 pkill 时将被终止的进程的 PID(不采取任何进一步操作)。

pgrep -l -u gacanepa

下图对此进行了说明:

概括

在本文中,我们探讨了几种监视资源使用情况的方法,以验证 Linux 系统中关键硬件和软件组件的完整性和可用性。

我们还学习了如何在异常情况下采取适当的行动(通过调整给定进程的执行优先级或终止它)。

我们希望本教程中解释的概念对您有所帮助。如果您有任何问题或意见,请随时使用下面的联系表与我们联系。