跳转到内容

性能问题排查实战

课程介绍

性能问题是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 mysqld

2.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  0

2.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      50000

2.5 netstat命令

netstat命令用于查看网络统计信息。

基本语法

bash
netstat [选项]

示例

bash
# 查看网络统计
netstat -i

# 查看网络连接
netstat -an

# 查看网络连接和进程
netstat -anp

3. 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 1234

3.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 50

4. 内存性能问题排查

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 1234

4.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/scheduler

5.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-lv0

6. 网络性能问题排查

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 -p

6.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 -p

7. 实战案例

案例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(基础)

完成以下操作:

  1. 查看CPU使用情况
  2. 查看内存使用情况
  3. 查看磁盘IO
  4. 查看网络IO

练习2(进阶)

假设CPU占用过高,请描述排查步骤。

练习3(拓展)

假设Web服务响应慢,请描述排查步骤。

评论区

专业的Linux技术学习平台,从入门到精通的完整学习路径