信息是解决任何计算机问题的关键,包括与 Linux 及其运行的硬件相关的问题。 有许多工具可用于大多数发行版,甚至包含在其中,即使它们并非默认安装。 这些工具可用于获取大量信息。
本文讨论了一些交互式命令行界面 (CLI) 工具,这些工具随 Red Hat 相关发行版提供,或者可以轻松地安装在这些发行版上,包括 Red Hat Enterprise Linux、Fedora、CentOS 和其他衍生发行版。 尽管有 GUI 工具可用并且它们提供良好的信息,但 CLI 工具提供所有相同的信息,并且它们始终可用,因为许多服务器没有 GUI 界面,但所有 Linux 系统都有命令行界面。
本文重点介绍我通常使用的工具。 如果我没有介绍您最喜欢的工具,请原谅我,并在评论区告诉我们您使用的工具以及原因。
我在 Linux 环境中进行问题确定时,几乎总是使用系统监控工具。 对我来说,这些工具是 top、atop、htop 和 glances。
所有这些工具都监控 CPU 和内存使用情况,并且大多数工具至少列出有关正在运行的进程的信息。 一些工具还监控 Linux 系统的其他方面。 所有这些工具都提供近乎实时的系统活动视图。
平均负载
在继续讨论监控工具之前,更详细地讨论平均负载非常重要。
平均负载是衡量 CPU 使用率的重要标准,但当我表示 1(或 5 或 10)分钟平均负载为 4.04 时,这到底意味着什么? 平均负载可以被认为是 CPU 需求的度量; 它是一个数字,表示等待 CPU 时间的平均指令数。 因此,这是 CPU 性能的真实衡量标准,不同于标准的“CPU 百分比”,其中包含 CPU 实际上并未工作的 I/O 等待时间。
例如,一个完全利用的单处理器系统 CPU 的平均负载为 1。 这意味着 CPU 恰好跟上需求; 换句话说,它具有完美的利用率。 平均负载小于 1 意味着 CPU 未被充分利用,而平均负载大于 1 意味着 CPU 被过度利用,并且存在积压的、未满足的需求。 例如,单 CPU 系统中 1.5 的平均负载表明三分之一的 CPU 指令被迫等待,直到前一个指令完成才能执行。
对于多处理器也是如此。 如果一个 4 CPU 系统的平均负载为 4,则它具有完美的利用率。 例如,如果它的平均负载为 3.24,那么它的三个处理器被完全利用,而一个处理器被利用了大约 76%。 在上面的示例中,一个 4 CPU 系统的 1 分钟平均负载为 4.04,这意味着 4 个 CPU 中没有剩余容量,并且一些指令被迫等待。 一个完美利用的 4 CPU 系统将显示 4.00 的平均负载,因此示例中的系统已完全加载但未过载。
平均负载的最佳条件是等于系统中 CPU 的总数。 这意味着每个 CPU 都被充分利用,但没有指令必须被迫等待。 较长期的平均负载提供整体利用率趋势的指示。
Linux Journal 有一篇优秀的文章,描述了平均负载、其背后的理论和数学,以及如何在 2006 年 12 月 1 日的期刊中解释它们。
信号
此处讨论的所有监视器都允许您向正在运行的进程发送信号。 虽然这些信号中的每一个都有特定的功能,但其中一些信号可以由使用信号处理程序的接收程序定义。
单独的 kill 命令也可用于将信号发送到监视器之外的进程。 kill -l 可用于列出所有可能的可以发送的信号。 这些信号中的三个可用于终止进程。
- SIGTERM (15): 信号 15, SIGTERM 是按 k 键时 top 和其他监视器发送的默认信号。 它也可能是最无效的,因为程序必须内置信号处理程序。 程序的信号处理程序必须截获传入的信号并采取相应的操作。 因此,对于大多数没有信号处理程序的脚本,SIGTERM 会被忽略。 SIGTERM 背后的想法是,通过简单地告诉程序您希望它自行终止,它将利用这一点并清理诸如打开的文件之类的东西,然后以受控和友好的方式自行终止。
- SIGKILL (9): 信号 9,SIGKILL 提供了一种杀死即使是最顽固的程序(包括脚本和其他没有信号处理程序的程序)的方法。 但是,对于没有信号处理程序的脚本和其他程序,它不仅会杀死正在运行的脚本,还会杀死运行脚本的 shell 会话; 这可能不是您想要的行为。 如果您想杀死一个进程并且您不在乎是否友好,那么这就是您想要的信号。 程序代码中的信号处理程序无法截获此信号。
- SIGINT (2): 信号 2,当 SIGTERM 不起作用并且您希望程序以稍微更友好的方式死亡时可以使用 SIGINT,例如,在不杀死运行它的 shell 会话的情况下。 SIGINT 向运行该程序的会话发送中断。 这相当于使用 Ctrl-C 键组合终止正在运行的程序,特别是脚本。
要对此进行实验,请打开一个终端会话并在 /tmp 中创建一个名为 cpuHog 的文件,并使用权限 rwxr_xr_x 使其可执行。 将以下内容添加到文件中。
#!/bin/bash # This little program is a cpu hog X=0;while [ 1 ];do echo $X;X=$((X+1));done
在不同的窗口中打开另一个终端会话,将它们彼此相邻放置,以便您可以观看结果,并在新会话中运行 top。 使用以下命令运行 cpuHog 程序
/tmp/cpuHog
该程序只是加一并将其当前值 X 打印到 STDOUT。 而且它会占用 CPU 周期。 运行 cpuHog 的终端会话应在 top 中显示非常高的 CPU 使用率。 观察这对 top 中的系统性能产生的影响。 CPU 使用率应立即上升,平均负载也应随着时间的推移开始增加。 如果需要,您可以打开其他终端会话并在其中启动 cpuHog 程序,以便运行多个实例。
确定要杀死的 cpuHog 程序的 PID。 按 k 键,然后查看摘要部分底部 Swap 行下的消息。 Top 会询问您要杀死的进程的 PID。 输入该 PID 并按 Enter。 现在 top 会询问信号编号并显示默认值 15。尝试此处描述的每个信号并观察结果。
Linux 系统监控的 4 款开源工具
top
我在执行问题确定时使用的第一个工具之一是 top。 我喜欢它,因为它一直存在并且始终可用,而其他工具可能未安装。
top 程序是一个非常强大的实用程序,可提供有关正在运行的系统的大量信息。 这包括有关内存使用情况、CPU 负载以及正在运行的进程列表的数据,包括每个进程使用的 CPU 时间和内存量。 Top 以近乎实时的速度显示系统信息,(默认情况下)每三秒更新一次。 Top 允许使用小数秒,但非常小的值可能会给系统带来很大的负载。 它也是交互式的,并且可以修改要显示的数据列和排序的列。
图 1 中显示了 top 程序的示例输出。 top 的输出分为两个部分,分别称为“摘要”部分(即输出的顶部部分)和“进程”部分(即输出的下半部分); 为了保持一致性,我将在 top、atop、htop 和 glances 中使用此术语。
top 程序有许多有用的交互式命令,您可以使用它们来管理数据的显示和操作单个进程。 使用 h 命令查看各种交互式命令的简短帮助页面。 请务必按两次 h 以查看帮助的两页。 使用 q 命令退出。
摘要部分
top 输出的摘要部分是系统状态的概述。 第一行显示系统运行时间和 1、5 和 15 分钟的平均负载。 在下面的示例中,平均负载分别为 4.04、4.17 和 4.06。
第二行显示当前活跃进程的数量以及每个进程的状态。
接下来显示包含 CPU 统计信息的行。可以是一行,包含系统中所有 CPU 的统计信息,如下例所示,也可以是每颗 CPU 一行;在本示例使用的计算机中,这是一颗四核 CPU。按 1 键可以在 CPU 使用率的合并显示和单个 CPU 的显示之间切换。这些行中的数据以可用 CPU 总时间的百分比显示。
以下描述这些以及其他 CPU 数据字段的含义。
- us: 用户空间 – 在用户空间中运行的应用程序和其他程序,即不在内核中运行的程序。
- sy: 系统调用 – 内核级函数。 这不包括内核本身占用的 CPU 时间,仅包括内核系统调用。
- ni: nice – 以正 nice 值运行的进程。
- id: 空闲 – 空闲时间,即未被任何正在运行的进程使用的时间。
- wa: 等待 – 用于等待 I/O 发生的 CPU 周期。 这是浪费的 CPU 时间。
- hi: 硬件中断 – 用于处理硬件中断的 CPU 周期。
- si: 软件中断 – 用于处理软件创建的中断(例如系统调用)的 CPU 周期。
- st: 窃取时间 – 当虚拟机监控程序为另一个虚拟处理器提供服务时,虚拟 CPU 等待真实 CPU 的 CPU 周期百分比。
摘要部分中的最后两行是内存使用情况。 它们显示物理内存使用情况,包括 RAM 和交换空间。
图 1:top 命令显示完全使用的 4 核 CPU。
您可以使用 1 命令将 CPU 统计信息显示为单个全局数字(如上图 1 所示),或者按单个 CPU 显示。 l 命令打开和关闭负载平均值。 t 和 m 命令分别循环摘要部分中的进程/CPU 和内存行,在关闭、仅文本和几种类型的条形图格式之间切换。
进程部分
top 命令输出的进程部分是系统中正在运行的进程的列表,至少对于终端显示器上有空间的进程数量而言是如此。 下面描述了 top 显示的默认列。 还有其他几个列可用,通常可以通过单个按键添加每个列。 有关详细信息,请参阅 top 手册页。
- PID – 进程 ID。
- USER – 进程所有者的用户名。
- PR – 进程的优先级。
- NI – 进程的 nice 值。
- VIRT – 分配给进程的虚拟内存总量。
- RES – 进程消耗的非交换物理内存的驻留大小(以 kb 为单位,除非另有说明)。
- SHR – 进程使用的共享内存量(以 kb 为单位)。
- S – 进程的状态。 可以是 R 表示正在运行,S 表示睡眠,Z 表示僵尸进程。 较少见的状态可以是 T 表示已跟踪或已停止,D 表示不可中断的睡眠。
- %CPU – 在上次测量的时间段内,此进程使用的 CPU 周期或时间的百分比。
- %MEM – 进程使用的物理系统内存的百分比。
- TIME+ – 自进程启动以来,进程消耗的总 CPU 时间(精确到百分之一秒)。
- COMMAND – 这是用于启动进程的命令。
使用 Page Up 和 Page Down 键滚动浏览正在运行的进程列表。 d 或 s 命令可以互换使用,可用于设置更新之间的延迟间隔。 默认为三秒,但我更喜欢一秒的间隔。 间隔粒度可以低至十分之一 (0.1) 秒,但这将消耗更多您尝试测量的 CPU 周期。
您可以使用 < 和 > 键将排序的列按顺序向左或向右移动。
k 命令用于终止进程,r 命令用于重新 nice 一个进程。 您必须知道要终止或重新 nice 的进程的进程 ID (PID),该信息显示在 top 显示的进程部分中。 终止进程时,top 首先要求输入 PID,然后要求输入用于终止进程的信号编号。 输入它们并在每次输入后按 Enter 键。 从信号 15,SIGTERM 开始,如果这不能终止进程,请使用 9,SIGKILL。
配置
如果您更改了 top 显示,您可以使用 W(大写)命令将更改写入配置文件 ~/.toprc(在您的主目录中)。
atop
我也喜欢 atop。 当您需要更多关于 I/O 活动类型的信息时,它是一个很好的监控工具。 默认刷新间隔为 10 秒,但可以使用间隔 i 命令将其更改为适合您尝试执行的操作的任何值。 atop 无法像 top 那样以亚秒级间隔刷新。
使用 h 命令显示帮助。 请务必注意,有多个帮助页面,您可以使用空格键向下滚动以查看其余部分。
atop 的一个不错的特性是它可以将原始性能数据保存到文件中,然后在以后重放以进行仔细检查。 这对于跟踪间歇性问题非常有用,尤其是那些在您无法直接监控系统时发生的问题。 atopsar 程序用于重放保存文件中的数据。
.
图 2:atop 系统监视器除了提供 CPU 和进程数据外,还提供有关磁盘和网络活动的信息。
摘要部分
atop 包含与 top 大致相同的信息,但还显示有关网络、原始磁盘和逻辑卷活动的信息。 上面的图 2 在显示器顶部的列中显示了这些附加数据。 请注意,如果您有足够的水平屏幕空间来支持更宽的显示,则会显示额外的列。 相反,如果您水平宽度较小,则显示的列数会更少。 我也喜欢 atop 显示当前 CPU 频率和缩放因子,这是我在任何其他这些监视器上都没有看到的,它位于图 2 中第二行的最右边的两列。
进程部分
atop 进程显示包含与 top 相同的某些列,但它还包括每个进程的磁盘 I/O 信息和线程计数,以及每个进程的虚拟和实际内存增长统计信息。 与摘要部分一样,如果存在足够的水平屏幕空间,则会显示额外的列。 例如,在图 2 中,显示了进程所有者的 RUID(实际用户 ID)。 展开显示还将显示 EUID(有效用户 ID),当程序运行 SUID(设置用户 ID)时,这可能很重要。
atop 还可以提供有关每个进程的磁盘、内存、网络和调度信息的详细信息。 只需分别按 d、m、n 或 s 键即可查看该数据。 g 键将显示返回到通用进程显示。
可以使用 C 按 CPU 使用率排序,M 按内存使用率排序,D 按磁盘使用率排序,N 按网络使用率排序,A 进行自动排序来轻松完成排序。 自动排序通常按最繁忙的资源对进程进行排序。 只有在安装并加载了 netatop 内核模块后才能对网络使用情况进行排序。
您可以使用 k 键终止进程,但没有重新 nice 进程的选项。
默认情况下,在给定时间间隔内未发生任何活动的网络和磁盘设备不会显示。 这可能会导致对主机硬件配置的错误假设。 f 命令可用于强制 atop 显示空闲资源。
配置
atop 手册页提到了全局和用户级别的配置文件,但在我自己的 Fedora 或 CentOS 安装中找不到任何配置文件。 也没有命令来保存修改后的配置,并且在程序终止时不会自动保存。 因此,现在似乎无法永久更改配置。
htop
htop 程序很像 top,*但更加强大*。 它看起来很像 top,但它也提供了一些 top 没有的功能。 但是,与 atop 不同,它不提供任何类型的磁盘、网络或 I/O 信息。
图 3:htop 具有漂亮的条形图来指示资源使用情况,并且可以显示进程树。
摘要部分
htop 的摘要部分显示在两列中。 它非常灵活,可以使用几种不同类型的信息进行配置,并且可以按您喜欢的任何顺序进行配置。 虽然 top 和 atop 的 CPU 使用率部分可以在合并显示和显示每个 CPU 的一个条形图之间切换,但 htop 不能。 因此,它为 CPU 显示提供了许多不同的选项,包括单个合并条、每个 CPU 的一个条以及可以将特定 CPU 分组到单个条中的各种组合。
我认为这是一个比其他一些系统监视器更简洁的摘要显示,并且更容易阅读。 此摘要部分的缺点是 htop 中无法获得其他监视器中可用的一些信息,例如按用户、空闲和系统时间划分的 CPU 百分比。
F2(设置)键用于配置 htop 的摘要部分。 显示可用数据显示的列表,您可以使用功能键将它们添加到左侧或右侧列,并在选定的列中上下移动它们。
进程部分
htop 的进程部分与 top 的进程部分非常相似。 与其他监视器一样,进程可以按几个因素排序,包括 CPU 或内存使用情况、用户或 PID。 请注意,选择树视图时无法进行排序。
F6 键允许您选择排序的列;它显示可用于排序的列的列表,您可以选择所需的列并按 Enter 键。
你可以使用上下箭头键来选择进程。要结束一个进程,使用上下箭头键选择目标进程并按下 k 键。此时会显示一个信号列表,其中 15,SIGTERM 已被选中。你可以指定要使用的信号,如果与 SIGTERM 不同。你也可以使用 F7 和 F8 键来调整所选进程的优先级(renice)。
我特别喜欢的一个命令是 F5,它以树状格式显示正在运行的进程,可以轻松确定运行进程的父/子关系。
配置
每个用户都有自己的配置文件 ~/.config/htop/htoprc,对 htop 配置的更改会自动存储在那里。 htop 没有全局配置文件。
glances
我最近了解了 glances,它可以显示比我目前熟悉的任何其他监视器更多的关于你计算机的信息。这包括磁盘和网络 I/O,热读数(可以显示 CPU 和其他硬件温度以及风扇速度),以及按硬件设备和逻辑卷划分的磁盘使用情况。
拥有所有这些信息的缺点是,glances 本身会占用大量的 CPU 资源。在我的系统上,我发现它可以占用大约 10% 到 18% 的 CPU 周期。 这很多,所以在选择监视器时应该考虑这种影响。
摘要部分
glances 的摘要部分包含与其它监视器摘要部分的大部分相同的信息。 如果你有足够的水平屏幕空间,它可以同时显示 CPU 使用情况的条形图和数字指示器,否则它将只显示数字。
图 4:glances 界面,包含网络、磁盘、文件系统和传感器信息。
我更喜欢这个摘要部分,而不是其他监视器的摘要部分;我认为它以易于理解的格式提供了正确的信息。 与 atop 和 htop 一样,你可以按 1 键在显示各个 CPU 核心或将所有 CPU 核心作为单个平均值显示全局 CPU 使用情况之间切换,如上面的图 4 所示。
进程部分
进程部分显示有关每个正在运行的进程的标准信息。 进程可以自动排序 a,或者按 CPU c、内存 m、名称 p、用户 u、I/O 速率 i 或时间 t 排序。 当自动排序时,进程首先按使用最多的资源排序。
Glances 还在屏幕的最底部显示警告和关键警报,包括事件的时间和持续时间。这在尝试诊断问题时很有帮助,尤其是在你无法长时间盯着屏幕的情况下。 这些警报日志可以用 l 命令打开或关闭,警告可以用 w 命令清除,而警报和警告都可以用 x 清除。
有趣的是,glances 是这些监视器中唯一不能用于结束或调整进程优先级的监视器。 它仅用作监视器。 你可以使用外部 kill 和 renice 命令来操作进程。
侧边栏
Glances 有一个非常好的侧边栏,可以显示在 top 或 htop 中不可用的信息。 Atop 确实显示了一些这样的数据,但 glances 是唯一显示传感器数据的监视器。 有时,看到计算机内部的温度很好。 可以使用 d、f、n 和 s 命令分别打开和关闭各个模块,即磁盘、文件系统、网络和传感器。 可以使用 2 切换整个侧边栏。
Docker 统计信息可以用 D 显示。
配置
Glances 不需要配置文件即可正常工作。 如果你选择拥有一个,则配置文件的系统范围实例将位于 /etc/glances/glances.conf 中。 单个用户可以在 ~/.config/glances/glances.conf 中拥有一个本地实例,该实例将覆盖全局配置。 这些配置文件的主要目的是设置警告和严重警报的阈值。 我找不到任何方法来永久更改其他配置(例如侧边栏模块或 CPU 显示)。 看起来你每次启动 glances 时都必须重新配置这些项目。
有一个文档 /usr/share/doc/glances/glances-doc.html 提供了大量关于使用 glances 的信息,并且明确指出你可以使用配置文件来配置显示的模块。 然而,所给出的信息和示例都没有描述如何做到这一点。
结论
请务必阅读每个监视器的 man 手册,因为其中包含大量关于配置和与其交互的信息。 也可以在交互模式下使用 h 键获取帮助。 此帮助可以为你提供有关选择和排序数据列、设置更新间隔等信息。
当你寻找问题的原因时,这些程序可以告诉你很多信息。 它们可以告诉你何时以及哪个进程占用 CPU 时间、是否有足够的可用内存、进程是否在等待 I/O(例如完成磁盘或网络访问)时停顿等等。
我强烈建议你花时间观看这些监视程序在正常运行的系统上运行,这样你就能在你寻找问题原因时区分出那些可能不正常的事情。
你也应该意识到,使用这些监视工具会改变系统对资源的使用,包括内存和 CPU 时间。 top 和大多数这些监视器可能使用系统 CPU 时间的 2% 或 3%。 glances 的影响比其他监视器大得多,可能使用 CPU 时间的 10% 到 20%。 在选择工具时,请务必考虑这一点。
我最初打算在这篇文章中包含 SAR(System Activity Reporter,系统活动报告器),但随着这篇文章越来越长,我也清楚地意识到 SAR 与这些监视工具明显不同,值得单独写一篇文章。 所以考虑到这一点,我计划写一篇关于 SAR 和 /proc 文件系统的文章,以及第三篇关于如何使用所有这些工具来定位和解决问题的文章。
20 条评论