跳到主要内容

Linux 性能分析

在日常使用 Linux 开发或者运维服务器的过程中,你可能会遇到程序运行缓慢、CPU 飙升、内存泄漏、磁盘读写瓶颈等性能问题。为了定位和解决这些问题,你需要学会一项非常关键的技能 —— 性能分析

这篇教程会带你了解:

  • 性能分析的基本概念;
  • CPU、内存、I/O 和网络的常见性能指标;
  • 常用性能分析工具(如 topvmstatiostatperfstrace 等);
  • 性能瓶颈的初步排查方法。

什么是性能分析?

性能分析(Performance Analysis),就是对系统或程序的运行状况进行监控、统计和分析,以找出影响性能的瓶颈点。

在 Linux 中,性能问题主要涉及以下几个方面:

  1. CPU 占用率:程序是不是计算密集型?是否存在死循环?
  2. 内存使用情况:是否内存泄漏?是否频繁触发换页?
  3. 磁盘 I/O:是否因为读写磁盘太慢导致性能下降?
  4. 网络延迟或带宽瓶颈:网络请求是否阻塞?
  5. 系统调用频率与效率:程序是否频繁调用高开销的系统调用?

你需要根据问题的症状,结合工具来定位。

CPU 相关分析

tophtop

  • top 是最常用的实时系统监控工具,默认显示 CPU、内存、负载等信息。
  • 你可以观察 %CPU 高的进程,找出是否是单个进程过度占用。
top

mpstat(来自 sysstat 包)

它可以显示所有 CPU 核心的使用率,适用于多核服务器。

mpstat -P ALL 1

perf(强大的分析工具)

它可以分析程序在 CPU 上运行的性能热点(如函数耗时)。

perf record ./your_program
perf report

你会看到哪些函数占用 CPU 最多,适合优化。

内存相关分析

free

可以查看当前系统的内存使用情况(总内存、已用、剩余、缓存等):

free -m

vmstat

显示内存、CPU、I/O、进程切换等综合信息:

vmstat 1

其中 si/so 表示交换分区使用,bi/bo 表示磁盘读写,适合发现内存压力和系统负载问题。

valgrind(内存泄漏检测)

可用于分析 C/C++ 程序的内存问题:

valgrind --leak-check=full ./your_program

磁盘 I/O 分析

iostat(来自 sysstat 包)

用于分析磁盘 I/O 活动,判断是否存在磁盘瓶颈:

iostat -dx 1

重点关注 %util(设备利用率)和 await(平均等待时间)。

iotop

实时显示哪个进程在读写磁盘:

sudo iotop

如果一个进程持续大量读写,会影响整体系统性能。

网络相关分析

ssnetstat

查看网络连接状态:

ss -tnlp

iftop

类似 top,但是用于网络流量:

sudo iftop

可以发现哪些 IP 或端口占用了大量带宽。

tcpdump

抓包工具,可用于分析通信协议和异常网络行为:

sudo tcpdump -i eth0 port 80

系统调用分析

strace

跟踪程序运行过程中执行的系统调用:

strace ./your_program

你可以看到程序打开了哪些文件、调用了哪些函数,是否有 I/O 阻塞、资源不存在等问题。

其他高级工具

  • sar:收集系统资源使用情况,可用于历史数据分析;
  • systemtap:内核级别的性能分析工具;
  • bpftrace/bcc:基于 eBPF 的性能分析新技术,功能强大但较为复杂。

小结

通过本文,你了解了 Linux 性能分析的基础概念和常见工具:

  • 分析性能时应从 CPU、内存、磁盘 I/O、网络四个方面入手;
  • 使用工具如 topvmstatperfiostatstrace 等进行排查;
  • 根据不同问题症状选择合适的工具分析;
  • 找出瓶颈后进一步优化代码或系统配置。

性能分析是开发和运维中必不可少的技能,建议你平时就养成监控系统状态的习惯,提升故障排查效率。