性能故障排查
当Linux系统出现性能问题时,需要系统化地进行问题排查和定位。本文介绍常见的性能问题及其排查方法。
性能问题分类
系统负载过高
现象:
- 系统响应缓慢
- 负载平均值过高
- 用户抱怨系统卡顿
排查步骤:
# 1. 查看系统负载
uptime
w
# 2. 查看CPU使用情况
top
htop
sar -u 1 5
# 3. 识别高CPU进程
ps aux --sort=-%cpu | head -10
pidstat -u 1 5
# 4. 查看进程详细信息
top -p PID
strace -p PID
内存不足问题
现象:
- 系统频繁swap
- 应用出现OOM错误
- 内存使用率过高
排查步骤:
# 1. 查看内存使用情况
free -h
cat /proc/meminfo
# 2. 查看内存占用TOP进程
ps aux --sort=-%mem | head -10
# 3. 查看系统swap使用
swapon -s
vmstat 1 5
# 4. 查看OOM记录
dmesg | grep -i "killed process"
grep -i "out of memory" /var/log/messages
# 5. 分析内存泄漏
valgrind --tool=memcheck --leak-check=full program
磁盘I/O瓶颈
现象:
- 磁盘I/O等待时间高
- 应用响应慢
- 系统负载高但CPU使用率不高
排查步骤:
# 1. 查看I/O统计
iostat -x 1 5
sar -d 1 5
# 2. 实时监控I/O
iotop
# 3. 查看进程I/O使用
pidstat -d 1 5
# 4. 分析磁盘性能
hdparm -t /dev/sda
dd if=/dev/zero of=/tmp/test bs=1M count=1024 oflag=direct
# 5. 查看文件系统使用
df -h
du -sh /path/*
网络性能问题
现象:
- 网络连接缓慢
- 丢包率高
- 网络延迟大
排查步骤:
# 1. 查看网络接口统计
ifconfig
ip -s link
# 2. 查看网络连接状态
netstat -i
ss -s
# 3. 监控网络流量
iftop
nload
vnstat
# 4. 测试网络性能
ping target_host
traceroute target_host
iperf3 -c target_host
# 5. 查看网络错误
netstat -s
cat /proc/net/dev
常见性能问题解决
高CPU使用率
问题排查:
# 1. 找出CPU占用高的进程
top -o %CPU
ps aux --sort=-%cpu | head -20
# 2. 分析进程行为
strace -p PID -f -e trace=all
ltrace -p PID
# 3. 查看进程线程
ps -eLf | grep PID
top -H -p PID
解决方案:
# 1. 优化应用程序
# - 代码优化
# - 算法改进
# - 减少不必要的计算
# 2. 调整进程优先级
renice -n 10 PID
nice -n 10 command
# 3. 限制CPU使用
# 使用cgroups限制CPU
echo "50000" > /sys/fs/cgroup/cpu/myapp/cpu.cfs_quota_us
echo "PID" > /sys/fs/cgroup/cpu/myapp/tasks
内存泄漏问题
问题排查:
# 1. 监控内存使用趋势
while true; do
date
cat /proc/meminfo | grep -E "(MemTotal|MemFree|MemAvailable)"
sleep 60
done > memory_trend.log
# 2. 分析进程内存映射
cat /proc/PID/maps
pmap -x PID
# 3. 使用内存分析工具
valgrind --tool=massif program
解决方案:
# 1. 重启泄漏进程(临时)
systemctl restart service_name
# 2. 设置内存限制
# 使用systemd限制
echo "MemoryMax=1G" >> /etc/systemd/system/myapp.service
# 3. 配置OOM killer
echo -1000 > /proc/PID/oom_score_adj # 保护重要进程
磁盘I/O性能问题
问题排查:
# 1. 识别I/O密集进程
iotop -o
pidstat -d 1
# 2. 分析磁盘使用模式
blktrace /dev/sda
btrace /dev/sda
# 3. 检查文件系统碎片
e2fsck -fn /dev/sda1
解决方案:
# 1. 优化I/O调度器
echo deadline > /sys/block/sda/queue/scheduler
# 2. 调整文件系统挂载参数
mount -o remount,noatime,nodiratime /
# 3. 增加缓存
# 临时增加
echo 3 > /proc/sys/vm/drop_caches
# 调整缓存策略
echo 5 > /proc/sys/vm/dirty_background_ratio
echo 10 > /proc/sys/vm/dirty_ratio
性能监控脚本
综合性能监控
#!/bin/bash
# system_performance_check.sh
echo "=================== 系统性能检查报告 ==================="
echo "检查时间: $(date)"
echo
# CPU信息
echo "=== CPU信息 ==="
echo "CPU核心数: $(nproc)"
echo "当前负载: $(uptime | awk -F'load average:' '{print $2}')"
echo "CPU使用率:"
top -bn1 | grep "Cpu(s)" | awk '{print " 用户:" $2 " 系统:" $4 " 空闲:" $8}'
echo
# 内存信息
echo "=== 内存信息 ==="
free -h | grep -E "(Mem|Swap)"
echo "内存使用率: $(free | grep Mem | awk '{printf "%.1f%%", $3/$2 * 100.0}')"
echo
# 磁盘信息
echo "=== 磁盘信息 ==="
df -h | grep -vE '^Filesystem|tmpfs|cdrom'
echo
# 网络信息
echo "=== 网络信息 ==="
echo "网络连接数:"
ss -s | grep -E "TCP|UDP"
echo
# TOP进程
echo "=== TOP 5 CPU进程 ==="
ps aux --sort=-%cpu | head -6 | tail -5
echo
echo "=== TOP 5 内存进程 ==="
ps aux --sort=-%mem | head -6 | tail -5
性能瓶颈自动检测
#!/bin/bash
# performance_bottleneck_detector.sh
LOG_FILE="/var/log/performance_alerts.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
# CPU检查
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if (( $(echo "$CPU_USAGE > 80" | bc -l) )); then
echo "[$DATE] 警告: CPU使用率过高 ${CPU_USAGE}%" >> $LOG_FILE
ps aux --sort=-%cpu | head -5 >> $LOG_FILE
fi
# 内存检查
MEM_USAGE=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100.0}')
if (( $(echo "$MEM_USAGE > 85" | bc -l) )); then
echo "[$DATE] 警告: 内存使用率过高 ${MEM_USAGE}%" >> $LOG_FILE
fi
# 磁盘检查
DISK_USAGE=$(df / | tail -1 | awk '{print $5}' | cut -d'%' -f1)
if [ $DISK_USAGE -gt 90 ]; then
echo "[$DATE] 警告: 根分区使用率过高 ${DISK_USAGE}%" >> $LOG_FILE
fi
# 负载检查
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | cut -d',' -f1)
CPU_COUNT=$(nproc)
if (( $(echo "$LOAD_AVG > $CPU_COUNT * 2" | bc -l) )); then
echo "[$DATE] 警告: 系统负载过高 ${LOAD_AVG}" >> $LOG_FILE
fi
# I/O等待检查
IO_WAIT=$(iostat -c 1 2 | tail -1 | awk '{print $4}')
if (( $(echo "$IO_WAIT > 20" | bc -l) )); then
echo "[$DATE] 警告: I/O等待时间过高 ${IO_WAIT}%" >> $LOG_FILE
fi
性能优化建议
预防性措施
# 1. 设置系统监控
# 创建监控cron任务
echo "*/5 * * * * /usr/local/bin/performance_monitor.sh" >> /etc/crontab
# 2. 配置资源限制
# 编辑/etc/security/limits.conf
echo "* soft nproc 65536" >> /etc/security/limits.conf
echo "* hard nproc 65536" >> /etc/security/limits.conf
# 3. 优化内核参数
# 编辑/etc/sysctl.conf
echo "vm.swappiness = 10" >> /etc/sysctl.conf
echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf
应急处理
# 1. 临时释放内存
sync && echo 3 > /proc/sys/vm/drop_caches
# 2. 终止占用资源过多的进程
kill -TERM PID
kill -KILL PID
# 3. 调整进程优先级
renice -20 critical_process_pid
renice 19 background_process_pid
# 4. 临时增加swap
dd if=/dev/zero of=/swapfile bs=1024 count=1048576
mkswap /swapfile
swapon /swapfile
长期优化策略
容量规划
- 定期分析资源使用趋势
- 预测未来资源需求
- 制定扩容计划
应用优化
- 代码性能优化
- 数据库查询优化
- 缓存策略优化
架构优化
- 负载均衡
- 分布式部署
- 微服务架构
监控和告警
- 建立完善的监控体系
- 设置合理的告警阈值
- 制定应急响应流程
常用性能分析工具
系统工具
top/htop
- 进程监控iostat
- I/O统计vmstat
- 虚拟内存统计sar
- 系统活动报告pidstat
- 进程统计
网络工具
iftop
- 网络流量监控netstat/ss
- 网络连接状态tcpdump
- 网络包捕获iperf3
- 网络性能测试
专业工具
perf
- CPU性能分析strace
- 系统调用跟踪ltrace
- 库函数调用跟踪valgrind
- 内存调试工具
性能故障排查是系统运维的重要技能,通过系统性的分析方法可以快速定位和解决性能问题。