引言
正如标题所言:如果面试官问你,如果在 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、内存及进程资源消耗。
• 快捷键:
a:按 CPU 使用率排序。
b:按内存使用率排序。
c :退出。
• 示例:
top -c # 显示完整进程命令行
2. htop (需安装)
• 用途: 增强版 top,支持鼠标操作、多核负载可视化。
• 安装:
sudo apt install htop # Debian/Ubuntu
• 示例:
htop # 查看线程级 CPU 使用
3. mpstat (需安装 sysstat )
• 用途: 监控多核 CPU 各核心利用率。
• 示例:
mpstat -P ALL 1 # 每秒刷新所有核心状态
4. perf
• 用途: 深入分析 CPU 性能事件(如函数热点、缓存命中率)。
• 示例:
perf top # 实时查看 CPU 热点
perf record -g # 生成火焰图数据
5. sar(需安装 sysstat)
• 用途: 长期记录 CPU 使用率、上下文切换等。
• 示例:
sar -u 1 5 # 查看过去 5 秒 CPU 使用率
二、内存性能分析
1. free
• 用途: 快速查看内存和 Swap 使用量。
• 示例:
free -h # 以 GB/MB 显示
2. vmstat
• 用途: 综合监控内存、Swap、进程队列和 I/O。
• 示例:
vmstat 1 # 每秒刷新一次
3. smem(需安装)
• 用途: 按进程统计实际物理内存占用(USS/PSS/RSS)。
• 安装:
sudo apt install smem # Debian/Ubuntu
• 示例:
smem -u # 按用户统计内存
4. slabtop
• 用途: 分析内核 Slab 缓存(内核对象占用内存)。
• 示例:
slabtop -s c # 按缓存大小排序
三、磁盘性能分析
1. iostat(需安装 sysstat)
• 用途: 监控磁盘吞吐量、延迟和利用率。
• 示例:
iostat -xz 1 # 查看详细 I/O 统计
2. iotop(需安装)
• 用途: 按进程实时显示磁盘 I/O 活动。
• 安装:
sudo apt install iotop # Debian/Ubuntu
• 示例:
iotop -o # 仅显示活跃 I/O 进程
3. blktrace(需安装)
• 用途: 深度跟踪块设备 I/O 请求(调试磁盘性能瓶颈)。
• 示例:
blktrace -d /dev/sda -o trace # 跟踪 sda 设备
四、网络性能分析
1. iftop(需安装)
• 用途: 实时监控网络连接带宽。
• 示例:
sudo iftop -i eth0 # 指定网卡监控
2. nethogs(需安装)
• 用途: 按进程统计网络流量。
• 示例:
nethogs eth0 # 查看指定网卡流量
3. ss
• 用途: 替代 netstat,快速查看连接和端口状态。
• 示例:
ss -tunlp # 显示所有 TCP/UDP 连接及进程
4. tcpdump
• 用途: 抓包分析网络流量(需 root 权限)。
• 示例:
tcpdump -i eth0 port 80 # 抓取 HTTP 流量
五、进程级分析
1. pidstat(需安装 sysstat )
• 用途: 监控进程的 CPU、内存、I/O。
• 示例:
pidstat -d -p 1234 1 # 监控 PID 1234 的磁盘 I/O
2. strace
• 用途: 跟踪进程的系统调用和信号。
• 示例:
strace -p 1234 -T # 跟踪 PID 1234 的调用耗时
六、综合工具与场景指南
1. 一站式监控工具
• glances(需安装)
glances # 实时监控 CPU、内存、磁盘、网络
• dstat(需安装)
dstat -c -m -d -n # 综合显示 CPU、内存、磁盘、网络
2. 高频场景速查
• 系统卡顿:
top → vmstat 1 → iostat 1 → pidstat 1 # 逐层定位瓶颈
• 网络延迟:
ping 8.8.8.8 → traceroute google.com → tcpdump -i eth0 # 逐步排查
• 进程异常:
strace -p <PID> → perf record -g -p <PID> # 分析系统调用和 CPU 热点
3. 实用组合命令
• 查找 CPU/内存占用 Top 进程:
ps aux --sort=-%cpu | head -10 # Top 10 CPU 进程
ps aux --sort=-%mem | head -10 # Top 10 内存进程
• 持续监控磁盘空间:
watch -n 1 'df -h' # 每秒刷新磁盘使用
七、使用场景总结
• 系统变慢: 先用 top 或 htop 查看整体负载,再用 vmstat/iostat 定位 CPU、磁盘或内存瓶颈。
• 网络延迟: iftop 或 nethogs 查看流量,tcpdump 抓包分析。
• 进程卡死: strace 跟踪系统调用,perf 分析 CPU 热点。
实际案例解说
这边选择几个有代表性的把参数详细聊聊。
vmstat 命令显示了 系统资源的实时状态,帮助你监控 CPU、内存、IO、进程等资源的使用情况。
(进程相关)
• r: 运行队列中等待 CPU 的进程数。如果这个数值大于 CPU 核心数量,说明系统 CPU 资源不足。
• b: 不可中断睡眠的进程数(一般是等待 I/O 的进程)。
(内存相关)
• swpd: 使用的 swap 空间(单位:KB)。如果非 0,表示系统已经在使用 swap 分区,可能会影响性能。
• free: 空闲内存(单位:KB)。
• buff: 用于缓冲区的内存(单位:KB),用于存储文件系统的元数据。
• cache: 用于缓存的内存(单位:KB),加速数据读取。如果缓存命中率高,会减少 I/O 压力。
(交换分区相关)
• si(swap in): 从 swap 分区交换到内存的大小(单位:KB/秒)。
• so(swap out): 从内存交换到 swap 分区的大小(单位:KB/秒)。
• 如果 si 和 so 值较大,说明系统内存不足,需要频繁使用 swap,这会降低性能。
(相关)
• bi(block in): 从块设备(如磁盘)读取的数据量(单位:块/秒)。
• bo(block out): 写入块设备(如磁盘)的数据量(单位:块/秒)。
• 这两个值高时,说明磁盘 I/O 活动频繁,可能会成为系统瓶颈。
(系统相关)
• in: 每秒中断次数,包括硬件和系统时钟中断。
• cs(context switches): 每秒上下文切换次数。上下文切换多说明进程频繁切换,可能影响性能。
(相关)
• 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 -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 等工具进行进一步分析。
图片
该命令显示 每个 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 增加,可能需要进一步分析具体的进程或任务。