深入理解Linux操作系统的底层原理和性能表现,离不开一系列强大的工具。掌握这些性能分析工具,不仅能帮助定位问题,更是检验系统知识的试金石。性能分析和优化是一个系统工程,需要结合计算机系统、网络和操作系统等多方面知识。
背景知识是分析性能问题的基础。例如,硬件缓存的工作机制、操作系统内核的调度策略,都会以意想不到的方式影响应用程序的表现。某些程序若无法有效利用缓存,就可能导致性能瓶颈。
性能分析工具
首先来看一张著名的Linux性能分析工具全景图,它清晰地展示了各类工具与系统组件的关系:

这张图由性能分析专家Brendan Gregg分享,涵盖了从应用层到硬件层的观测点。图中所有工具都可以通过 man 命令查阅详细文档。下面我们来逐一介绍这些核心工具的常规用法。
1. vmstat – 虚拟内存统计
vmstat (Virtual Memory Statistics) 是监控内存、进程和CPU整体状况的常用工具。其常规用法为 vmstat [interval] [times],表示每隔 interval 秒采样一次,共采样 times 次。若省略次数,则持续采集直到手动停止(Ctrl+C)。例如:

输出结果解读:
- 第一行:自系统启动以来的平均值。
- 后续行:展示每个采样间隔(本例为5秒)内发生的情况。
各列含义如下:
- procs:
r:等待CPU的进程数。
b:处于不可中断睡眠(通常是在等待I/O)的进程数。
- memory:
swpd:已使用的虚拟内存大小。
free:空闲的物理内存大小。
buff:用作缓冲区的内存大小。
cache:用作操作缓存的的内存大小。
- swap:
si:每秒从磁盘换入的内存大小。
so:每秒换出到磁盘的内存大小。
- io:
bi:每秒从块设备读取的块数。
bo:每秒写入块设备的块数。
- system:
- cpu(百分比):
us:用户态CPU时间。
sy:内核态CPU时间。
id:空闲CPU时间。
wa:等待I/O的CPU时间。
内存不足的典型表现:free内存急剧减少,buffer和cache被大量回收,swpd使用量高,si/so(页面交换)频繁,bi/bo(磁盘I/O)增多,in(缺页中断)增多,cs(上下文切换)增多,b(等待I/O进程)增多,wa(I/O等待CPU时间)占比高。
2. iostat – CPU与设备I/O统计
iostat 用于报告CPU统计信息及系统、磁盘、tty设备的输入/输出统计。默认显示与vmstat类似的CPU信息,使用 -d 参数显示设备详细统计,-x 显示扩展信息:

第一行是系统启动以来的平均值,后续为增量平均值。常见磁盘I/O指标缩写规律:rq(request), r(read), w(write), qu(queue), sz(size), avg(average), tm(time), svc(service)。
关键指标解读:
rrqm/s, wrqm/s:每秒合并的读/写请求数。
r/s, w/s:每秒发送到设备的读/写请求数。
rsec/s, wsec/s:每秒读/写的扇区数。
avgrq-sz:平均请求扇区数。
avgqu-sz:平均请求队列长度。
await:平均I/O请求处理时间(包括队列等待和服务时间)。
svctm:平均I/O请求服务时间(设备实际处理时间)。
%util:设备带宽利用率(有I/O请求的时间百分比)。
3. dstat – 多功能系统监控工具
dstat 综合显示了CPU、磁盘I/O、网络流量、分页活动等多种资源使用情况。其输出为彩色,信息比vmstat和iostat更详细直观。直接输入 dstat 命令即可使用,也可以通过参数定制显示内容。
4. iotop – 进程级磁盘I/O监控
iotop 是一个类似 top 的交互式工具,专门用于实时监控各个进程的磁盘I/O使用情况。可以方便地查看是哪个进程产生了高I/O负载。也可以非交互式运行:
iotop –bod [interval]
要查看每个进程的I/O,也可以使用 pidstat:
pidstat -d [interval]
5. pidstat – 监控进程资源占用
pidstat 主要用于监控全部或指定进程对系统资源(CPU、内存、设备I/O、上下文切换等)的占用情况。
- 监控进程I/O:
pidstat –d [interval]
- 监控进程CPU:
pidstat –u [interval]
- 监控进程内存:
pidstat –r [interval]
6. top – 经典的进程动态监视器
top 命令的汇总区域显示了五个方面的系统性能信息:
- 系统负载:运行时间、登录用户数、系统平均负载(1, 5, 15分钟)。
- 进程状态:运行、睡眠、停止、僵尸进程的数量。
- CPU状态:用户态、内核态、nice调整、空闲、等待I/O、处理硬中断/软中断的时间百分比。
- 内存状态:总量、已用、空闲(系统视角)、缓冲区、缓存的使用量。
- 交换分区:总量、已用、空闲。
任务区域默认显示:进程ID、有效用户、优先级、NI值、虚拟内存使用(VIRT)、常驻物理内存(RES)、共享内存(SHR)、进程状态(S)、CPU占用率(%CPU)、内存占用率(%MEM)、累计CPU时间(TIME+)、命令行(COMMAND)。
7. htop – top的增强版
htop 是一个交互性更强、体验更好的进程查看器。相比 top,其优点包括:
- 支持横向/纵向滚动,可查看完整的进程列表和命令行。
- 启动速度通常更快。
- 杀进程时直接用鼠标或键盘选择,无需输入PID。
- 支持鼠标操作,并具有更丰富的颜色主题。
8. mpstat – 多处理器CPU统计
mpstat (Multiprocessor Statistics) 是实时系统监控工具,报告CPU统计信息(数据来源于 /proc/stat)。在多CPU系统中,既能查看所有CPU的平均状况,也能查看指定CPU的信息。
常见用法:mpstat –P ALL [interval] [times]
9. netstat – 网络连接与统计信息
netstat 用于显示与IP、TCP、UDP和ICMP协议相关的网络连接与统计信息,常用于检查本机各端口的网络连接情况。它涵盖了从基础连接到网络/系统路由、接口状态等广泛信息。
常见用法:
netstat -npl # 查看监听端口及对应进程。
netstat -rn # 打印内核路由表信息。
netstat -i # 显示网络接口信息,包括MTU、收发数据包、错误、冲突数等。
10. ps – 进程状态快照
ps (Process Status) 用于显示当前时刻的进程状态快照,参数组合非常丰富,可通过 man ps 深入学习。
常用命令:
ps aux # 查看所有进程的详细信息。
ps –ef | grep [keyword] # 过滤查找特定进程。
杀进程组合命令示例:
ps aux | grep mysqld | grep –v grep | awk ‘{print $2}’ | xargs kill -9
杀僵尸进程:
ps –eal | awk ‘{if ($2 == “Z”){print $4}}’ | xargs kill -9
11. strace – 系统调用跟踪
strace 跟踪程序执行过程中产生的系统调用及接收到的信号,是分析程序异常行为的利器。
举例:查看 mysqld 启动时尝试加载的配置文件路径:
strace -e stat64 mysqld --print-defaults > /dev/null
12. uptime – 系统运行时间与负载
uptime 命令简洁地输出系统运行时长和平均负载。其输出的最后三个数字分别代表过去1分钟、5分钟、15分钟的系统平均负载。
13. lsof – 列出打开文件
lsof (list open files) 列出当前系统打开的文件(包括网络连接、设备等),是系统检测和排错的重要工具。
常见用法:
lsof /boot # 查看谁正在使用`/boot`文件系统(阻塞卸载)。
lsof -i :3306 # 查看哪个进程占用了3306端口。
lsof -u username # 查看指定用户打开的所有文件。
lsof -p 4838 # 查看指定进程打开的所有文件。
lsof -i @192.168.34.128 # 查看与指定IP的网络连接。
14. perf – Linux内核性能分析器
perf 是Linux内核自带的性能分析工具,与内核紧密结合,能利用最新内核特性。它可用于查看热点函数、缓存命中率等,帮助开发者优化程序性能。
其基本原理是基于事件采样。例如,根据tick中断进行采样,统计采样点落在各个函数上下文中的频率。如果某个函数(如foo())消耗了90%的时间,那么采样点也应有约90%落在此函数中。通过分析采样结果,即可定位性能瓶颈。
工具使用思路总结
结合以上介绍的性能分析命令,再回顾开篇的性能分析工具架构图,就可以初步建立起性能分析的知识框架:遇到CPU瓶颈时该用哪些工具,遇到I/O瓶颈时又该用哪些工具。
进阶性能测试与调优工具
在熟练使用上述基础分析命令后,可以进一步了解一些更强大的性能测试与调优工具集。它们往往提供了更深度的洞察和更强大的功能,是进行运维/DevOps/SRE工作的利器。
- perf_events: 即
perf 工具,随内核发布维护,可用于应用和内核的性能统计。
- eBPF tools: 基于eBPF (Extended BPF) 技术的性能追踪工具集,通过bcc等工具实现,允许用户空间自定义内核追踪和操作程序。
- perf-tools: 一套基于
perf_events 和 ftrace 的简单易用的性能分析脚本合集。
- bcc (BPF Compiler Collection): 一套用于创建高效内核追踪和操作程序的工具包,包含许多实用的工具和示例,需要Linux 4.1以上内核支持。
- ktap: 一种新型的Linux动态追踪脚本工具,设计上注重交互性和可定制性,类似于DTrace和SystemTap。
- Flame Graphs(火焰图): 一款可视化性能分析工具,将
perf、systemtap等工具采集的堆栈信息生成直观的火焰图形,用于快速识别最频繁的代码路径。源码位于 github.com/brendangregg/flamegraph。
1. Linux 性能观测工具全景
下图更详细地展示了Linux系统中各观察点与对应工具的关系:

- 基础工具:
uptime, top/htop, mpstat, iostat, vmstat, free, ping, nicstat, dstat。
- 高级工具:
sar, netstat, pidstat, strace, tcpdump, blktrace, iotop, slabtop, sysctl, 分析 /proc 文件系统。
2. Linux 性能基准测试工具
要对系统进行性能测评,可以使用专门的基准测试工具,下图展示了不同测试目标对应的工具:

3. Linux 性能调优工具
性能调优往往涉及内核参数、调度策略、I/O优先级等深层次设置,下图汇总了相关的调优工具:

4. sar – 全面的系统活动报告器
sar (System Activity Reporter) 是Linux上功能最全面的系统性能数据收集和分析工具之一。它能够从文件读写、系统调用、磁盘I/O、CPU、内存、进程活动等多个维度进行历史数据收集和实时报告。
sar 的常规使用方式:sar [options] [-A] [-o file] t [n]
t: 采样间隔(秒)。
n: 采样次数。
-o file: 将二进制结果存入文件。

掌握这些工具,意味着你拥有了从现象到本质分析Linux系统性能问题的能力。实践是学习的最好方式,建议在测试环境中多多练习使用。如果你想与更多开发者交流系统性能优化的经验,欢迎访问云栈社区,那里有丰富的技术讨论和资源共享。