本文档风哥主要介绍Linux系统监控相关知识,包括top命令系统监控、htop命令交互式监控、系统监控策略、性能优化案例等内容,参考Red Hat Enterprise Linux 10官方文档,适合运维人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 系统监控概念与作用
系统监控是Linux运维的核心工作。top和htop命令用于实时监控系统资源使用情况,包括CPU、内存、进程等信息。系统监控可以帮助及时发现性能问题,优化系统配置。
- 性能优化:及时发现性能瓶颈
- 故障预防:提前发现潜在问题
- 容量规划:为未来增长做准备
- 问题定位:快速定位问题根源
1.2 top与htop命令区别
top和htop命令的区别:
# 1. top命令特点
– 系统自带工具
– 文本界面
– 功能相对简单
– 资源占用少
– 适合远程监控
# 2. htop命令特点
– 需要额外安装
– 图形界面(彩色)
– 功能更强大
– 交互式操作
– 支持鼠标操作
# 3. top与htop对比
特性 top htop
界面 文本 图形
交互 键盘 键盘+鼠标
功能 基础 高级
安装 系统自带 需要安装
资源占用 低 稍高
# 4. top使用场景
– 远程服务器监控
– 资源受限环境
– 快速查看系统状态
– 脚本自动化
# 5. htop使用场景
– 本地系统监控
– 详细性能分析
– 进程管理操作
– 可视化监控
# 6. 常用组合
– top:快速查看系统状态
– htop:详细性能分析
– top -d 1:每秒刷新
– htop -u fgedu:查看用户进程
1.3 系统监控重要性
系统监控是运维工作的重要环节:
# 1. 监控指标
– CPU使用率
– 内存使用率
– 磁盘IO
– 网络IO
– 进程状态
# 2. 监控阈值
– 警告阈值:80%
– 严重阈值:90%
– 紧急阈值:95%
# 3. 监控频率
– 实时监控:关键系统
– 定时监控:普通系统
– 手动检查:日常巡检
# 4. 监控工具
– top/htop:实时监控
– vmstat:统计信息
– iostat:IO监控
– 监控系统(Zabbix/Prometheus)
# 5. 监控策略
– 定期检查系统状态
– 设置自动告警
– 记录历史数据
– 分析性能趋势
# 6. 应急预案
– 系统过载处理流程
– 进程异常处理流程
– 资源不足处理流程
– 故障恢复流程
Part02-生产环境规划与建议
2.1 监控规划原则
在生产环境中,监控规划应遵循以下原则:
# 1. 监控对象
– 系统资源:CPU、内存、磁盘、网络
– 系统服务:应用服务、数据库服务
– 系统进程:关键进程、异常进程
– 系统日志:系统日志、应用日志
# 2. 监控频率
– 关键指标:实时监控
– 重要指标:每分钟监控
– 一般指标:每小时监控
– 统计指标:每天监控
# 3. 监控阈值
– CPU使用率:80%/90%/95%
– 内存使用率:80%/90%/95%
– 磁盘使用率:80%/90%/95%
– 磁盘IO:根据硬件配置
# 4. 监控工具
– 实时监控:top/htop
– 统计监控:vmstat/iostat
– 日志监控:journalctl
– 监控系统:Zabbix/Prometheus
# 5. 监控策略
– 定期检查系统状态
– 设置自动告警
– 记录历史数据
– 分析性能趋势
# 6. 维护规划
– 定期检查监控配置
– 定期优化监控策略
– 定期清理监控数据
– 定期测试告警功能
2.2 监控告警建议
生产环境监控告警建议:
- 设置多级告警阈值
- 区分不同指标类型
- 配置告警通知渠道
- 记录告警历史
- 定期测试告警
- 建立应急响应流程
# 1. 告警阈值配置
警告级别 CPU 内存 磁盘 处理时间
警告 80% 80% 80% 24小时内
严重 90% 90% 90% 4小时内
紧急 95% 95% 95% 立即处理
# 2. CPU告警脚本
# cat > /tmp/cpu_alert.sh << 'EOF'
#!/bin/bash
WARNING_THRESHOLD=80
CRITICAL_THRESHOLD=90
EMERGENCY_THRESHOLD=95
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if [ $(echo "$cpu_usage >= $EMERGENCY_THRESHOLD” | bc) -eq 1 ]; then
echo “EMERGENCY: CPU usage is ${cpu_usage}%”
# 发送紧急告警
elif [ $(echo “$cpu_usage >= $CRITICAL_THRESHOLD” | bc) -eq 1 ]; then
echo “CRITICAL: CPU usage is ${cpu_usage}%”
# 发送严重告警
elif [ $(echo “$cpu_usage >= $WARNING_THRESHOLD” | bc) -eq 1 ]; then
echo “WARNING: CPU usage is ${cpu_usage}%”
# 发送警告告警
fi
EOF
# 3. 内存告警脚本
# cat > /tmp/memory_alert.sh << 'EOF'
#!/bin/bash
WARNING_THRESHOLD=80
CRITICAL_THRESHOLD=90
EMERGENCY_THRESHOLD=95
mem_total=$(free | grep Mem | awk '{print $2}')
mem_used=$(free | grep Mem | awk '{print $3}')
mem_percent=$((mem_used * 100 / mem_total))
if [ $mem_percent -ge $EMERGENCY_THRESHOLD ]; then
echo "EMERGENCY: Memory usage is ${mem_percent}%"
# 发送紧急告警
elif [ $mem_percent -ge $CRITICAL_THRESHOLD ]; then
echo "CRITICAL: Memory usage is ${mem_percent}%"
# 发送严重告警
elif [ $mem_percent -ge $WARNING_THRESHOLD ]; then
echo "WARNING: Memory usage is ${mem_percent}%"
# 发送警告告警
fi
EOF
# 4. 定时任务配置
# crontab -e
*/30 * * * * /tmp/cpu_alert.sh
*/30 * * * * /tmp/memory_alert.sh
# 5. 告警通知配置
# 邮件通知
# 钉钉通知
# 企业微信通知
# 短信通知
# 6. 告警历史记录
# 记录告警时间、指标值、处理结果
2.3 监控审计策略
定期审计系统监控情况:
# 1. 创建监控审计脚本
# cat > /tmp/monitoring_audit.sh << 'EOF'
#!/bin/bash
REPORT="/tmp/monitoring_audit_report.txt"
echo "========================================" > $REPORT
echo “Monitoring Audit Report – $(date)” >> $REPORT
echo “========================================” >> $REPORT
echo “” >> $REPORT
# 1. CPU使用情况
echo “1. CPU Usage” >> $REPORT
echo “———–” >> $REPORT
top -bn1 | grep “Cpu(s)” >> $REPORT
echo “” >> $REPORT
# 2. 内存使用情况
echo “2. Memory Usage” >> $REPORT
echo “————–” >> $REPORT
free -h >> $REPORT
echo “” >> $REPORT
# 3. 磁盘使用情况
echo “3. Disk Usage” >> $REPORT
echo “————” >> $REPORT
df -h >> $REPORT
echo “” >> $REPORT
# 4. 磁盘IO情况
echo “4. Disk I/O” >> $REPORT
echo “———–” >> $REPORT
iostat -x 1 3 >> $REPORT
echo “” >> $REPORT
# 5. 网络IO情况
echo “5. Network I/O” >> $REPORT
echo “————–” >> $REPORT
sar -n DEV 1 3 >> $REPORT
echo “” >> $REPORT
# 6. 进程状态
echo “6. Top Processes” >> $REPORT
echo “—————” >> $REPORT
ps aux –sort=-%cpu | head -n 10 >> $REPORT
echo “” >> $REPORT
# 7. 系统负载
echo “7. System Load” >> $REPORT
echo “————–” >> $REPORT
uptime >> $REPORT
echo “” >> $REPORT
echo “Audit completed. Report saved to $REPORT”
EOF
# 2. 执行审计脚本
# chmod +x /tmp/monitoring_audit.sh
# /tmp/monitoring_audit.sh
Audit completed. Report saved to /tmp/monitoring_audit_report.txt
# 3. 查看审计报告
# cat /tmp/monitoring_audit_report.txt
Part03-生产环境项目实施方案
3.1 top命令基础操作
top命令用于实时监控系统资源使用情况:
# 1. 启动top命令
# top
top – 10:00:00 up 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, 0.0 wa, 0.0 hi, 0.0 si, 1.0 st
MiB Mem: 1822.0 total, 446.0 free, 1200.0 used, 176.0 buff/cache
MiB Swap: 2047.0 total, 2047.0 free, 0.0 used. 1600.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0 123456 98765 12345 S 5.0 5.2 0:05.00 /usr/bin/python3 /usr/bin/app
5678 root 20 0 56789 54321 5678 S 2.0 3.1 0:01.00 /usr/sbin/nginx
9012 root 20 0 45678 43210 4321 S 1.0 2.5 0:00.30 /usr/sbin/mysqld
# 2. 以批处理模式运行
# top -bn1
top – 10:00:00 up 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, 0.0 wa, 0.0 hi, 0.0 si, 1.0 st
MiB Mem: 1822.0 total, 446.0 free, 1200.0 used, 176.0 buff/cache
MiB Swap: 2047.0 total, 2047.0 free, 0.0 used. 1600.0 avail Mem
# 3. 指定刷新间隔
# top -d 2
(每2秒刷新一次)
# 4. 指定刷新次数
# top -n 5
(刷新5次后退出)
# 5. 查看指定用户进程
# top -u fgedu
(只显示fgedu用户的进程)
# 6. 查看指定PID
# top -p 1234
(只显示PID为1234的进程)
# 7. 查看指定PID列表
# top -p 1234,5678,9012
(只显示指定PID的进程)
# 8. 显示完整命令行
# top -c
(显示完整的命令行)
# 9. 显示线程信息
# top -H
(显示线程信息)
# 10. 显示CPU信息
# top -1
(显示所有CPU信息)
# 11. 显示内存单位为KB
# top -k
(内存单位为KB)
# 12. 显示内存单位为MB
# top -m
(内存单位为MB)
# 13. 显示内存单位为GB
# top -g
(内存单位为GB)
# 14. 显示指定字段
# top -o %CPU,%MEM,TIME+,COMMAND
(只显示指定字段)
# 15. 保存配置文件
# top -b -n 1 > /tmp/top_output.txt
(将输出保存到文件)
3.2 htop命令基础操作
htop命令用于交互式系统监控:
# 1. 启动htop命令
# htop
(显示图形化界面)
# 2. 指定刷新间隔
# htop -d 2
(每2秒刷新一次)
# 3. 查看指定用户进程
# htop -u fgedu
(只显示fgedu用户的进程)
# 4. 查看指定PID
# htop -p 1234
(只显示PID为1234的进程)
# 5. 查看指定PID列表
# htop -p 1234,5678,9012
(只显示指定PID的进程)
# 6. 显示线程信息
# htop -H
(显示线程信息)
# 7. 显示CPU信息
# htop -1
(显示所有CPU信息)
# 8. 显示指定CPU
# htop -1 -p 0
(只显示CPU 0)
# 9. 显示指定CPU列表
# htop -1 -p 0,1,2,3
(只显示指定CPU)
# 10. 显示指定字段
# htop -o PID,USER,%,CPU,%,MEM,TIME,COMMAND
(只显示指定字段)
# 11. 保存配置文件
# htop -s /tmp/htop_config
(使用指定配置文件)
# 12. 不显示颜色
# htop –no-color
(不显示彩色输出)
# 13. 显示帮助信息
# htop –help
(显示帮助信息)
# 14. 显示版本信息
# htop –version
(显示版本信息)
# 15. htop交互式操作
# F1: 显示帮助
# F2: 配置界面
# F3: 搜索进程
# F4: 过滤进程
# F5: 树形显示
# F6: 排序
# F7: 降低优先级
# F8: 提高优先级
# F9: 杀死进程
# F10: 退出
# q: 退出
# k: 杀死进程
# /: 搜索进程
3.3 系统监控高级用法
系统监控的高级用法和技巧:
# 1. 查找CPU使用最多的进程
# ps aux –sort=-%cpu | head -n 10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1234 50.0 5.2 123456 98765 ? R 10:00 5:00 /usr/bin/python3 /usr/bin/app
root 5678 2.0 3.1 56789 54321 ? S 10:00 0:01 /usr/sbin/nginx
# 2. 查找内存使用最多的进程
# ps aux –sort=-%mem | head -n 10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1234 5.0 85.2 1234567 1567890 ? S 10:00 0:05 /usr/bin/python3 /usr/bin/app
root 5678 2.0 3.1 56789 54321 ? S 10:00 0:01 /usr/sbin/nginx
# 3. 查找僵尸进程
# ps aux | grep defunct
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 9999 0.0 0.0 0 0 ? Z 10:00 0:00 [defunct]
# 4. 查找长时间运行的进程
# ps aux | awk ‘$10 > 3600 {print}’
(运行时间超过1小时的进程)
# 5. 监控系统负载
# cat > /tmp/load_monitor.sh << 'EOF'
#!/bin/bash
while true; do
load=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}')
echo "$(date): Load average: $load"
sleep 60
done
EOF
# 6. 监控CPU使用率
# cat > /tmp/cpu_monitor.sh << 'EOF'
#!/bin/bash
while true; do
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
echo "$(date): CPU usage: ${cpu_usage}%"
sleep 60
done
EOF
# 7. 监控内存使用率
# cat > /tmp/memory_monitor.sh << 'EOF'
#!/bin/bash
while true; do
mem_total=$(free | grep Mem | awk '{print $2}')
mem_used=$(free | grep Mem | awk '{print $3}')
mem_percent=$((mem_used * 100 / mem_total))
echo "$(date): Memory usage: ${mem_percent}%"
sleep 60
done
EOF
# 8. 监控磁盘IO
# iostat -x 1 5
Linux 4.18.0-477.el8.x86_64 (localhost) 04/02/2026 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.50 0.00 0.50 0.00 0.00 99.00
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
# 9. 监控网络IO
# sar -n DEV 1 5
Linux 4.18.0-477.el8.x86_64 (localhost) 04/02/2026 _x86_64_ (2 CPU)
10:00:01 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s txmcst/s
10:00:02 eth0 123.45 67.89 12.34 6.78 0.00 0.00 0.00 0.00
10:00:02 eth1 45.67 23.45 4.56 2.34 0.00 0.00 0.00 0.00
# 10. 监控进程状态
# cat > /tmp/process_monitor.sh << 'EOF'
#!/bin/bash
while true; do
echo "$(date): Process status"
ps aux --sort=-%cpu | head -n 5
echo ""
ps aux --sort=-%mem | head -n 5
echo "----------------------------------------"
sleep 60
done
EOF
# 11. 监控系统资源
# cat > /tmp/system_monitor.sh << 'EOF'
#!/bin/bash
while true; do
echo "========================================"
echo "System Monitor - $(date)"
echo "========================================"
# CPU使用率
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
echo "CPU usage: ${cpu_usage}%"
# 内存使用率
mem_total=$(free | grep Mem | awk '{print $2}')
mem_used=$(free | grep Mem | awk '{print $3}')
mem_percent=$((mem_used * 100 / mem_total))
echo "Memory usage: ${mem_percent}%"
# 磁盘使用率
disk_usage=$(df -h / | tail -n 1 | awk '{print $5}' | cut -d'%' -f1)
echo "Disk usage: ${disk_usage}%"
# 系统负载
load=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}')
echo "Load average: $load"
echo "========================================"
echo ""
sleep 60
done
EOF
# 12. 监控进程资源使用
# cat > /tmp/process_resource_monitor.sh << 'EOF'
#!/bin/bash
PID=$1
if [ -z "$PID" ]; then
echo "Usage: $0
exit 1
fi
while true; do
if [ -d “/proc/$PID” ]; then
echo “$(date): Process $PID”
ps -p $PID -o pid,ppid,%cpu,%mem,vsz,rss,stat,etime,cmd
echo “”
else
echo “Process $PID not found”
break
fi
sleep 10
done
EOF
# 13. 监控系统日志
# cat > /tmp/log_monitor.sh << 'EOF'
#!/bin/bash
tail -f /var/log/messages | while read line; do
echo "$(date): $line"
done
EOF
# 14. 监控应用日志
# cat > /tmp/app_log_monitor.sh << 'EOF'
#!/bin/bash
tail -f /var/log/app/app.log | grep --line-buffered -E "ERROR|WARN" | while read line; do
echo "$(date): $line"
# 发送告警
done
EOF
# 15. 综合监控脚本
# cat > /tmp/comprehensive_monitor.sh << 'EOF'
#!/bin/bash
while true; do
# CPU监控
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if [ $(echo "$cpu_usage > 80″ | bc) -eq 1 ]; then
echo “WARNING: CPU usage is ${cpu_usage}%”
fi
# 内存监控
mem_total=$(free | grep Mem | awk ‘{print $2}’)
mem_used=$(free | grep Mem | awk ‘{print $3}’)
mem_percent=$((mem_used * 100 / mem_total))
if [ $mem_percent -gt 80 ]; then
echo “WARNING: Memory usage is ${mem_percent}%”
fi
# 磁盘监控
disk_usage=$(df -h / | tail -n 1 | awk ‘{print $5}’ | cut -d’%’ -f1)
if [ $disk_usage -gt 80 ]; then
echo “WARNING: Disk usage is ${disk_usage}%”
fi
# 系统负载监控
load=$(uptime | awk -F’load average:’ ‘{print $2}’ | awk ‘{print $1}’)
if [ $(echo “$load > 2.0” | bc) -eq 1 ]; then
echo “WARNING: Load average is $load”
fi
sleep 60
done
EOF
Part04-生产案例与实战讲解
4.1 不同场景监控案例
不同场景下的系统监控案例:
# 1. Web服务器监控
# cat > /tmp/web_monitor.sh << 'EOF'
#!/bin/bash
echo "Web Server Monitor - $(date)"
# CPU监控
echo "CPU Usage:"
top -bn1 | grep "Cpu(s)"
# 内存监控
echo ""
echo "Memory Usage:"
free -h
# 磁盘监控
echo ""
echo "Disk Usage:"
df -h | grep -E '/$|/var|/data'
# 进程监控
echo ""
echo "Web Processes:"
ps aux | grep -E "nginx|apache|httpd" | grep -v grep
# 网络监控
echo ""
echo "Network Connections:"
netstat -an | grep -E ":80|:443" | wc -l
EOF
# 2. 数据库服务器监控
# cat > /tmp/db_monitor.sh << 'EOF'
#!/bin/bash
echo "Database Server Monitor - $(date)"
# CPU监控
echo "CPU Usage:"
top -bn1 | grep "Cpu(s)"
# 内存监控
echo ""
echo "Memory Usage:"
free -h
# 磁盘监控
echo ""
echo "Disk Usage:"
df -h | grep -E '/$|/data|/var'
# 进程监控
echo ""
echo "Database Processes:"
ps aux | grep -E "mysql|postgres|redis" | grep -v grep
# 连接数监控
echo ""
echo "Database Connections:"
netstat -an | grep -E ":3306|:5432|:6379" | wc -l
EOF
# 3. 应用服务器监控
# cat > /tmp/app_monitor.sh << 'EOF'
#!/bin/bash
echo "Application Server Monitor - $(date)"
# CPU监控
echo "CPU Usage:"
top -bn1 | grep "Cpu(s)"
# 内存监控
echo ""
echo "Memory Usage:"
free -h
# 磁盘监控
echo ""
echo "Disk Usage:"
df -h | grep -E '/$|/opt|/data|/var'
# 进程监控
echo ""
echo "Application Processes:"
ps aux | grep -E "java|python|node" | grep -v grep
# 日志监控
echo ""
echo "Recent Application Errors:"
tail -n 20 /var/log/app/app.log | grep -i error
EOF
# 4. 容器服务器监控
# cat > /tmp/container_monitor.sh << 'EOF'
#!/bin/bash
echo "Container Server Monitor - $(date)"
# CPU监控
echo "CPU Usage:"
top -bn1 | grep "Cpu(s)"
# 内存监控
echo ""
echo "Memory Usage:"
free -h
# 磁盘监控
echo ""
echo "Disk Usage:"
df -h | grep -E '/$|/var'
# 容器监控
echo ""
echo "Container Status:"
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
# 容器资源监控
echo ""
echo "Container Resources:"
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}"
EOF
# 5. 综合监控
# cat > /tmp/comprehensive_monitor.sh << 'EOF'
#!/bin/bash
echo "Comprehensive System Monitor - $(date)"
# 1. 系统信息
echo "1. System Information:"
echo "-------------------"
uname -a
uptime
echo ""
# 2. CPU监控
echo "2. CPU Usage:"
echo "-------------"
top -bn1 | grep "Cpu(s)"
echo ""
# 3. 内存监控
echo "3. Memory Usage:"
echo "----------------"
free -h
echo ""
# 4. 磁盘监控
echo "4. Disk Usage:"
echo "-------------"
df -h
echo ""
# 5. 磁盘IO监控
echo "5. Disk I/O:"
echo "------------"
iostat -x 1 3
echo ""
# 6. 网络IO监控
echo "6. Network I/O:"
echo "---------------"
sar -n DEV 1 3
echo ""
# 7. 进程监控
echo "7. Top Processes:"
echo "----------------"
ps aux --sort=-%cpu | head -n 10
echo ""
# 8. 系统负载
echo "8. System Load:"
echo "---------------"
uptime
EOF
4.2 性能故障排查案例
性能相关故障的排查和解决:
# 案例1:CPU使用率过高
# 症状:系统响应缓慢,CPU使用率超过90%
# 排查步骤:
# 1. 检查CPU使用情况
# top -bn1
%Cpu(s): 95.0 us, 2.0 sy, 0.0 ni, 2.0 id, 0.0 wa, 0.0 hi, 0.0 si, 1.0 st
# 2. 检查CPU使用最多的进程
# ps aux –sort=-%cpu | head -n 10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1234 90.0 5.2 123456 98765 ? R 10:00 5:00 /usr/bin/app
# 3. 检查进程线程
# ps -Lp 1234 -o pid,tid,psr,%cpu,%mem,cmd
PID TID PSR %CPU %MEM CMD
1234 1234 0 90.0 5.2 /usr/bin/app
1234 1235 1 5.0 0.1 /usr/bin/app
# 解决:优化应用或增加CPU资源
# 案例2:内存使用率过高
# 症状:系统响应缓慢,内存使用率超过90%
# 排查步骤:
# 1. 检查内存使用情况
# free -h
total used free shared buff/cache available
Mem: 1.8G 1.7G 100M 12M 50M 100M
# 2. 检查内存使用最多的进程
# ps aux –sort=-%mem | head -n 10
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1234 5.0 85.2 1234567 1567890 ? S 10:00 0:05 /usr/bin/app
# 3. 检查交换使用情况
# free -h | grep Swap
Swap: 2.0G 1.5G 500M
# 解决:优化应用或增加内存
# 案例3:磁盘IO过高
# 症状:系统响应缓慢,磁盘IO使用率高
# 排查步骤:
# 1. 检查磁盘IO
# iostat -x 1 5
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 1000.00 500.00 8000.00 4000.00 0.00 0.00 0.00 0.00 50.00 50.00 75.00 8.00 8.00 0.67 100.00
# 2. 检查磁盘使用最多的进程
# iotop -o -b -n 1
Total DISK READ: 10.00 M/s | Total DISK WRITE: 5.00 M/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
1234 be/4 root 8.00 M/s 4.00 M/s 0.00 % 10.00 % /usr/bin/app
# 3. 检查磁盘使用情况
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 50G 45G 5G 90% /
# 解决:优化磁盘IO或升级硬件
# 案例4:系统负载过高
# 症状:系统响应缓慢,系统负载超过2.0
# 排查步骤:
# 1. 检查系统负载
# uptime
10:00:00 up 1:23, 2 users, load average: 3.50, 3.60, 3.70
# 2. 检查运行队列
# vmstat 1 5
procs ———–memory———- —swap– —–io—- -system– ——cpu—–
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 0 123456 12345 456789 0 0 100 50 100 200 10 5 80 5 0
# 3. 检查CPU使用情况
# top -bn1 | grep “Cpu(s)”
%Cpu(s): 10.0 us, 5.0 sy, 0.0 ni, 80.0 id, 5.0 wa, 0.0 hi, 0.0 si, 0.0 st
# 解决:优化应用或增加CPU资源
# 案例5:网络连接过多
# 症状:系统响应缓慢,网络连接数过多
# 排查步骤:
# 1. 检查网络连接数
# netstat -an | wc -l
10000
# 2. 检查各端口连接数
# netstat -an | grep -E “:80|:443” | wc -l
8000
# 3. 检查连接状态
# netstat -an | awk ‘{print $6}’ | sort | uniq -c | sort -nr
5000 ESTABLISHED
3000 TIME_WAIT
2000 CLOSE_WAIT
# 解决:优化应用或调整系统参数
# 案例6:进程僵尸
# 症状:系统中存在僵尸进程
# 排查步骤:
# 1. 检查僵尸进程
# ps aux | grep defunct
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 9999 0.0 0.0 0 0 ? Z 10:00 0:00 [defunct]
# 2. 检查僵尸进程的父进程
# ps -ef | grep 9999
root 9998 0.0 0.0 12345 5678 ? S 10:00 0:00 /usr/bin/app
# 3. 检查父进程状态
# ps -p 9998 -o pid,stat,cmd
PID STAT CMD
9998 S /usr/bin/app
# 解决:重启父进程或杀死父进程
# 案例7:进程卡死
# 症状:进程无响应
# 排查步骤:
# 1. 检查进程状态
# ps -p 1234 -o pid,stat,wchan,cmd
PID STAT WCHAN CMD
1234 D wait_for_disk /usr/bin/app
# 2. 检查进程堆栈
# cat /proc/1234/wchan
wait_for_disk
# 3. 检查进程文件描述符
# ls -l /proc/1234/fd/
total 0
lrwx——. 1 root root 64 Apr 2 10:00 0 -> /dev/null
lrwx——. 1 root root 64 Apr 2 10:00 1 -> socket:[12345]
# 解决:重启进程或修复磁盘问题
# 案例8:内存泄漏
# 症状:进程内存使用持续增长
# 排查步骤:
# 1. 监控进程内存使用
# watch -n 1 “ps -p 1234 -o pid,%mem,vsz,rss”
# 2. 检查进程内存详情
# cat /proc/1234/status | grep -E “VmSize|VmRSS|VmPeak|VmHWM”
VmSize: 1234567 kB
VmRSS: 1567890 kB
VmPeak: 2000000 kB
VmHWM: 1600000 kB
# 3. 使用内存分析工具
# valgrind –leak-check=full /usr/bin/app
# 解决:修复应用内存泄漏
# 案例9:CPU负载不均衡
# 症状:某些CPU使用率高,其他CPU空闲
# 排查步骤:
# 1. 检查各CPU使用情况
# top -1
%Cpu0 : 90.0 us, 5.0 sy, 0.0 ni, 5.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 10.0 us, 5.0 sy, 0.0 ni, 85.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
# 2. 检查进程CPU绑定
# taskset -pc 1234
pid 1234’s current affinity list: 0
# 3. 检查NUMA配置
# numactl –hardware
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7
node 0 size: 1024 MB
node 0 free: 512 MB
node 1 cpus: 8 9 10 11 12 13 14 15
node 1 size: 1024 MB
node 1 free: 1000 MB
# 解决:调整进程CPU绑定或优化应用
# 案例10:系统响应缓慢
# 症状:系统整体响应缓慢
# 排查步骤:
# 1. 检查系统负载
# uptime
10:00:00 up 1:23, 2 users, load average: 3.50, 3.60, 3.70
# 2. 检查CPU使用情况
# top -bn1 | grep “Cpu(s)”
%Cpu(s): 10.0 us, 5.0 sy, 0.0 ni, 80.0 id, 5.0 wa, 0.0 hi, 0.0 si, 0.0 st
# 3. 检查内存使用情况
# free -h
total used free shared buff/cache available
Mem: 1.8G 1.2G 100M 12M 50M 500M
# 4. 检查磁盘IO
# iostat -x 1 5
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 100.00 50.00 800.00 400.00 0.00 0.00 0.00 0.00 50.00 50.00 75.00 8.00 8.00 0.67 100.00
# 解决:优化磁盘IO或升级硬件
4.3 性能优化案例
性能优化的实际案例:
# 1. 优化CPU调度
# cat > /tmp/optimize_cpu.sh << 'EOF'
#!/bin/bash
echo "Optimizing CPU scheduling..."
# 检查当前调度器
echo "Current scheduler:"
cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
# 设置调度器为deadline
echo deadline > /sys/block/sda/queue/scheduler
# 永久配置
if ! grep -q “echo deadline” /etc/rc.local; then
echo “echo deadline > /sys/block/sda/queue/scheduler” >> /etc/rc.local
fi
echo “CPU scheduling optimized”
EOF
# 2. 优化内存使用
# cat > /tmp/optimize_memory.sh << 'EOF'
#!/bin/bash
echo "Optimizing memory usage..."
# 降低交换倾向
echo 10 > /proc/sys/vm/swappiness
# 提高缓存回收倾向
echo 50 > /proc/sys/vm/vfs_cache_pressure
# 降低脏页比例
echo 5 > /proc/sys/vm/dirty_ratio
# 永久配置
if ! grep -q “vm.swappiness” /etc/sysctl.conf; then
echo “vm.swappiness=10” >> /etc/sysctl.conf
echo “vm.vfs_cache_pressure=50” >> /etc/sysctl.conf
echo “vm.dirty_ratio=5” >> /etc/sysctl.conf
fi
# 应用配置
sysctl -p
echo “Memory usage optimized”
EOF
# 3. 优化磁盘IO
# cat > /tmp/optimize_disk.sh << 'EOF'
#!/bin/bash
echo "Optimizing disk I/O..."
# 设置读取预取
echo 256 > /sys/block/sda/queue/read_ahead_kb
# 设置队列长度
echo 128 > /sys/block/sda/queue/nr_requests
# 永久配置
if ! grep -q “read_ahead_kb” /etc/rc.local; then
echo “echo 256 > /sys/block/sda/queue/read_ahead_kb” >> /etc/rc.local
echo “echo 128 > /sys/block/sda/queue/nr_requests” >> /etc/rc.local
fi
echo “Disk I/O optimized”
EOF
# 4. 优化网络性能
# cat > /tmp/optimize_network.sh << 'EOF'
#!/bin/bash
echo "Optimizing network performance..."
# 增加TCP缓冲区
echo "net.core.rmem_max = 16777216" >> /etc/sysctl.conf
echo “net.core.wmem_max = 16777216” >> /etc/sysctl.conf
echo “net.ipv4.tcp_rmem = 4096 87380 16777216” >> /etc/sysctl.conf
echo “net.ipv4.tcp_wmem = 4096 65536 16777216” >> /etc/sysctl.conf
# 应用配置
sysctl -p
echo “Network performance optimized”
EOF
# 5. 优化进程优先级
# cat > /tmp/optimize_process.sh << 'EOF'
#!/bin/bash
echo "Optimizing process priority..."
# 提高关键进程优先级
renice -10 1234
# 降低非关键进程优先级
renice +10 5678
echo "Process priority optimized"
EOF
# 6. 优化文件描述符
# cat > /tmp/optimize_fd.sh << 'EOF'
#!/bin/bash
echo "Optimizing file descriptors..."
# 增加文件描述符限制
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo “* hard nofile 65536” >> /etc/security/limits.conf
# 增加系统文件描述符
echo “fs.file-max = 1000000” >> /etc/sysctl.conf
# 应用配置
sysctl -p
echo “File descriptors optimized”
EOF
# 7. 完整性能优化
# cat > /tmp/full_performance_optimization.sh << 'EOF'
#!/bin/bash
echo "Starting full performance optimization..."
# 1. 优化CPU调度
./optimize_cpu.sh
# 2. 优化内存使用
./optimize_memory.sh
# 3. 优化磁盘IO
./optimize_disk.sh
# 4. 优化网络性能
./optimize_network.sh
# 5. 优化进程优先级
./optimize_process.sh
# 6. 优化文件描述符
./optimize_fd.sh
echo "Full performance optimization completed"
EOF
# chmod +x /tmp/full_performance_optimization.sh
# /tmp/full_performance_optimization.sh
Part05-风哥经验总结与分享
5.1 系统监控最佳实践
# 1. 监控原则
– 定期检查系统状态
– 设置自动告警
– 记录历史数据
– 分析性能趋势
# 2. 监控指标
– CPU使用率
– 内存使用率
– 磁盘使用率
– 磁盘IO
– 网络IO
– 系统负载
# 3. 监控工具
– top/htop:实时监控
– vmstat:统计信息
– iostat:IO监控
– 监控系统:Zabbix/Prometheus
# 4. 告警原则
– 设置多级告警
– 区分不同指标
– 配置通知渠道
– 建立应急流程
# 5. 优化原则
– 识别性能瓶颈
– 优化系统配置
– 优化应用配置
– 定期评估效果
5.2 常见问题与解决
# 问题1:CPU使用率过高
# 解决:查找并优化CPU使用
# ps aux –sort=-%cpu | head -n 10
# 问题2:内存使用率过高
# 解决:查找并优化内存使用
# ps aux –sort=-%mem | head -n 10
# 问题3:磁盘IO过高
# 解决:查找并优化磁盘IO
# iostat -x 1 5
# iotop -o
# 问题4:系统负载过高
# 解决:查找并优化系统负载
# uptime
# vmstat 1 5
# 问题5:网络连接过多
# 解决:查找并优化网络连接
# netstat -an | wc -l
# 问题6:进程僵尸
# 解决:重启父进程或杀死父进程
# ps aux | grep defunct
# 问题7:进程卡死
# 解决:重启进程或修复磁盘问题
# ps -p PID -o pid,stat,wchan,cmd
# 问题8:内存泄漏
# 解决:使用内存分析工具
# valgrind –leak-check=full
# 问题9:CPU负载不均衡
# 解决:调整进程CPU绑定
# taskset -pc PID
# 问题10:系统响应缓慢
# 解决:综合分析和优化
# top, free, df, iostat
5.3 系统监控工具推荐
- 实时监控:top, htop, iotop
- 统计监控:vmstat, iostat, sar
- 网络监控:netstat, ss, nethogs
- 监控系统:Zabbix, Prometheus, Grafana
- 日志监控:journalctl, logwatch
# 1. 实时监控
# top
# htop
# iotop
# 2. 统计监控
# vmstat 1 5
# iostat -x 1 5
# sar -u 1 5
# 3. 网络监控
# netstat -an
# ss -tuln
# nethogs
# 4. 进程监控
# ps aux
# ps -ef
# pstree
# 5. 日志监控
# journalctl -f
# tail -f /var/log/messages
# 6. 性能分析
# strace -p PID
# ltrace -p PID
# perf top
# 7. 系统信息
# uname -a
# uptime
# dmesg
# 8. 资源监控
# free -h
# df -h
# cat /proc/meminfo
# 9. 网络监控
# ping
# traceroute
# mtr
# 10. 综合监控
# dstat
# glances
# nmon
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
