网站搜索

如何监控系统使用情况、中断并对 Linux 服务器进行故障排除 - 第 9 部分


尽管 Linux 非常可靠,但明智的系统管理员应该找到一种方法来始终关注系统的行为和利用率。确保正常运行时间尽可能接近 100% 和资源可用性是许多环境中的关键需求。检查系统过去和当前的状态将使我们能够预见并最有可能防止可能出现的问题。

Linux 基金会认证计划简介

在本文中,我们将列出大多数上游发行版中可用的一些工具,用于检查系统状态、分析中断情况并解决持续存在的问题。具体来说,在大量可用数据中,我们将重点关注 CPU、存储空间和内存利用率、基本进程管理和日志分析。

存储空间利用率

Linux 中有 2 个著名的命令用于检查存储空间使用情况:dfdu

第一个 df(代表磁盘空闲)通常用于报告文件系统的总体磁盘空间使用情况。

示例 1:以字节和人类可读的格式报告磁盘空间使用情况

如果没有选项,df 会以字节为单位报告磁盘空间使用情况。使用 -h 标志,它将使用 MB 或 GB 显示相同的信息。请注意,此报告还包括每个文件系统的总大小(以 1-K 块为单位)、空闲和可用空间以及每个存储设备的安装点。

df
df -h

这当然很好,但还有另一个限制可能导致文件系统无法使用,那就是 inode 耗尽。文件系统中的所有文件都映射到包含其元数据的索引节点。

示例 2:以人类可读的格式检查文件系统的 inode 使用情况
df -hTi

您可以看到已使用和可用的 inode 数量:

根据上图,/home 中有 146 个已使用的 inode (1%),这意味着您仍然可以在该文件系统中创建 226K 文件。

示例 3:查找和/或删除空文件和目录

请注意,您可能早在用完 inode 之前就用完了存储空间,反之亦然。因此,您不仅需要监控存储空间利用率,还需要监控文件系统使用的 inode 数量。

使用以下命令查找无故使用inode的空文件或目录(占用0B):

find  /home -type f -empty
find  /home -type d -empty

此外,如果您还想删除这些空文件和目录,则可以在每个命令末尾添加 -delete 标志:

find  /home -type f -empty --delete
find  /home -type f -empty

上一过程删除了 4 个文件。让我们再次检查 /home 中已使用/可用节点的数量:

df -hTi | grep home

正如您所看到的,现在有 142 个已使用的 inode(比以前少了 4 个)。

示例 4:按目录检查磁盘使用情况

如果某个文件系统的使用率高于预定义的百分比,您可以使用 du(磁盘使用率的缩写)来找出占用空间最多的文件。

该示例是针对 /var 给出的,正如您在上面第一张图片中所看到的,其使用率为 67%。

du -sch /var/*

注意:您可以切换到上述任意子目录来准确了解其中的内容以及每个项目占用的大小。然后,您可以使用该信息删除一些不需要的文件,或者根据需要扩展逻辑卷的大小。

另请阅读

  1. 12 个有用的“df”命令来检查磁盘空间
  2. 10 个有用的“du”命令来查找文件和目录的磁盘使用情况

内存和CPU利用率

Linux 中用于全面检查 CPU/内存利用率和进程管理的经典工具是 top 命令。此外,顶部还显示正在运行的系统的实时视图。还有其他工具可以用于相同目的,例如 htop,但我选择了 top,因为它在任何 Linux 发行版中都是开箱即用安装的。

示例 5:使用 top 显示系统的实时状态

要启动 top,只需在命令行中键入以下命令,然后按 Enter。

top

让我们检查一个典型的顶部输出:

第 1 行到第 5 行显示以下信息:

1. 当前时间(晚上 8:41:32)和正常运行时间(7 小时 41 分钟)。仅一名用户登录系统,分别为最近 1 分钟、5 分钟和 15 分钟的负载平均值。 0.00、0.01 和 0.05 表示在这些时间间隔内,系统有 0% 的时间处于空闲状态(0.00:没有进程在等待 CPU),然后过载了 1%(0.01:平均有 0.01 个进程)正在等待 CPU)和 5% (0.05)。如果小于 0 且较小的数字(例如 0.65),则系统在过去 1 分钟、5 分钟或 15 分钟内空闲了 35%,具体取决于 0.65 出现的位置。

2. 当前有 121 个进程正在运行(您可以在 6 中查看完整列表)。其中只有 1 个正在运行(在本例中为顶部,如您在 %CPU 列中所见),其余 120 个在后台等待,但处于“睡眠”状态,并将保持该状态,直到我们调用它们。如何?您可以通过打开 mysql 提示符并执行几个查询来验证这一点。您会注意到正在运行的进程数量如何增加。

或者,您可以打开 Web 浏览器并导航到 Apache 提供的任何给定页面,您将获得相同的结果。当然,这些示例假设这两个服务都安装在您的服务器中。

3. us(运行未修改优先级的用户进程的时间)、sy(运行内核进程的时间)、ni(运行修改优先级的用户进程的时间)、wa(等待 I/O 完成的时间)、 hi(服务硬件中断所花费的时间)、si(服务软件中断所花费的时间)、st(虚拟机管理程序从当前虚拟机窃取的时间 - 仅在虚拟化环境中)。

4. 物理内存使用情况。

5. 交换空间使用情况。

示例 6:检查物理内存使用情况

要检查 RAM 内存和交换使用情况,您还可以使用 free 命令。

free

当然,您也可以使用 -m (MB) 或 -g (GB) 开关以人类可读的形式显示相同的信息:

free -m

无论哪种方式,您都需要注意这样一个事实:内核会保留尽可能多的内存,并在进程请求时将其提供给进程使用。特别是,“-/+ buffers/cache”行显示考虑此 I/O 缓存后的实际值。

换句话说,进程使用的内存量和其他进程可用的内存量(在本例中,分别为已使用的 232 MB 和可用的 270 MB)。当进程需要这些内存时,内核会自动减少 I/O 缓存的大小。

另请阅读:10 个有用的“free”命令来检查 Linux 内存使用情况

仔细观察流程

在任何给定时间,我们的 Linux 系统上都会运行许多进程。我们将使用两个工具来密切监视进程:pspstree

示例7:使用ps显示系统中的整个进程列表(全标准格式)

使用 -e-f 选项组合成一个 (-ef),您可以列出系统上当前运行的所有进程。您可以将此输出传送到其他工具,例如 grep(如 LFCS 系列第 1 部分中所述),以将输出范围缩小到您所需的进程:

ps -ef | grep -i squid | grep -v grep

上面的进程列表显示了以下信息:

进程的所有者、PID、父 PID(父进程)、处理器利用率、命令启动时间、tty(?表示它是守护进程)、累积的 CPU 时间以及与进程关联的命令。

示例 8:自定义和排序 ps 的输出

然而,也许您不需要所有这些信息,并且想要显示进程的所有者、启动它的命令、它的 PID 和 PPID 以及它当前使用的内存百分比 - 按顺序排列,并按内存使用量按降序排列(注意 ps 默认按 PID 排序)。

ps -eo user,comm,pid,ppid,%mem --sort -%mem

其中%mem前面的减号表示按降序排序。

如果由于某种原因,某个进程开始占用过多的系统资源,并且可能会危及系统的整体功能,您将需要使用终止程序向其传递以下信号之一来停止或暂停其执行。您考虑这样做的其他原因是当您在前台启动了一个进程但想要暂停它并在后台恢复时。

Signal name Signal number Description
 SIGTERM 15  Kill the process gracefully.
 SIGINT 2  This is the signal that is sent when we press Ctrl + C. It aims to interrupt the process, but the process may ignore it.
 SIGKILL 9  This signal also interrupts the process but it does so unconditionally (use with care!) since a process cannot ignore it.
 SIGHUP 1  Short for “Hang UP”, this signals instructs daemons to reread its configuration file without actually stopping the process.
 SIGTSTP 20  Pause execution and wait ready to continue. This is the signal that is sent when we type the Ctrl + Z key combination.
 SIGSTOP 19  The process is paused and doesn’t get any more attention from the CPU cycles until it is restarted.
 SIGCONT 18  This signal tells the process to resume execution after having received either SIGTSTP or SIGSTOP. This is the signal that is sent by the shell when we use the fg or bg commands.
示例 9:暂停正在运行的进程的执行并在后台恢复它

当某个进程的正常执行意味着在运行时不会将任何输出发送到屏幕时,您可能希望在后台启动它(在命令末尾附加一个&符号)。

process_name &

或者,
一旦它开始在前台运行,暂停它并将其发送到后台

Ctrl + Z
kill -18 PID

示例 10:强制杀死“疯狂”的进程

请注意,每个发行版都提供了用于正常停止/启动/重新启动/重新加载常用服务的工具,例如基于 SysV 的系统中的 service 或基于 systemd 的系统中的 systemctl

如果进程不响应这些实用程序,您可以通过向其发送 SIGKILL 信号来强制终止它。

ps -ef | grep apache
kill -9 3821

那么..发生了什么/正在发生什么?

当系统发生任何类型的中断时(无论是断电、硬件故障、计划内或计划外的进程中断,还是任何异常),日志都会记录在 /var/log 是您最好的朋友,可以确定发生了什么或可能导致您面临的问题。

cd /var/log

/var/log 中的某些项目是常规文本文件,其他项目是目录,还有一些项目是旋转(历史)日志的压缩文件。您需要检查名称中带有“错误”一词的名称,但检查其余的也可能会派上用场。

示例 11:检查日志中进程中的错误

想象一下这个场景。您的 LAN 客户端无法打印到网络打印机。解决这种情况的第一步是转到 /var/log/cups 目录并查看其中的内容。

您可以使用 tail 命令显示 error_log 文件的最后 10 行,或使用 tail -f error_log 实时查看日志。

cd /var/log/cups
ls
tail error_log

上面的屏幕截图提供了一些有用的信息,可帮助您了解导致问题的原因。请注意,遵循这些步骤或纠正进程的故障仍然可能无法解决整体问题,但如果您从一开始就习惯在每次出现问题时(无论是本地问题还是网络问题)就检查日志,那么您就可以解决问题。一定会走在正确的轨道上。

示例 12:检查日志中是否有硬件故障

尽管排除硬件故障可能很棘手,但您应该检查 dmesg 和消息日志,并使用 grep 查找与假定有故障的硬件部件相关的单词。

下图是使用以下命令查找单词错误后从 /var/log/messages 获取的:

less /var/log/messages | grep -i error

我们可以看到两个存储设备有问题:/dev/sdb/dev/sdc,这反过来又导致 RAID 阵列出现问题。

结论

在本文中,我们探讨了一些可以帮助您始终了解系统整体状态的工具。此外,您需要确保您的操作系统和安装的软件包已更新到最新的稳定版本。并且永远、永远不要忘记检查日志!然后,您将朝着正确的方向前进,找到任何问题的最终解决方案。

如果您有任何意见、建议或问题,请随时使用下面的表格留下您的意见、建议或问题。