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

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 | htop # 查看线程级 CPU 使用 |
3. mpstat (需安装 sysstat )
- 用途: 监控多核 CPU 各核心利用率。
- 示例:
1 | mpstat -P ALL 1 # 每秒刷新所有核心状态 |
4. perf
- 用途: 深入分析 CPU 性能事件(如函数热点、缓存命中率)。
- 示例:
1 | perf top # 实时查看 CPU 热点 |
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 | ps aux --sort=-%cpu | head -10 # Top 10 CPU 进程 |
- 持续监控磁盘空间:
1 | watch -n 1 'df -h' # 每秒刷新磁盘使用 |
使用场景总结
- 系统变慢: 先用 top 或 htop 查看整体负载,再用 vmstat/iostat 定位 CPU、磁盘或内存瓶颈。
- 网络延迟: iftop 或 nethogs 查看流量,tcpdump 抓包分析。
- 进程卡死: strace 跟踪系统调用,perf 分析 CPU 热点。
实际案例解说
这边选择几个有代表性的把参数详细聊聊。
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 -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
该命令显示 每个 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 增加,可能需要进一步分析具体的进程或任务。