Linux 系统故障时,你会用哪些工具排查?

引言

正如标题所言:在 Linux 中系统出现了问题,你会使用哪些工具排查呢?

简介

性能分析

  • top: 实时显示系统的 CPU、内存使用情况,以及各个进程的资源消耗。
  • htop: top 命令的增强版,界面更友好,支持鼠标操作,可以更加方便地查看和管理进程。
  • mpstat: 显示各个 CPU 核心的使用情况,分析多核系统中的 CPU 负载。
  • sar: 系统活动报告工具,可以监控 CPU、内存、I/O 等系统资源的使用情况。它可以在长时间内进行系统性能的数据采集。
  • vmstat: 查看 CPU、内存、交换分区的性能,能够检测 CPU 的等待时间和系统瓶颈。

内存性能分析

  • free: 显示系统当前的内存和交换分区使用情况。
  • vmstat: 显示内存、进程、I/O 系统的性能状态。可以帮助分析内存的使用情况。
  • smem: 详细列出每个进程的内存消耗情况。
  • top / htop: 可以查看每个进程的内存使用情况。
  • slabtop: 显示内核 slab 缓存的使用情况,有助于了解内存中缓存数据块的分布。

磁盘性能分析

  • iostat: 显示磁盘 I/O 的性能统计信息,尤其是在分析磁盘读写性能时非常有用。
  • iotop: 类似于 top,但专注于磁盘 I/O,能够按进程显示实时 I/O 活动。
  • df: 显示文件系统的磁盘使用情况。
  • du: 显示文件或目录的磁盘空间使用情况。
  • lsblk: 列出所有存储设备和分区信息。
  • blktrace: 对块设备进行详细的 I/O 跟踪分析。

网络性能分析

  • ifconfig / ip: 显示和配置网络接口的信息。
  • netstat: 查看网络连接、路由表、接口状态、协议统计等。
  • ss: 替代 netstat 的工具,功能更强大,速度更快,分析网络连接和套接字。
  • iftop: 实时监控网络带宽使用情况,显示每个网络连接的实时流量。
  • nload: 实时查看网络流量的工具,能够显示出入口和出口的带宽使用情况。
  • ping: 测试与远程主机的网络连通性,测量网络延迟。
  • traceroute: 查看数据包从本地主机到目标主机经过的路由信息。
  • tcpdump: 强大的网络抓包工具,能够捕获和分析网络数据包。
  • nmap: 网络扫描工具,检查开放端口、主机发现和网络服务。

进程管理

  • ps: 列出当前正在运行的进程。
  • top / htop: 查看实时进程资源消耗情况。
  • pstree: 以树形结构展示进程关系。
  • kill: 终止特定的进程。
  • strace: 跟踪系统调用和信号,分析进程执行的系统调用,非常适合调试和跟踪进程的运行状态。

综合性能分析

  • dstat: 结合 vmstat、iostat、netstat 等工具的功能,实时显示 CPU、内存、磁盘 I/O、网络等资源的使用情况。
  • perf: 内核提供的强大性能分析工具,支持采样、跟踪和性能分析,适合开发人员和高级用户进行深入的性能调优。
  • sar: 系统监控和报告工具,可以详细记录 CPU、内存、网络、I/O 等各方面的性能。
  • sysstat: 包含 iostat、mpstat、sar 等多种工具的综合工具包。
  • glances: 类似于 htop 和 dstat 的结合,实时监控 CPU、内存、磁盘、网络、进程等多项系统性能指标。

最佳实践

性能分析

1. top

  • 用途: 实时监控 CPU、内存及进程资源消耗。

  • 快捷键:

    • shift + P:按 CPU 使用率排序。
    • shift + M:按内存使用率排序。
    • q:退出。
  • 示例:

1
top -c  # 显示完整进程命令行

2. htop (需安装)

  • 用途: 增强版 top,支持鼠标操作、多核负载可视化。
  • 安装:
1
sudo apt install htop  # Debian/Ubuntu
  • 示例:
1
2
htop  # 查看线程级 CPU 使用
htop -d 5 # 每5秒刷新,按F2配置显示列 按F5显示树列

3. mpstat (需安装 sysstat )

  • 用途: 监控多核 CPU 各核心利用率。
  • 示例:
1
mpstat -P ALL 1  # 每秒刷新所有核心状态

4. perf

  • 用途: 深入分析 CPU 性能事件(如函数热点、缓存命中率)。
  • 示例:
1
2
perf top       # 实时查看 CPU 热点
perf record -g # 生成火焰图数据

5. sar(需安装 sysstat)

  • 用途: 长期记录 CPU 使用率、上下文切换等。
  • 示例:
1
sar -u 1 5  # 查看过去 5 秒 CPU 使用率

内存性能分析

1. free

  • 用途: 快速查看内存和 Swap 使用量。
  • 示例:
1
free -h  # 以 GB/MB 显示

2. vmstat

  • 用途: 综合监控内存、Swap、进程队列和 I/O。
  • 示例:
1
vmstat 1  # 每秒刷新一次

3. smem(需安装)

  • 用途: 按进程统计实际物理内存占用(USS/PSS/RSS)。
  • 安装:
1
sudo apt install smem  # Debian/Ubuntu
  • 示例:
1
smem -u  # 按用户统计内存

4. slabtop

  • 用途: 分析内核 Slab 缓存(内核对象占用内存)。
  • 示例:
1
slabtop -s c  # 按缓存大小排序

磁盘性能分析

1. iostat(需安装 sysstat)

  • 用途: 监控磁盘吞吐量、延迟和利用率。
  • 示例:
1
iostat -xz 1  # 查看详细 I/O 统计

2. iotop(需安装)

  • 用途: 按进程实时显示磁盘 I/O 活动。
  • 安装:
1
sudo apt install iotop  # Debian/Ubuntu
  • 示例:
1
iotop -o  # 仅显示活跃 I/O 进程

3. blktrace(需安装)

  • 用途: 深度跟踪块设备 I/O 请求(调试磁盘性能瓶颈)。
  • 示例:
1
blktrace -d /dev/sda -o trace  # 跟踪 sda 设备

网络性能分析

1. iftop(需安装)

  • 用途: 实时监控网络连接带宽。
  • 示例:
1
sudo iftop -i eth0  # 指定网卡监控

2. nethogs(需安装)

  • 用途: 按进程统计网络流量。
  • 示例:
1
nethogs eth0  # 查看指定网卡流量

3. ss

  • 用途: 替代 netstat,快速查看连接和端口状态。
  • 示例:
1
ss -tunlp  # 显示所有 TCP/UDP 连接及进程

4. tcpdump

  • 用途: 抓包分析网络流量(需 root 权限)。
  • 示例:
1
tcpdump -i eth0 port 80  # 抓取 HTTP 流量

进程级分析

1. pidstat(需安装 sysstat )

  • 用途: 监控进程的 CPU、内存、I/O。
  • 示例:
1
pidstat -d -p 1234 1  # 监控 PID 1234 的磁盘 I/O

2. strace

  • 用途: 跟踪进程的系统调用和信号。
  • 示例:
1
strace -p 1234 -T  # 跟踪 PID 1234 的调用耗时

综合工具与场景指南

1. 一站式监控工具

  • glances(需安装)
1
glances  # 实时监控 CPU、内存、磁盘、网络
  • dstat(需安装)
1
dstat -c -m -d -n  # 综合显示 CPU、内存、磁盘、网络

2. 高频场景速查

  • 系统卡顿:
1
top → vmstat 1 → iostat 1 → pidstat 1  # 逐层定位瓶颈
  • 网络延迟:
1
ping 8.8.8.8 → traceroute google.com → tcpdump -i eth0  # 逐步排查
  • 进程异常:
1
strace -p <PID> → perf record -g -p <PID>  # 分析系统调用和 CPU 热点

3. 实用组合命令

  • 查找 CPU/内存占用 Top 进程:
1
2
ps aux --sort=-%cpu | head -10  # Top 10 CPU 进程
ps aux --sort=-%mem | head -10 # Top 10 内存进程
  • 持续监控磁盘空间:
1
watch -n 1 'df -h'  # 每秒刷新磁盘使用

使用场景总结

  • 系统变慢: 先用 top 或 htop 查看整体负载,再用 vmstat/iostat 定位 CPU、磁盘或内存瓶颈。
  • 网络延迟: iftop 或 nethogs 查看流量,tcpdump 抓包分析。
  • 进程卡死: strace 跟踪系统调用,perf 分析 CPU 热点。

实际案例解说

这边选择几个有代表性的把参数详细聊聊。

vmstat

vmstat

vmstat 命令显示了 系统资源的实时状态,帮助你监控 CPU、内存、IO、进程等资源的使用情况。

1. procs(进程相关)

  • r: 运行队列中等待 CPU 的进程数。如果这个数值大于 CPU 核心数量,说明系统 CPU 资源不足。
  • b: 不可中断睡眠的进程数(一般是等待 I/O 的进程)。

2. memory(内存相关)

  • swpd: 使用的 swap 空间(单位:KB)。如果非 0,表示系统已经在使用 swap 分区,可能会影响性能。
  • free: 空闲内存(单位:KB)。
  • buff: 用于缓冲区的内存(单位:KB),用于存储文件系统的元数据。
  • cache: 用于缓存的内存(单位:KB),加速数据读取。如果缓存命中率高,会减少 I/O 压力。

3. swap(交换分区相关)

  • si(swap in): 从 swap 分区交换到内存的大小(单位:KB/秒)。

  • so(swap out): 从内存交换到 swap 分区的大小(单位:KB/秒)。

    • 如果 si 和 so 值较大,说明系统内存不足,需要频繁使用 swap,这会降低性能。

4. io(相关)

  • bi(block in): 从块设备(如磁盘)读取的数据量(单位:块/秒)。

  • bo(block out): 写入块设备(如磁盘)的数据量(单位:块/秒)。

    • 这两个值高时,说明磁盘 I/O 活动频繁,可能会成为系统瓶颈。

5. system(系统相关)

  • in: 每秒中断次数,包括硬件和系统时钟中断。
  • cs(context switches): 每秒上下文切换次数。上下文切换多说明进程频繁切换,可能影响性能。

6. cpu(cpu相关)

  • us(user time): CPU 花费在用户进程上的时间百分比。用户进程是指非内核的应用程序。
  • sy(system time): CPU 花费在系统内核进程上的时间百分比。
  • id(idle time): CPU 的空闲时间百分比。如果值很高,说明 CPU 比较空闲。
  • wa(wait time): CPU 等待 I/O 的时间百分比。如果值高,说明 I/O 成为系统瓶颈。
  • st(steal time): 虚拟机中,CPU 被其他虚拟机占用的时间百分比。如果值高,说明虚拟化资源不足。

如何分析图中的数据:

  • r 为 0: 没有等待 CPU 的进程,CPU 资源充足。
  • id 高达 98-97%: CPU 基本处于空闲状态,系统负载很低。
  • wa 为 0%: 没有 CPU 等待 I/O,I/O 性能正常。
  • si 和 so 为 0: 系统没有使用 swap,内存充足。
  • bi 和 bo 较低: 磁盘 I/O 压力不大。

总结:

从截图来看,系统整体运行状态非常良好:

  • CPU 基本处于空闲状态(id 很高)。
  • 没有使用 swap(swpd、si、so 都是 0)。
  • 没有等待 CPU 或 I/O 的进程(r、b 和 wa 都接近 0)。

这表明当前系统负载很低,没有出现任何性能瓶颈。

iostat

iostat

你的截图显示了 iostat -d 3 命令的输出,它展示了 磁盘设备的性能数据。

iostat -d 3 输出字段解释

1. Device:

  • 显示监控的磁盘设备名称(如 vda 和 vdb)。
  • 这些是块设备,如虚拟机中的磁盘、物理磁盘或分区。

2. tps(Transactions per Second):

  • 每秒对该设备发起的 I/O 请求数(读或写)。
  • 这个值越高,说明设备的 I/O 活动越频繁。

3. kB_read/s:

  • 每秒从设备读取的 数据量(单位:KB)。
  • 如果这个值持续较高,说明系统在频繁读取数据。

4. kB_wrtn/s:

  • 每秒写入设备的 数据量(单位:KB)。
  • 如果写入数据量较高,说明系统在频繁写数据到磁盘。

5. kB_dscd/s(discarded data per second):

  • 每秒丢弃的数据量(单位:KB)。通常用于监控 SSD 设备的 TRIM 操作。
  • 在你的输出中,该值为 0,说明当前没有丢弃操作。

6. kB_read:

  • 从启动以来总共读取的数据量(单位:KB)。

7. kB_wrtn:

  • 从启动以来总共写入的数据量(单位:KB)。

8. kB_dscd:

  • 从启动以来总共丢弃的数据量(单位:KB)。在你截图中为 0。

分析你的输出

  • vda 设备:

    • tps:3.74,每秒有 3.74 个 I/O 操作。
    • 读取速率:每秒读取 0.52 KB。
    • 写入速率:每秒写入 65.88 KB。
    • 说明:vda 设备的写入操作较为频繁,性能上主要是写密集型。
  • vdb 设备:

    • tps:0.10,每秒只有 0.10 个 I/O 操作。
    • 读取和写入速率:读取和写入数据量都很小(约 0.52 KB 和 2.10 KB/s)。
    • 说明:vdb 设备 I/O 活动较少,读写需求不高。

如何解读这些数据

1. I/O 活动:

  • vda 设备 I/O 活动相对较高,且主要以写操作为主(每秒写入 65.88 KB)。
  • vdb 活动非常少,基本没有大量的读写需求。

2. 性能分析:

  • 如果写入操作频繁且 I/O 性能出现瓶颈(如 tps 和 kB_wrtn/s 高得离谱),可能需要检查设备是否需要优化或扩展。
  • 如果读取较慢,可能需要检查是否有必要优化缓存。

总结

  • vda 设备 主要是写操作频繁,需要密切监控写入性能。
  • vdb 设备 活动很少,没有明显的性能压力。

你可以继续使用 iostat 命令来实时监控设备的 I/O 性能,并观察这些值是否在高峰期发生显著变化。如有必要,也可以结合 iotop 或 dstat 等工具进行进一步分析。

mpstat

mpstat

该命令显示 每个 CPU 核心 的详细使用情况,并每 3 秒更新一次。

字段解释:

1. CPU:

  • 显示是哪一个 CPU 核心。
  • all 表示所有 CPU 核心的平均值。
  • 接下来的每一行代表一个具体的 CPU 核心(例如 0 到 7 代表系统中的 8 个核心)。

2. %usr(User Time):

  • 用户进程消耗的 CPU 百分比(不包括内核进程)。
  • 这个值较高时,说明系统在运行大量的用户级应用程序。

3. %nice(Nice Time):

  • 被调整优先级(nice 级别)的进程消耗的 CPU 百分比。
  • 如果有低优先级任务占用大量 CPU 时间,这个值会增加。

4. %sys(System Time):

  • 内核进程消耗的 CPU 百分比。
  • 如果这个值较高,说明内核级的任务或 I/O 操作占用了大量 CPU 时间。

5. %iowait(I/O Wait):

  • CPU 等待 I/O 操作完成的时间百分比。
  • 如果这个值较高,说明 CPU 大量时间被耗费在等待磁盘或网络 I/O 上。

6. %irq(Interrupt Requests):

  • CPU 处理硬件中断(IRQ)请求的时间百分比。
  • 高值表明系统中有频繁的硬件中断(如网络或磁盘活动)。

7. %soft(Soft IRQs):

  • 软中断占用的 CPU 时间百分比。
  • 软中断多与网络或驱动程序相关。

8. %steal(Steal Time):

  • 在虚拟化环境中,CPU 被其他虚拟机占用的时间百分比。
  • 如果值较高,说明虚拟机没有获得足够的 CPU 资源。

9. %guest(Guest Time):

  • CPU 用于运行虚拟机内进程的时间百分比。

10. %gnice(Guest Nice Time):

  • 虚拟机中被调整了优先级的进程消耗的时间。

11. %idle(Idle Time):

  • CPU 空闲的时间百分比。
  • 如果该值高,说明系统比较空闲;如果低,说明 CPU 资源繁忙。

分析你的输出:

1. 所有 CPU 核心的平均情况(all 行):

  • %usr: 2.59%——用户进程占用少量 CPU 时间。
  • %sys: 2.30%——内核进程也占用了一些时间。
  • %iowait: 0.17%——CPU 花在等待 I/O 的时间很少。
  • %idle: 94.95%——整体来看,CPU 大部分时间处于空闲状态。

2. 各个 CPU 核心的情况:

  • CPU 6: %usr 为 7.33%,CPU 活动稍高。
  • 其余核心: 大部分核心的 %idle 在 90% 以上,表明它们大部分时间处于空闲状态。

总结:

  • 系统整体负载较低,因为所有 CPU 的空闲时间 %idle 都很高(94% 以上)。
  • CPU 6 相较于其他核心稍微活跃,但没有出现过高的负载,说明系统没有性能瓶颈。
  • I/O 等待时间 %iowait 很低(0.17%),说明磁盘和网络 I/O 不存在明显的瓶颈。

你当前的系统状态非常良好,CPU 负载轻,I/O 等待时间短,无需额外优化。如果某个 CPU 核心的负载过高或 %iowait 增加,可能需要进一步分析具体的进程或任务。