性能故障排查

title

当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

长期优化策略

  1. 容量规划

    • 定期分析资源使用趋势
    • 预测未来资源需求
    • 制定扩容计划
  2. 应用优化

    • 代码性能优化
    • 数据库查询优化
    • 缓存策略优化
  3. 架构优化

    • 负载均衡
    • 分布式部署
    • 微服务架构
  4. 监控和告警

    • 建立完善的监控体系
    • 设置合理的告警阈值
    • 制定应急响应流程

常用性能分析工具

系统工具

  • top/htop - 进程监控
  • iostat - I/O统计
  • vmstat - 虚拟内存统计
  • sar - 系统活动报告
  • pidstat - 进程统计

网络工具

  • iftop - 网络流量监控
  • netstat/ss - 网络连接状态
  • tcpdump - 网络包捕获
  • iperf3 - 网络性能测试

专业工具

  • perf - CPU性能分析
  • strace - 系统调用跟踪
  • ltrace - 库函数调用跟踪
  • valgrind - 内存调试工具

性能故障排查是系统运维的重要技能,通过系统性的分析方法可以快速定位和解决性能问题。


powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 12:47:16

results matching ""

    No results matching ""