出于对Linux操作系统底层知识的兴趣与探求,我整理了这份涵盖系统性能分析与常用工具的文章。它不仅能帮助你检验基础知识,也涉及了系统管理的多个方面。掌握这些工具,离不开扎实的计算机系统、网络和操作系统知识,而系统性能分析与优化本身也是一个需要长期实践的领域。
性能分析工具
首先,来看一张由性能工程专家Brendan Gregg分享的经典工具全景图,它清晰地展示了不同系统层级对应的观测工具:

上图涵盖了丰富的系统性能分析工具,每个工具都可以通过 man 命令查看详细帮助文档。下面,我们将对其中一些核心工具进行介绍。
vmstat -- 虚拟内存统计
vmstat(Virtual Memory Statistics)是Linux中监控内存的常用工具,它能对操作系统的虚拟内存、进程、CPU等整体状况进行监视。其常规用法为 vmstat interval times,即每隔 interval 秒采样一次,共采样 times 次。若省略 times,则会持续采集数据直至手动停止。
例如,执行以下命令进行采样:
vmstat 5

使用 Ctrl+C 即可停止采集。输出结果中,第一行显示了系统自启动以来的平均值,第二行开始展示实时动态,后续每行代表一个5秒间隔的数据。各列含义如下:
- procs:
r 列显示等待CPU的进程数,b 列显示处于不可中断睡眠(通常是在等待I/O)的进程数。
- memory:
swpd 列显示被换出到磁盘的内存量(单位:KB)。其余列分别显示空闲内存、用作缓冲区的内存和用作操作系统缓存的内存量。
- swap:显示交换活动,即每秒从磁盘换入 (
si) 和换出到磁盘 (so) 的内存块数量。
- io:显示每秒从块设备读取 (
bi) 和写入 (bo) 的块数,这通常反映了硬盘I/O活动。
- system:显示每秒发生的中断 (
in) 和上下文切换 (cs) 数量。
- cpu:显示CPU时间花费在各类操作上的百分比,包括执行用户代码 (
us)、执行系统代码 (sy)、空闲 (id) 以及等待I/O (wa)。
如何识别内存不足? 通常表现为:可用内存 (free) 急剧减少,即使回收缓冲区 (buff) 和缓存 (cache) 也效果甚微;交换分区使用量 (swpd) 持续增加且页面交换 (si/so) 频繁;磁盘I/O (bi/bo) 增多;缺页中断 (in) 上升;上下文切换 (cs) 加剧;等待I/O的进程数 (b) 变多;大量CPU时间耗费在等待I/O上 (wa 值高)。
iostat -- 用于报告中央处理器统计信息
iostat 用于报告CPU统计信息以及系统、适配器、tty设备、磁盘和CD-ROM的输入/输出统计信息。其默认显示与 vmstat 相似的CPU使用信息,使用 -d 选项可以显示扩展的设备统计信息,-x 选项能提供更详细的扩展报告。
iostat -dx 5

第一行显示系统启动以来的平均值,后续行显示增量平均值,每个设备独占一行。了解Linux磁盘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:平均请求(服务)时间(通常指磁盘处理请求的时间)。
- %util:设备有至少一个活跃请求的时间百分比,即设备繁忙程度。
dstat -- 系统监控工具
dstat 是一个功能丰富的性能监控工具,它用彩色输出直观地展示了CPU使用率、磁盘I/O、网络流量和内存分页等情况,相比 vmstat 和 iostat 信息更详细、可读性更强。直接输入 dstat 命令即可使用,也可通过参数定制显示内容。
例如,使用以下命令组合查看多项指标:
dstat -cdlmnpsy

iotop -- LINUX进程实时监控工具
iotop 命令专门用于监视磁盘I/O,其界面风格类似于 top 命令,可以清晰地显示是哪个进程产生了I/O负载。它是一个交互式的top类工具,展示PID、用户、I/O速率、进程等相关信息。
你也可以以非交互方式运行它:
iotop -bod interval
若需查看每个进程的I/O情况,也可以使用 pidstat 命令:
pidstat -d interval
pidstat -- 监控系统资源情况
pidstat 主要用于监控全部或指定进程占用系统资源的情况,如CPU、内存、设备I/O、任务切换、线程等。它是分析进程级性能问题的利器。
-
监控进程I/O:
pidstat -d interval
-
统计CPU使用信息:
pidstat -u interval
-
统计内存信息:
pidstat -r interval
top
top 命令是最经典的实时系统监控工具。其顶部汇总区域显示了五个方面的系统性能信息:
- 系统负载与时间:当前时间、登录用户数、系统1/5/15分钟平均负载。
- 进程状态:运行中、睡眠中、已停止、僵尸进程的数量。
- CPU使用率:用户态 (
us)、核心态 (sy)、低优先级 (ni)、空闲 (id)、等待I/O (wa)、处理硬件中断 (hi)、处理软件中断 (si) 的时间百分比。
- 内存使用:物理内存总量、已用量、空闲量(系统视角)、缓冲区用量、缓存用量。
- 交换分区:交换分区总量、已用量、空闲量。
任务区域默认显示:进程ID、有效用户、进程优先级、NICE值、进程使用的虚拟内存、物理内存和共享内存、进程状态、CPU占用率、内存占用率、累计CPU时间以及进程命令行信息。
htop
htop 是 Linux 系统中的一个交互式进程查看器,一个在控制台或X终端中运行的文本模式应用程序(需要 ncurses 库支持)。

htop 允许用户进行交互式操作,支持颜色主题,可以横向或纵向滚动浏览进程列表,甚至支持鼠标点击操作。与 top 相比,它的优点包括:
- 可以横向或纵向滚动,以便查看所有进程和完整的命令行。
- 通常启动速度比
top 更快。
- 结束进程时无需输入进程号,使用功能键即可。
- 支持鼠标操作,体验更友好。
mpstat
mpstat(Multiprocessor Statistics)是实时系统监控工具,用于报告CPU的统计信息,这些信息来源于 /proc/stat 文件。在多CPU(多核)系统中,它不仅能查看所有CPU的平均状况,还能查看特定CPU的详细信息。
常见用法:
mpstat -P ALL interval times
netstat
netstat 用于显示与 IP、TCP、UDP 和 ICMP 协议相关的统计数据,常用于检查本机各端口的网络连接情况和网络状态。
常见用法:
-
查看监听端口及对应进程:
netstat -npl # 可以查看你要打开的端口是否已经打开。
-
打印路由表信息:
netstat -rn
-
提供系统上的网络接口信息:
netstat -in # 打印每个接口的MTU、输入/输出分组数、错误数、冲突数以及当前输出队列长度。
ps -- 显示当前进程的状态
ps 命令参数繁多,具体使用方法可参考 man ps。
一些常用的方法:
-
显示所有进程的详细信息:
ps aux
-
结合 grep 查找特定进程:
ps -ef | grep process_name
示例:结束指定程序
ps aux | grep mysqld | grep -v grep | awk '{print $2}' | xargs kill -9
示例:清理僵尸进程
ps -eal | awk '{if ($2 == "Z"){print $4}}' | xargs kill -9
strace
strace 用于跟踪程序执行过程中产生的系统调用及接收到的信号,是分析程序或命令执行中遇到异常情况的强大工具。
举例:查看 mysqld 在 Linux 上加载了哪种配置文件,可以运行:
strace -e stat64 mysqld --print --defaults > /dev/null
uptime
uptime 命令能够打印系统总共运行了多长时间以及系统的平均负载。其输出的最后三个数字分别代表过去1分钟、5分钟、15分钟内系统的平均负载。
lsof
lsof(list open files)是一个列出当前系统打开文件的工具。通过它,可以查看文件、网络连接等被哪些进程使用,常用于系统检测和排错。
常见用法:
-
查看文件系统阻塞(例如查看谁正在使用 /boot 目录):
lsof /boot
-
查看端口号被哪个进程占用(例如查看3306端口):
lsof -i :3306
-
查看用户打开了哪些文件:
lsof -u username
-
查看进程打开了哪些文件(例如查看PID为4838的进程):
lsof -p 4838
-
查看远程已打开的网络连接:
lsof -i @192.168.34.128
perf
perf 是 Linux kernel 自带的系统性能优化工具。其最大优势在于与 Linux Kernel 的紧密结合,能够利用内核加入的新特性。它可以用来查看热点函数、分析缓存命中率等,从而帮助开发者优化程序性能。
perf、Oprofile 等性能调优工具的基本原理都是对被监测对象进行采样。最简单的情况是根据 tick 中断进行采样:在 tick 中断内触发采样点,并记录采样点时程序的上下文。如果一个程序90%的时间都花费在函数 foo() 上,那么在足够高频率和足够长时间的采样下,大约90%的采样点都应该落在函数 foo() 的上下文中。通过这种方式,我们可以了解程序中的性能热点,从而进行针对性优化。
工具使用小结
结合以上常用的性能分析命令,并回顾开篇的性能分析工具全景图,我们可以初步建立认知:在分析系统不同方面的性能时,应该优先考虑使用对应的工具。
常用的性能测试工具
在熟悉了第二部分的基础性能分析命令后,我们可以进一步了解一些更强大的性能测试与剖析工具。首先简单认识以下几个:
- perf_events:一款随 Linux 内核代码一同发布和维护的性能诊断工具,由内核社区维护。它既可用于应用程序的性能统计分析,也可应用于内核代码的性能统计和分析。
- eBPF tools:一套使用 BPF 编译器集合(BCC)进行性能追踪的工具。eBPF 程序可以创建自定义的内核跟踪和操作程序,功能强大且灵活。
- perf-tools:一套基于 perf_events 和 ftrace 的 Linux 性能分析调优工具集。它依赖库少,使用简单,支持 Linux 3.2 及以上内核。
- bcc (BPF Compiler Collection):一套使用 eBPF 创建高效内核跟踪和操作程序的工具包,包含许多有用的工具和示例。它需要 Linux 4.1 以上内核版本支持。
- ktap:一种新型的 Linux 脚本化动态性能跟踪工具,允许用户动态跟踪 Linux 内核,设计上注重交互性,类似于 Solaris DTrace 和 SystemTap。
- Flame Graphs(火焰图):一款使用 perf、systemtap、ktap 等工具生成的可视化性能分析图形。它能让最频繁执行的代码路径被快速准确地识别。生成程序的开源代码位于
github.com/brendangregg/flamegraph。
Linux 性能观测工具
下图更详细地展示了Linux性能可观测性工具的全貌:

基础工具 (Basic Tools):建议首先学习掌握,例如 uptime, top/htop, mpstat, iostat, vmstat, free, ping, nicstat, dstat。
高级工具 (Advanced Tools):在基础之上升级,例如 sar, netstat, pidstat, strace, tcpdump, blktrace, iotop, slabtop, sysctl,以及直接读取 /proc 文件系统。
Linux 性能测评工具
下图展示了用于对系统不同模块进行性能基准测试的工具:

这是一类性能测评工具,针对CPU、内存、磁盘、网络等不同模块,可以使用相应的工具(如 sysbench, iperf, fio 等)进行压力测试和性能评估。
Linux 性能调优工具
性能调优往往需要深入系统内部,下图展示了从内核、系统配置层面进行调优的相关工具:

这些工具(如 sysctl, tune2fs, ethtool, tc 等)主要用于调整内核参数、文件系统选项、网络队列等,以实现性能优化。想要深入了解,需要结合Linux内核知识进行学习。
Linux 性能观测工具 sar
sar(System Activity Reporter,系统活动情况报告)是 Linux 上功能最为全面的系统性能分析工具之一,能够从文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC活动等多个方面对系统活动进行报告。
下图展示了 sar 命令丰富的监控选项:

sar 的常规使用方式:
sar [options] [-A] [-o file] t [n]
其中:
t 为采样间隔(秒)。
n 为采样次数,默认值为1。
-o file 表示将命令结果以二进制格式存放在指定文件 file 中。
熟练掌握这些工具,是每一位Linux系统管理员和开发者进行服务器运维、性能问题诊断的必备技能。实践出真知,建议在云栈社区等平台与更多同行交流实战经验,共同成长。