主题
性能问题排查实战
课程介绍
性能问题是Linux运维中最复杂的问题之一,涉及CPU、内存、磁盘IO、网络等多个方面。本课程将通过实际案例,带你学习性能问题的排查方法、性能分析工具的使用以及性能优化技巧,帮助你快速定位和解决性能问题。
1. 性能问题概述
1.1 性能问题类型
| 性能问题类型 | 说明 | 严重程度 |
|---|---|---|
| CPU占用过高 | CPU使用率持续高于80% | 严重 |
| 内存占用过高 | 内存使用率持续高于90% | 严重 |
| 磁盘IO瓶颈 | 磁盘读写速度慢 | 中等 |
| 网络IO瓶颈 | 网络带宽不足 | 中等 |
| 响应时间过长 | 应用响应时间过长 | 严重 |
| 吞吐量不足 | 系统吞吐量不足 | 中等 |
1.2 性能问题现象
现象1:系统卡顿
- 系统响应慢
- 命令执行慢
- 用户体验差
现象2:应用无响应
- 应用无法访问
- 请求超时
- 服务假死
现象3:资源占用过高
- CPU使用率高
- 内存使用率高
- 磁盘IO高
2. 性能监控工具
2.1 top命令
top命令用于实时查看系统资源使用情况。
基本语法:
bash
top [选项]常用选项:
| 选项 | 说明 |
|---|---|
-d | 指定刷新间隔(秒) |
-u | 指定用户 |
-p | 指定进程ID |
-H | 显示线程 |
示例:
bash
# 实时查看系统资源
top
# 指定刷新间隔
top -d 1
# 查看特定用户的进程
top -u nginx
# 查看特定进程
top -p 1234
# 显示线程
top -H输出说明:
top - 10:00:00 up 1 day, 1:23, 2 users, load average: 0.50, 0.60, 0.70
Tasks: 123 total, 1 running, 122 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.0 us, 2.0 sy, 0.0 ni, 92.0 id, 1.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem: 8192.0 total, 4096.0 free, 2048.0 used, 2048.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 6144.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 nginx 20 0 12345 567 123 S 5.0 0.1 0:12.34 nginx
5678 mysql 20 0 123456 56789 12345 S 10.0 1.2 1:23.45 mysqld2.2 htop命令
htop是top的增强版,界面更友好。
基本语法:
bash
htop [选项]示例:
bash
# 实时查看系统资源
htop
# 查看特定进程
htop -p 1234
# 查看特定用户的进程
htop -u nginx快捷键:
| 快捷键 | 说明 |
|---|---|
F1 | 帮助 |
F2 | 设置 |
F3 | 搜索 |
F4 | 过滤 |
F5 | 树形视图 |
F6 | 排序 |
F9 | 杀进程 |
F10 | 退出 |
2.3 vmstat命令
vmstat命令用于查看系统虚拟内存统计信息。
基本语法:
bash
vmstat [选项] [间隔] [次数]示例:
bash
# 查看系统统计信息
vmstat
# 每秒刷新一次,显示10次
vmstat 1 10
# 查看详细统计信息
vmstat -s输出说明:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 123456 12345 123456 0 0 10 5 100 200 5 2 92 1 02.4 iostat命令
iostat命令用于查看磁盘IO统计信息。
基本语法:
bash
iostat [选项] [间隔] [次数]示例:
bash
# 查看磁盘IO统计
iostat
# 每秒刷新一次,显示10次
iostat 1 10
# 查看详细统计信息
iostat -x输出说明:
avg-cpu: %user %nice %system %iowait %steal %idle
5.00 0.00 2.00 1.00 0.00 92.00
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 10.00 100.00 50.00 100000 500002.5 netstat命令
netstat命令用于查看网络统计信息。
基本语法:
bash
netstat [选项]示例:
bash
# 查看网络统计
netstat -i
# 查看网络连接
netstat -an
# 查看网络连接和进程
netstat -anp3. CPU性能问题排查
3.1 CPU占用过高
当CPU占用过高时,需要排查进程、线程等问题。
故障现象:
- CPU使用率持续高于80%
- 系统响应慢
- 命令执行慢
排查步骤:
步骤1:查看CPU使用情况
bash
# 查看CPU使用情况
top
# 查看CPU使用率
mpstat -P ALL 1
# 查看CPU负载
uptime步骤2:查看CPU占用高的进程
bash
# 查看CPU占用高的进程
top -o %CPU
# 查看特定进程的线程
top -H -p 1234
# 查看进程的CPU使用情况
ps aux | sort -rk 3 | head -n 10步骤3:分析进程
bash
# 查看进程详细信息
ps -ef | grep 1234
# 查看进程的线程
ps -eLf | grep 1234
# 查看进程的系统调用
strace -p 1234步骤4:优化进程
bash
# 调整进程优先级
renice -n 10 -p 1234
# 限制CPU使用率
cpulimit -p 1234 -l 50
# 杀死进程
kill -9 12343.2 CPU负载过高
当CPU负载过高时,需要排查进程、系统配置等问题。
故障现象:
- Load Average持续高于CPU核心数
- 系统响应慢
- 进程排队等待
排查步骤:
步骤1:查看CPU负载
bash
# 查看CPU负载
uptime
# 查看CPU负载详情
top
# 查看CPU负载趋势
vmstat 1 10步骤2:查看运行中的进程
bash
# 查看运行中的进程
ps aux | grep R
# 查看CPU占用高的进程
top -o %CPU
# 查看进程队列
vmstat步骤3:分析系统配置
bash
# 查看CPU核心数
lscpu
# 查看CPU频率
cat /proc/cpuinfo | grep MHz
# 查看CPU调度策略
cat /proc/sys/kernel/sched_rt_runtime_us步骤4:优化系统配置
bash
# 调整CPU调度策略
echo 1000000 > /proc/sys/kernel/sched_rt_runtime_us
# 调整进程优先级
renice -n 10 -p 1234
# 限制CPU使用率
cpulimit -p 1234 -l 504. 内存性能问题排查
4.1 内存占用过高
当内存占用过高时,需要排查进程、内存泄漏等问题。
故障现象:
- 内存使用率持续高于90%
- 系统使用swap
- 系统响应慢
排查步骤:
步骤1:查看内存使用情况
bash
# 查看内存使用情况
free -h
# 查看内存使用详情
cat /proc/meminfo
# 查看swap使用情况
swapon -s步骤2:查看内存占用高的进程
bash
# 查看内存占用高的进程
top -o %MEM
# 查看进程的内存使用情况
ps aux | sort -rk 4 | head -n 10
# 查看进程的内存映射
pmap 1234步骤3:分析内存泄漏
bash
# 使用valgrind检查内存泄漏
valgrind --leak-check=full ./myapp
# 查看进程的内存使用趋势
watch -n 1 'ps -p 1234 -o pid,vsz,rss,pmem,comm'步骤4:优化内存使用
bash
# 清理缓存
sync && echo 3 > /proc/sys/vm/drop_caches
# 调整swap使用策略
echo 10 > /proc/sys/vm/swappiness
# 杀死占用内存高的进程
kill -9 12344.2 内存泄漏
当进程存在内存泄漏时,需要排查代码、库等问题。
故障现象:
- 进程内存使用持续增长
- 系统内存不足
- 进程被OOM Killer杀死
排查步骤:
步骤1:查看进程内存使用
bash
# 查看进程内存使用
top -p 1234
# 查看进程的内存映射
pmap 1234
# 查看进程的内存使用趋势
watch -n 1 'ps -p 1234 -o pid,vsz,rss,pmem,comm'步骤2:分析内存泄漏
bash
# 使用valgrind检查内存泄漏
valgrind --leak-check=full --show-leak-kinds=all ./myapp
# 使用gdb分析内存
gdb -p 1234
(gdb) info proc mappings步骤3:查看OOM Killer日志
bash
# 查看系统日志
dmesg | grep -i "killed process"
# 查看内核日志
journalctl -k | grep -i "killed process"步骤4:修复内存泄漏
bash
# 重启进程
systemctl restart myapp
# 升级应用版本
apt-get upgrade myapp
# 修复代码
# (需要开发人员修复)5. 磁盘IO性能问题排查
5.1 磁盘IO瓶颈
当磁盘IO成为瓶颈时,需要排查磁盘、文件系统等问题。
故障现象:
- 磁盘IO等待时间高
- 系统响应慢
- 应用性能差
排查步骤:
步骤1:查看磁盘IO
bash
# 查看磁盘IO统计
iostat -x 1 10
# 查看磁盘IO等待
iostat -d 1 10
# 查看磁盘IO详情
iotop步骤2:查看磁盘使用情况
bash
# 查看磁盘使用情况
df -h
# 查看inode使用情况
df -i
# 查看磁盘空间占用
du -sh /var/log/*步骤3:分析磁盘IO瓶颈
bash
# 查看IO等待时间
vmstat 1 10
# 查看磁盘IO进程
iotop -o
# 查看磁盘IO详情
iostat -x 1 10步骤4:优化磁盘IO
bash
# 清理磁盘空间
rm -rf /var/log/*.log
# 优化文件系统
tune2fs -o journal_data_writeback /dev/sda1
# 调整IO调度算法
echo deadline > /sys/block/sda/queue/scheduler5.2 磁盘空间不足
当磁盘空间不足时,需要清理文件、扩容磁盘等。
故障现象:
- 磁盘使用率高于90%
- 无法创建文件
- 应用无法写入
排查步骤:
步骤1:查看磁盘使用情况
bash
# 查看磁盘使用情况
df -h
# 查看inode使用情况
df -i
# 查看磁盘空间占用
du -sh /* | sort -rh | head -n 10步骤2:查找大文件
bash
# 查找大于100M的文件
find / -size +100M -type f
# 查找最大的文件
find / -type f -exec du -h {} + | sort -rh | head -n 10
# 查找日志文件
find /var/log -name "*.log" -size +100M步骤3:清理磁盘空间
bash
# 清理日志文件
rm -rf /var/log/*.log
# 清理缓存
apt-get clean
# 清理临时文件
rm -rf /tmp/*步骤4:扩容磁盘
bash
# 扩容逻辑卷
lvextend -L +10G /dev/mapper/vg0-lv0
# 扩容文件系统
resize2fs /dev/mapper/vg0-lv06. 网络性能问题排查
6.1 网络IO瓶颈
当网络IO成为瓶颈时,需要排查网络带宽、连接数等问题。
故障现象:
- 网络带宽不足
- 网络延迟高
- 丢包率高
排查步骤:
步骤1:查看网络IO
bash
# 查看网络IO统计
iftop -i eth0
# 查看网络连接
ss -an
# 查看网络流量
nload eth0步骤2:查看网络带宽
bash
# 测试网络带宽
iperf -s # 服务器端
iperf -c 192.168.1.100 # 客户端
# 查看网络接口统计
ip -s link show eth0步骤3:分析网络瓶颈
bash
# 查看网络连接数
ss -an | wc -l
# 查看TIME_WAIT连接数
ss -an | grep TIME_WAIT | wc -l
# 查看网络错误
netstat -i步骤4:优化网络配置
bash
# 调整TCP参数
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_recycle = 1" >> /etc/sysctl.conf
# 应用配置
sysctl -p6.2 网络延迟高
当网络延迟高时,需要排查网络路由、网络设备等问题。
故障现象:
- 网络延迟高
- 丢包率高
- 网络不稳定
排查步骤:
步骤1:测试网络延迟
bash
# 测试网络延迟
ping -c 100 8.8.8.8
# 测试网络丢包
ping -c 100 -s 1024 8.8.8.8
# 测试网络带宽
iperf -c 192.168.1.100步骤2:跟踪网络路由
bash
# 跟踪网络路由
traceroute 8.8.8.8
# 查看网络路径
mtr 8.8.8.8步骤3:分析网络问题
bash
# 查看网络连接
ss -an
# 查看网络错误
netstat -i
# 查看网络统计
sar -n DEV 1 10步骤4:优化网络配置
bash
# 调整MTU
ip link set eth0 mtu 9000
# 调整TCP窗口大小
echo "net.ipv4.tcp_window_scaling = 1" >> /etc/sysctl.conf
# 应用配置
sysctl -p7. 实战案例
案例1:Web服务响应慢
问题现象:Web服务响应时间过长,用户体验差。
排查步骤:
步骤1:查看系统资源
bash
# 查看CPU使用情况
top
# 查看内存使用情况
free -h
# 查看磁盘IO
iostat -x 1 10步骤2:查看应用状态
bash
# 查看nginx进程
ps aux | grep nginx
# 查看nginx连接
ss -an | grep 80
# 查看nginx日志
tail -f /var/log/nginx/error.log步骤3:分析瓶颈
bash
# 查看数据库性能
mysql -e "SHOW PROCESSLIST;"
# 查看慢查询
tail -f /var/log/mysql/slow.log
# 查看网络延迟
ping -c 10 192.168.1.100步骤4:优化配置
bash
# 优化nginx配置
vim /etc/nginx/nginx.conf
worker_processes auto;
worker_connections 1024;
# 优化MySQL配置
vim /etc/mysql/my.cnf
max_connections = 500
query_cache_size = 64M
# 重启服务
systemctl restart nginx
systemctl restart mysql案例2:数据库性能差
问题现象:数据库查询慢,影响应用性能。
排查步骤:
步骤1:查看数据库状态
bash
# 查看MySQL进程
ps aux | grep mysql
# 查看MySQL连接
mysql -e "SHOW PROCESSLIST;"
# 查看MySQL状态
mysql -e "SHOW STATUS LIKE '%Connections%';"步骤2:分析慢查询
bash
# 查看慢查询日志
tail -f /var/log/mysql/slow.log
# 分析慢查询
mysqldumpslow /var/log/mysql/slow.log
# 查看执行计划
mysql -e "EXPLAIN SELECT * FROM users WHERE id = 1;"步骤3:优化SQL
bash
# 添加索引
mysql -e "CREATE INDEX idx_id ON users(id);"
# 优化SQL语句
mysql -e "SELECT * FROM users WHERE id = 1 LIMIT 1;"
# 清理缓存
mysql -e "FLUSH TABLES;"步骤4:优化配置
bash
# 优化MySQL配置
vim /etc/mysql/my.cnf
innodb_buffer_pool_size = 2G
query_cache_size = 64M
max_connections = 500
# 重启MySQL
systemctl restart mysql课程总结
这节课我们学习了性能问题排查实战。
核心内容:
- 性能问题概述
- 性能监控工具(top、htop、vmstat、iostat、netstat)
- CPU性能问题排查
- 内存性能问题排查
- 磁盘IO性能问题排查
- 网络性能问题排查
- 实战案例
重要命令:
top:实时查看系统资源htop:实时查看系统资源(更友好)vmstat:查看系统虚拟内存统计iostat:查看磁盘IO统计free:查看内存使用情况ps aux:查看进程strace:跟踪系统调用valgrind:检查内存泄漏
性能问题是Linux运维中最复杂的问题之一,掌握这些排查方法和工具,可以帮助你快速定位和解决性能问题,提升系统性能。
课后练习
练习1(基础)
完成以下操作:
- 查看CPU使用情况
- 查看内存使用情况
- 查看磁盘IO
- 查看网络IO
练习2(进阶)
假设CPU占用过高,请描述排查步骤。
练习3(拓展)
假设Web服务响应慢,请描述排查步骤。