性能问题排查

核心知识点

1. 性能问题类型

1.1 CPU 性能问题

┌─────────────────────────────────────────────────────┐
│              CPU 性能问题                           │
├─────────────────────────────────────────────────────┤
│                                                     │
│   ┌─────────────────────────────────────────┐       │
│   │           CPU 爆满                     │       │
│   │  - CPU 使用率 100%                      │       │
│   │  - 死循环                               │       │
│   │  - 计算密集型任务                        │       │
│   └─────────────────────────────────────────┘       │
│                      │                              │
│   ┌─────────────────────────────────────────┐       │
│   │           上下文切换频繁                 │       │
│   │  - 上下文切换次数高                      │       │
│   │  - 线程/进程过多                          │       │
│   │  - 锁竞争                               │       │
│   └─────────────────────────────────────────┘       │
│                      │                              │
│   ┌─────────────────────────────────────────┐       │
│   │           单核瓶颈                     │       │
│   │  - 单核使用率高                          │       │
│   │  - 单线程应用                            │       │
│   │  - 未利用多核                            │       │
│   └─────────────────────────────────────────┘       │
│                      │                              │
│   ┌─────────────────────────────────────────┐       │
│   │           中断频繁                     │       │
│   │  - 中断次数高                            │       │
│   │  - 网络流量大                            │       │
│   │  - 硬件问题                              │       │
│   └─────────────────────────────────────────┘       │
│                                                     │
└─────────────────────────────────────────────────────┘

1.2 内存性能问题

问题类型 表现 常见原因
内存不足 Swap 使用率高 物理内存不足、内存泄漏
缺页率高 Major Fault 频繁 访问模式差、工作集过大
内存碎片 分配失败 频繁分配释放、大小不一
缓存失效 性能下降 访问模式不连续、缓存过小

1.3 磁盘性能问题

问题类型 表现 常见原因
I/O 等待高 iowait 持续 > 20% 磁盘速度慢、并发 I/O 多
队列长度长 avgqu-sz > 1 I/O 请求堆积、磁盘饱和
延迟高 await > 10ms 磁盘性能不足、负载高
利用率高 %util > 80% 磁盘饱和、需要扩容

1.4 网络性能问题

问题类型 表现 常见原因
带宽限制 吞吐量低 网络带宽不足、拥塞
高延迟 响应时间长 路由跳数多、网络拥塞
丢包 重传率高 网络质量差、拥塞
连接数限制 拒绝连接 系统限制、配置不当

2. 性能监控工具

2.1 综合监控工具

# top - 实时进程监控
top
htop
atop

# vmstat - 系统性能统计
vmstat 1
vmstat -s

# iostat - I/O 统计
iostat -x 1

# dstat - 综合监控
dstat
dstat -cdngy

2.2 CPU 监控工具

# mpstat - CPU 统计
mpstat -P ALL 1

# pidstat - 进程统计
pidstat -p <pid> 1
pidstat -t -p <pid> 1

# perf - 性能分析
perf top
perf record -g -p <pid>
perf report

# sar - 系统活动报告
sar -u 1 10

2.3 内存监控工具

# free - 内存使用
free -h
free -m

# smem - 进程内存
smem
smem -P <pid>

# valgrind - 内存分析
valgrind --leak-check=full ./myapp

# pmap - 内存映射
pmap -x <pid>

2.4 磁盘监控工具

# iotop - I/O 进程监控
iotop
iotop -o

# iostat - I/O 统计
iostat -x 1

# df - 磁盘空间
df -h
df -i

# du - 目录空间
du -sh *
du -h --max-depth=1

2.5 网络监控工具

# iftop - 流量监控
iftop
iftop -i eth0

# nload - 流量监控
nload

# netstat - 网络统计
netstat -an
netstat -s

# ss - 套接字统计
ss -s
ss -tunap

3. 性能问题排查流程

3.1 建立性能基线

# 1. 记录正常状态
top > baseline-top.txt
vmstat 1 10 > baseline-vmstat.txt
iostat -x 1 10 > baseline-iostat.txt
free -h > baseline-free.txt

# 2. 记录应用性能
ab -n 1000 -c 10 http://localhost/ > baseline-ab.txt

# 3. 记录系统配置
uname -a > baseline-uname.txt
cat /proc/cpuinfo > baseline-cpu.txt
cat /proc/meminfo > baseline-mem.txt
df -h > baseline-df.txt

# 4. 保存基线数据
mkdir -p /var/log/baseline
cp baseline-*.txt /var/log/baseline/

3.2 识别性能瓶颈

# 1. 监控系统资源
top
vmstat 1
iostat -x 1
free -h

# 2. 识别瓶颈类型
# CPU 瓶颈:CPU 使用率持续 > 80%
# 内存瓶颈:Swap 使用率高、缺页率高
# 磁盘瓶颈:iowait 持续 > 20%、队列长度长
# 网络瓶颈:带宽利用率高、丢包率高

# 3. 分析进程资源
ps aux --sort=-%cpu | head -20
ps aux --sort=-%mem | head -20

# 4. 分析系统调用
strace -c -p <pid>
strace -p <pid>

3.3 定位根本原因

# 1. CPU 瓶颈分析
perf top -p <pid>
perf record -g -p <pid>
perf report

# 2. 内存瓶颈分析
valgrind --leak-check=full ./myapp
pmap -x <pid>
cat /proc/<pid>/smaps

# 3. 磁盘瓶颈分析
iotop
iostat -x 1
strace -e trace=read,write -p <pid>

# 4. 网络瓶颈分析
iftop
netstat -an
tcpdump -i eth0

3.4 实施优化方案

# 1. CPU 优化
# - 优化算法
# - 使用多线程
# - 设置 CPU 亲和性

# 2. 内存优化
# - 优化数据结构
# - 使用缓存
# - 修复内存泄漏

# 3. 磁盘优化
# - 使用 SSD
# - 优化文件系统
# - 配置 RAID

# 4. 网络优化
# - 优化 TCP 参数
# - 使用 CDN
# - 增加带宽

3.5 验证优化效果

# 1. 监控系统资源
top
vmstat 1
iostat -x 1
free -h

# 2. 测试应用性能
ab -n 1000 -c 10 http://localhost/

# 3. 对比基线数据
diff baseline-top.txt current-top.txt
diff baseline-vmstat.txt current-vmstat.txt

# 4. 记录优化结果
echo "优化结果:" > optimization-result.txt
date >> optimization-result.txt
top -n 1 >> optimization-result.txt

4. 性能问题排查案例

4.1 CPU 爆满问题

# 1. 识别问题
top
# CPU 使用率 100%

# 2. 查找高 CPU 进程
ps aux --sort=-%cpu | head -20

# 3. 分析进程
strace -c -p <pid>
perf top -p <pid>

# 4. 分析代码
# - 查找热点函数
# - 查找死循环
# - 查找性能瓶颈

# 5. 优化代码
# - 优化算法
# - 减少计算
# - 使用缓存

# 6. 验证效果
top

4.2 内存泄漏问题

# 1. 识别问题
free -h
# Swap 使用率高

# 2. 查找高内存进程
ps aux --sort=-%mem | head -20

# 3. 分析进程
valgrind --leak-check=full --show-leak-kinds=all ./myapp

# 4. 分析堆转储
jmap -dump:format=b,file=heap.bin <pid>
jhat heap.bin

# 5. 修复内存泄漏
# - 检查未释放的内存
# - 检查循环引用
# - 使用智能指针

# 6. 验证效果
free -h

4.3 I/O 瓶颈问题

# 1. 识别问题
iostat -x 1
# iowait 持续 > 20%

# 2. 查找高 I/O 进程
iotop
pidstat -d 1

# 3. 分析 I/O 模式
strace -e trace=read,write -p <pid>

# 4. 优化 I/O
# - 使用 SSD
# - 优化文件系统
# - 配置 RAID

# 5. 验证效果
iostat -x 1

4.4 网络瓶颈问题

# 1. 识别问题
iftop
# 带宽利用率高

# 2. 分析网络状态
netstat -an
ss -s

# 3. 测试网络性能
iperf3 -c <server-ip> -t 60

# 4. 优化网络
# - 优化 TCP 参数
# - 使用 CDN
# - 增加带宽

# 5. 验证效果
iftop
iperf3 -c <server-ip> -t 60

5. 性能优化策略

5.1 CPU 优化策略

# 1. 使用多线程
# - 分解任务
# - 并行处理
# - 避免共享状态

# 2. 设置 CPU 亲和性
taskset -pc 0-3 <pid>

# 3. 优化算法
# - 选择高效算法
# - 减少时间复杂度
# - 减少空间复杂度

# 4. 使用缓存
# - 内存缓存
# - Redis 缓存
# - CDN 缓存

5.2 内存优化策略

# 1. 优化数据结构
# - 使用紧凑的数据结构
# - 减少对象大小
# - 使用对象池

# 2. 使用缓存
# - LRU 缓存
# - Redis 缓存
# - Memcached

# 3. 修复内存泄漏
# - 检查未释放的内存
# - 检查循环引用
# - 使用智能指针

# 4. 调整 JVM 参数
java -Xms512m -Xmx1024m -jar myapp.jar

5.3 磁盘优化策略

# 1. 使用 SSD
# - 将热数据迁移到 SSD
# - 使用 SSD 作为缓存

# 2. 优化文件系统
# - 选择合适的文件系统
# - 优化挂载选项
# - 定期整理

# 3. 配置 RAID
# - RAID 0:性能优先
# - RAID 1:冗余优先
# - RAID 10:性能和冗余平衡

# 4. 优化 I/O 调度器
echo deadline > /sys/block/sda/queue/scheduler

5.4 网络优化策略

# 1. 优化 TCP 参数
echo bbr > /proc/sys/net/ipv4/tcp_congestion_control
echo 4096 > /proc/sys/net/core/somaxconn

# 2. 使用 CDN
# - 加速静态资源
# - 减少源站压力
# - 提升用户体验

# 3. 增加带宽
# - 升级网络设备
# - 使用多线路
# - 负载均衡

# 4. 使用连接池
# - 数据库连接池
# - HTTP 连接池
# - Redis 连接池

6. 性能测试工具

6.1 压力测试工具

# ab - Apache Bench
ab -n 1000 -c 10 http://localhost/

# wrk - HTTP 压力测试
wrk -t12 -c400 -d30s http://localhost/

# siege - Web 压力测试
siege -c 10 -t 60S http://localhost/

# jmeter - Java 压力测试
jmeter -n -t test.jmx -l result.jtl

6.2 性能分析工具

# perf - Linux 性能分析
perf top
perf record -g -p <pid>
perf report

# strace - 系统调用跟踪
strace -p <pid>
strace -c <command>

# valgrind - 内存分析
valgrind --leak-check=full ./myapp

# gprof - 程序性能分析
gcc -pg myapp.c -o myapp
./myapp
gprof myapp gmon.out > analysis.txt

6.3 网络测试工具

# iperf3 - 网络性能测试
iperf3 -s
iperf3 -c <server-ip> -t 60

# ping - 延迟测试
ping -c 100 <host>

# mtr - 网络诊断
mtr <host>

# traceroute - 路由跟踪
traceroute <host>

实用案例分析

案例 1:Web 服务响应慢

场景描述

Web 服务响应时间过长,用户体验差。

排查步骤

# 1. 监控系统资源
top
vmstat 1
iostat -x 1

# 2. 测试应用性能
ab -n 1000 -c 10 http://localhost/

# 3. 分析瓶颈
# - CPU 瓶颈
ps aux --sort=-%cpu | head -20

# - 内存瓶颈
ps aux --sort=-%mem | head -20

# - 磁盘瓶颈
iostat -x 1

# - 网络瓶颈
iftop

# 4. 优化应用
# - 启用缓存
# - 优化数据库查询
# - 使用 CDN

# 5. 验证效果
ab -n 1000 -c 10 http://localhost/

案例 2:数据库查询慢

场景描述

数据库查询响应慢。

排查步骤

# 1. 监控数据库性能
mysqladmin -i 1 processlist
mysqladmin extended-status -i 1

# 2. 分析慢查询
tail -f /var/log/mysql/slow.log

# 3. 分析查询计划
EXPLAIN SELECT * FROM users WHERE id = 1;

# 4. 添加索引
CREATE INDEX idx_id ON users(id);

# 5. 优化查询
SELECT id, name FROM users WHERE id = 1;

# 6. 调整缓冲池
SET GLOBAL innodb_buffer_pool_size = 2G;

# 7. 验证效果
mysql -u root -p -e "SHOW STATUS LIKE 'Slow_queries';"

案例 3:系统整体性能差

场景描述

系统整体性能差,多个应用响应慢。

排查步骤

# 1. 监控系统资源
top
vmstat 1
iostat -x 1
free -h

# 2. 识别瓶颈
# - CPU 瓶颈
mpstat -P ALL 1

# - 内存瓶颈
free -h

# - 磁盘瓶颈
iostat -x 1

# - 网络瓶颈
iftop

# 3. 优化系统
# - CPU 优化
echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# - 内存优化
echo 10 > /proc/sys/vm/swappiness

# - 磁盘优化
echo deadline > /sys/block/sda/queue/scheduler

# - 网络优化
echo bbr > /proc/sys/net/ipv4/tcp_congestion_control

# 4. 验证效果
top
vmstat 1

最佳实践

  1. 建立性能基线:在优化前建立性能基线。

  2. 优先解决瓶颈:使用帕累托原则,优先解决最严重的瓶颈。

  3. 渐进式优化:逐步优化,每次优化后验证效果。

  4. 权衡取舍:在性能、成本、复杂度之间找到平衡点。

  5. 持续监控:建立持续监控机制,及时发现性能问题。

  6. 文档记录:记录优化过程和结果,便于后续参考。

  7. 团队协作:性能优化需要开发、运维、测试等多方协作。

  8. 定期评估:定期评估系统性能,持续优化改进。

总结

本教程详细介绍了 Linux 系统性能问题的排查方法和实践。通过实际案例,我们学习了如何识别性能瓶颈、定位根本原因、实施优化方案以及验证优化效果。掌握这些知识后,可以快速定位和解决性能问题,提升系统性能。

至此,Linux 教程的 200 集内容已全部完成。从基础入门到高级应用,从系统管理到性能优化,本教程涵盖了 Linux 系统的各个方面。希望读者能够通过本教程的学习,掌握 Linux 系统的使用和管理技能,成为一名优秀的 Linux 系统管理员。

« 上一篇 应用故障排查 下一篇 » 包管理系统概述