每个 Linux 系统管理员都应该知道如何验证硬件、资源和主要进程的完整性和可用性。另外,基于每个用户设置资源限制也是其中一项必备技能。 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工作的方法,这些方法能够避免潜在的会导致生产环境下线或钱财损失的问题发生。 报告 Linux 进程统计信息 你可以使用 mpstat 单独查看每个处理器或者系统整体的活动,可以是每次一个快照或者动态更新。 为了使用这个工具,你首先需要安装 sysstat: # yum update && yum install sysstat [基于 CentOS 的系统]# aptitutde update && aptitude install sysstat [基于 Ubuntu 的系统]# zypper update && zypper install sysstat [基于 openSUSE 的系统] 你可以在 Linux 中学习 Sysstat 和其中的工具 mpstat、pidstat、iostat 和 sar,了解更多和 sysstat 和其中的工具相关的信息。 安装完 mpstat 之后,就可以使用它生成处理器统计信息的报告。 你可以使用下面的命令每隔 2 秒显示所有 CPU(用-P ALL 表示)的 CPU 利用率(-u),共显示3次。 # mpstat -P ALL -u 2 3 示例输出: Linux 3.19.0-32-generic (tecmint.com) Wednesday 30 March 2016 _x86_64_ (4 CPU)11:41:07 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle11:41:09 IST all 5.85 0.00 1.12 0.12 0.00 0.00 0.00 0.00 0.00 92.9111:41:09 IST 0 4.48 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 94.5311:41:09 IST 1 2.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 97.0011:41:09 IST 2 6.44 0.00 0.99 0.00 0.00 0.00 0.00 0.00 0.00 92.5711:41:09 IST 3 10.45 0.00 1.99 0.00 0.00 0.00 0.00 0.00 0.00 87.5611:41:09 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle11:41:11 IST all 11.60 0.12 1.12 0.50 0.00 0.00 0.00 0.00 0.00 86.6611:41:11 IST 0 10.50 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 88.5011:41:11 IST 1 14.36 0.00 1.49 2.48 0.00 0.00 0.00 0.00 0.00 81.6811:41:11 IST 2 2.00 0.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00 96.5011:41:11 IST 3 19.40 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 79.6011:41:11 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle11:41:13 IST all 5.69 0.00 1.24 0.00 0.00 0.00 0.00 0.00 0.00 93.0711:41:13 IST 0 2.97 0.00 1.49 0.00 0.00 0.00 0.00 0.00 0.00 95.5411:41:13 IST 1 10.78 0.00 1.47 0.00 0.00 0.00 0.00 0.00 0.00 87.7511:41:13 IST 2 2.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 97.0011:41:13 IST 3 6.93 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 92.57Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idleAverage: all 7.71 0.04 1.16 0.21 0.00 0.00 0.00 0.00 0.00 90.89Average: 0 5.97 0.00 1.16 0.00 0.00 0.00 0.00 0.00 0.00 92.87Average: 1 9.24 0.00 1.16 0.83 0.00 0.00 0.00 0.00 0.00 88.78Average: 2 3.49 0.17 1.00 0.00 0.00 0.00 0.00 0.00 0.00 95.35Average: 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 (tecmint.com) Wednesday 30 March 2016 _x86_64_ (4 CPU)11:42:08 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle11:42:10 IST 0 3.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 96.5011:42:12 IST 0 4.08 0.00 0.00 2.55 0.00 0.00 0.00 0.00 0.00 93.3711:42:14 IST 0 9.74 0.00 0.51 0.00 0.00 0.00 0.00 0.00 0.00 89.74Average: 0 5.58 0.00 0.34 0.85 0.00 0.00 0.00 0.00 0.00 93.23 上面命令的输出包括这些列: # 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 的输出作比较: 正如你在上面图示中看到的,在前面两个例子中,根据%idle的值可以判断 CPU 0 负载很高。 在下一部分,我们会讨论如何识别资源饥饿型进程,如何获取更多和它们相关的信息,以及如何采取恰当的措施。 Linux 进程报告 我们可以使用有名的ps命令,用-eo选项(根据用户定义格式选中所有进程) 和--sort选项(指定自定义排序顺序)按照 CPU 使用率排序列出进程,例如: # ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu 上面的命令只会显示PID、PPID、和进程相关的命令、 CPU 使用率以及 RAM 使用率,并按照 CPU 使用率降序排序。创建 .iso 文件的时候运行上面的命令,下面是输出的前面几行: 一旦我们找到了感兴趣的进程(例如PID=2822的进程),我们就可以进入/proc/PID(本例中是/proc/2822) 列出目录内容。 这个目录就是进程运行的时候保存多个关于该进程详细信息的文件和子目录的目录。 例如: /proc/2822/io:包括该进程的 IO 统计信息(IO 操作时的读写字符数)。 /proc/2822/attr/current:显示了进程当前的 SELinux 安全属性。 /proc/2822/cgroup:如果启用了 CONFIGCGROUPS 内核设置选项,这会显示该进程所属的控制组(简称cgroups),你可以使用下面命令验证是否启用了 CONFIGCGROUPS: # cat /boot/config-$(uname -r) | grep -i cgroups 如果启用了该选项,你应该看到: CONFIG_CGROUPS=y 根据红帽企业版 Linux 7 资源管理指南第一到四章的内容、openSUSE 系统分析和调优指南第九章、Ubuntu 14.04 服务器文档Control Groups 章节,你可以使用cgroups管理每个进程允许使用的资源数目。 /proc/2822/fd这个目录包含每个打开的描述进程的文件的符号链接。下面的截图显示了 tty1(第一个终端) 中创建 .iso 镜像进程的相关信息: 上面的截图显示 stdin(文件描述符 0)、stdout(文件描述符 1)、stderr(文件描述符 2) 相应地被映射到 /dev/zero、/root/test.iso 和 /dev/tty1。 在 Linux 中为每个用户设置资源限制 如果你不够小心、让任意用户使用不受限制的进程数,最终你可能会遇到意外的系统关机或者由于系统进入不可用的状态而被锁住。为了防止这种情况发生,你应该为用户可以启动的进程数目设置上限。 你可以在 /etc/security/limits.conf 文件末尾添加下面一行来设置限制:* hard nproc 10 然后,让我们来看看非 root 用户(合法用户或非法用户) 试图引起 shell fork 炸弹时会发生什么。如果我们没有设置限制, shell fork 炸弹会无限制地启动函数的两个实例,然后无限循环地复制任意一个实例。最终导致你的系统卡死。 但是,如果使用了上面的限制,fort 炸弹就不会成功,但用户仍然会被锁在外面直到系统管理员杀死相关的进程。 提示:limits.conf文件中可以查看其它 ulimit 可以更改的限制。 其它 Linux 进程管理工具 除了上面讨论的工具, 一个系统管理员还可能需要: a) 通过使用 renice 调整执行优先级(系统资源的使用)。这意味着内核会根据分配的优先级(众所周知的 “niceness”,它是一个范围从-20到19的整数)给进程分配更多或更少的系统资源。 这个值越小,执行优先级越高。普通用户(而非 root)只能调高他们所有的进程的 niceness 值(意味着更低的优先级),而 root 用户可以调高或调低任何进程的 niceness 值。 renice 命令的基本语法如下: # renice [-n] <new priority> <UID, GID, PGID, or empty> identifier 如果 new priority 后面的参数没有(为空),默认就是 PID。在这种情况下,PID=identifier 的进程的 niceness 值会被设置为<new priority> b) 需要的时候中断一个进程的正常执行。这也就是通常所说的“杀死”进程。实质上,这意味着给进程发送一个信号使它恰当地结束运行并以有序的方式释放任何占用的资源。 按照下面的方式使用 kill 命令杀死进程: # kill PID 另外,你也可以使用pkill结束指定用户(-u)、指定组(-G), 甚至有共同的父进程 ID (-P)的所有进程。这些选项后面可以使用数字或者名称表示的标识符。 # pkill [options] identifier 例如: 杀死组GID=1000的所有进程. # pkill -G 1000 杀死PPID 是 4993的所有进程. # pkill -P 4993 在运行pkill之前,先用pgrep测试结果、或者使用-l选项列出进程名称是一个很好的办法。它需要和pkill相同的参数、但是只会返回进程的 PID(而不会有其它操作),而pkill会杀死进程。 # pgrep -l -u gacanepa 用下面的图片说明: 总结 在这篇文章中我们探讨了一些监控资源使用的方法,以便验证 Linux 系统中重要硬件和软件组件的完整性和可用性。我们也学习了如何在特殊情况下采取恰当的措施(通过调整给定进程的执行优先级或者结束进程)。我们希望本篇中介绍的概念能对你有所帮助。 |