Linux 性能排查指南:从入门到精通
本文系统讲解 Linux 系统性能排查的方法论、工具链和实战技巧,帮助运维和开发人员快速定位和解决性能问题。
一、性能排查方法论
1.1 USE 方法
USE(Utilization, Saturation, Errors) 是 Brendan Gregg 提出的性能分析方法:
1 | graph TB |
检查清单:
| 资源 | 利用率 | 饱和度 | 错误 |
|---|---|---|---|
| CPU | % 使用率 | 运行队列长度 | 硬件错误 |
| 内存 | % 使用率 | Swap 使用 | OOM 错误 |
| 磁盘 | % 容量 | IO 等待时间 | IO 错误 |
| 网络 | 带宽使用 | 丢包/重传 | 连接错误 |
1.2 性能分析步骤
1 | graph LR |
标准流程:
- 发现问题:监控告警、用户反馈、日志异常
- 收集指标:使用工具收集系统指标
- 定位瓶颈:分析指标,找出瓶颈资源
- 分析原因:深入分析瓶颈原因
- 制定方案:设计优化方案
- 验证效果:实施后验证效果
1.3 性能指标阈值
| 指标 | 正常 | 警告 | 严重 |
|---|---|---|---|
| CPU 使用率 | < 70% | 70-85% | > 85% |
| 内存使用率 | < 80% | 80-90% | > 90% |
| Swap 使用率 | 0% | < 50% | > 50% |
| 磁盘使用率 | < 80% | 80-90% | > 90% |
| IO 等待 | < 10% | 10-30% | > 30% |
| 负载平均值 | < CPU 核数 | 1-2 倍 | > 2 倍 |
| 网络丢包 | 0% | < 0.1% | > 0.1% |
二、CPU 性能排查
2.1 CPU 指标解读
1 | # 查看 CPU 信息 |
负载平均值含义:
1 | 负载 0.00:系统空闲 |
2.2 CPU 排查工具
top 命令
1 | # 基本使用 |
top 输出解读:
1 | top - 14:30:00 up 10 days, 2:30, 1 user, load average: 0.50, 0.80, 0.90 |
字段说明:
us(user): 用户空间 CPU 使用率sy(system): 内核空间 CPU 使用率ni(nice): 低优先级进程 CPU 使用率id(idle): 空闲 CPU 使用率wa(iowait): IO 等待 CPU 使用率hi(hardware interrupts): 硬件中断si(software interrupts): 软件中断st(steal): 虚拟机被偷取的时间
htop 命令
1 | # 安装 htop |
vmstat 命令
1 | # 每秒采样一次,共 5 次 |
vmstat 输出解读:
1 | procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- |
pidstat 命令
1 | # 安装 pidstat |
2.3 CPU 问题诊断
场景 1:CPU 使用率高
1 | # 1. 查看整体 CPU 使用率 |
场景 2:负载高但 CPU 使用率低
1 | # 可能是 IO 等待导致 |
场景 3:上下文切换频繁
1 | # 查看上下文切换次数 |
2.4 CPU 优化方案
1 | # 调整进程优先级 |
三、内存性能排查
3.1 内存指标解读
1 | # 查看内存使用情况 |
free 命令输出解读:
1 | total used free shared buff/cache available |
3.2 内存排查工具
/proc/meminfo 详解
1 | # 查看关键内存指标 |
slabtop 命令
1 | # 查看内核 slab 缓存 |
smem 命令
1 | # 安装 smem |
3.3 内存问题诊断
场景 1:内存使用率高
1 | # 1. 查看整体内存使用 |
场景 2:Swap 使用率高
1 | # 1. 查看 Swap 使用 |
场景 3:OOM Killer
1 | # 1. 查看 OOM 日志 |
3.4 内存优化方案
1 | # 调整 swappiness(默认 60) |
四、磁盘 IO 性能排查
4.1 磁盘 IO 指标解读
1 | # 查看磁盘使用情况 |
iostat 输出解读
1 | avg-cpu: %user %nice %system %iowait %steal %idle |
4.2 磁盘 IO 排查工具
iotop 命令
1 | # 安装 iotop |
pidstat IO 统计
1 | # 查看进程的 IO |
ioping 命令
1 | # 安装 ioping |
4.3 磁盘 IO 问题诊断
场景 1:IO 等待高
1 | # 1. 查看 IO 等待 |
场景 2:磁盘空间不足
1 | # 1. 查看磁盘使用 |
场景 3:Inodes 耗尽
1 | # 1. 查看 Inodes 使用 |
4.4 磁盘 IO 优化方案
1 | # 调整 IO 调度算法 |
五、网络性能排查
5.1 网络指标解读
1 | # 查看网络接口 |
/proc/net/dev 解读
1 | cat /proc/net/dev |
5.2 网络排查工具
ss 命令
1 | # 查看所有连接 |
netstat 命令
1 | # 查看所有连接 |
tcpdump 命令
1 | # 抓包(所有接口) |
ping 命令
1 | # 基本 ping |
traceroute 命令
1 | # 追踪路由 |
5.3 网络问题诊断
场景 1:网络连接失败
1 | # 1. 检查网络接口 |
场景 2:网络延迟高
1 | # 1. 测试延迟 |
场景 3:连接数过多
1 | # 1. 查看连接数统计 |
5.4 网络优化方案
1 | # 调整 TCP 参数 |
六、综合排查案例
案例 1:Web 服务器响应慢
问题现象: 用户反馈网站访问慢,页面加载时间长。
排查步骤:
1 | # 1. 检查系统负载 |
案例 2:数据库查询慢
问题现象: 数据库查询响应时间长,应用超时。
排查步骤:
1 | # 1. 检查系统资源 |
案例 3:内存泄漏
问题现象: 服务器运行一段时间后内存耗尽,服务崩溃。
排查步骤:
1 | # 1. 监控内存使用 |
七、监控工具推荐
7.1 系统监控
| 工具 | 用途 | 特点 |
|---|---|---|
| top/htop | 实时监控 | 简单直观 |
| vmstat | 系统统计 | 轻量级 |
| sar | 历史统计 | 数据持久化 |
| dstat | 综合监控 | 功能全面 |
| glances | Web 界面 | 易于使用 |
7.2 应用监控
| 工具 | 用途 | 特点 |
|---|---|---|
| Prometheus | 指标监控 | 云原生标准 |
| Grafana | 可视化 | 丰富的图表 |
| ELK Stack | 日志分析 | 强大的搜索 |
| SkyWalking | 链路追踪 | APM 功能 |
| Zabbix | 企业监控 | 功能全面 |
7.3 快速部署监控栈
1 | # docker-compose.yml |
八、总结
Linux 性能排查的关键要点:
- 方法论:USE 方法,从利用率、饱和度、错误三个维度分析
- 工具链:top/vmstat/iostat/ss 等工具的组合使用
- 指标解读:理解每个指标的含义和阈值
- 优化方案:根据瓶颈制定针对性的优化方案
记住:监控是基础,排查是技能,优化是目标。
参考资料:
- Brendan Gregg 的性能博客
- 《Linux 性能优化实战》
- USE 方法
- Linux 性能工具速查