找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

670

积分

0

好友

94

主题
发表于 昨天 02:39 | 查看: 1| 回复: 0

凌晨三点,手机急促响起,监控告警显示线上服务异常。本文将系统性地分享Linux系统运维中最常见的故障场景、排查思路与解决命令,帮助运维工程师在关键时刻快速定位问题、恢复服务。

一、建立系统化的故障排查思维模型

1.1 黄金排查法则:STEP模型

在处理任何故障前,请牢记这个模型:

  • Symptom(症状):准确描述故障现象
  • Time(时间):确定故障发生的时间点
  • Environment(环境):了解系统环境和最近变更
  • Problem(问题):定位根因并解决

建立清晰的排查思维,是高效解决运维/DevOps问题的第一步。

1.2 故障优先级判定矩阵

紧急程度 × 影响范围 = 处理优先级
P0:核心业务全部中断(立即处理)
P1:核心业务部分中断(15分钟内处理)
P2:非核心业务受影响(1小时内处理)
P3:个别用户受影响(计划内处理)

二、CPU相关故障排查实战

2.1 CPU使用率100%的排查思路

故障现象:系统响应缓慢,top显示CPU使用率持续100%

排查步骤

# 1. 找出CPU占用最高的进程
top -c
# 按P键按CPU排序,记录PID

# 2. 查看进程的线程CPU占用
top -Hp [PID]

# 3. 获取问题线程的堆栈信息
# 将线程ID转换为16进制
printf "%x\n" [ThreadID]

# 4. 如果是Java进程,打印线程堆栈
jstack [PID] | grep -A 20 [16进制ThreadID]

# 5. 使用perf分析CPU热点
perf top -p [PID]
perf record -p [PID] -g -- sleep 30
perf report

真实案例:某电商平台促销期间CPU飙升
问题定位过程:

  1. 通过top发现Java进程占用CPU 800%(8核满载)
  2. jstack分析发现大量线程阻塞在某个synchronized方法
  3. 代码review发现是日志写入使用了同步锁
  4. 解决方案:改用异步日志框架,CPU立即降至30%

经验总结

  • CPU高的常见原因:死循环、正则表达式回溯、GC频繁、锁竞争
  • 养成使用perf、火焰图等工具的习惯
  • 建立CPU使用基线,及时发现异常

2.2 Load Average居高不下

故障现象:Load Average达到30+,但CPU使用率只有50%

# 排查步骤
# 1. 查看负载和进程状态
uptime
vmstat 1 5

# 2. 分析进程状态分布
ps aux | awk '{print $8}' | sort | uniq -c

# 3. 查看D状态(不可中断睡眠)进程
ps aux | grep " D "

# 4. 分析IO等待
iostat -x 1 5
iotop -o

# 5. 查看系统调用
strace -c -p [PID]

根因分析:Load高但CPU不高,通常是IO等待或锁等待导致。

三、内存故障深度剖析

3.1 内存泄漏排查全流程

故障现象:内存使用持续增长,最终OOM Kill

# 1. 查看内存使用趋势
free -h
cat /proc/meminfo

# 2. 找出内存占用最高的进程
ps aux --sort=-%mem | head

# 3. 查看进程内存映射
pmap -x [PID]
cat /proc/[PID]/status | grep -i vm

# 4. 内存泄漏检测(C/C++程序)
valgrind --leak-check=full --show-leak-kinds=all ./program

# 5. Java程序内存分析
jmap -heap [PID]
jmap -histo:live [PID]
jmap -dump:format=b,file=heap.bin [PID]
# 使用MAT或jhat分析dump文件

实战案例:Redis内存异常增长问题
排查过程:

# 1. 进入Redis查看内存信息
redis-cli info memory
# 2. 分析大key
redis-cli --bigkeys
# 3. 采样分析key分布
redis-cli --memkeys
# 4. 发现问题:某个Hash类型key包含1000万个field
# 5. 解决:拆分大key,设置合理过期时间

3.2 缓存命中率优化

监控指标

# 查看系统缓存情况
free -h
cat /proc/meminfo | grep -E "Cached|Buffer"
# 查看页面缓存命中率
sar -B 1 10
# 清理缓存(慎用于生产环境)
echo 1 > /proc/sys/vm/drop_caches  # 清理页缓存
echo 2 > /proc/sys/vm/drop_caches  # 清理dentries和inodes
echo 3 > /proc/sys/vm/drop_caches  # 清理所有缓存

四、磁盘IO故障处理

4.1 IO性能瓶颈定位

故障现象:数据库响应变慢,IO wait居高不下

# 1. 查看磁盘IO情况
iostat -x 1 10
# 重点关注:%util、await、r/s、w/s

# 2. 查看哪些进程在进行IO
iotop -o -P

# 3. 追踪具体的IO操作
blktrace -d /dev/sda -o trace
blkparse trace.* | head -n 100

# 4. 查看文件系统缓存
slabtop

# 5. 分析进程的IO模式
pidstat -d 1 10

优化方案

# 1. 调整IO调度算法
cat /sys/block/sda/queue/scheduler
echo deadline > /sys/block/sda/queue/scheduler

# 2. 调整预读大小
blockdev --getra /dev/sda
blockdev --setra 256 /dev/sda

# 3. 使用ionice调整进程IO优先级
ionice -c3 -p [PID]  # 设置为idle级别

4.2 磁盘空间问题快速处理

# 1. 快速找出大文件
du -h / 2>/dev/null | grep '[0-9]G' | sort -rn

# 2. 查找最近修改的大文件
find / -type f -mtime -1 -size +100M 2>/dev/null

# 3. 查看已删除但未释放的文件
lsof | grep deleted

# 4. 查看inode使用情况
df -i

# 5. 找出inode占用最多的目录
for i in /*; do echo $i; find $i -type f | wc -l; done

经典案例:日志文件被删除但空间未释放

# 问题:rm删除了大日志文件,但df看空间没有释放
# 原因:进程仍在写入已删除的文件
# 解决方法1:找出占用进程并重启
lsof | grep deleted
kill -USR1 [nginx_pid]  # 重新打开日志文件
# 解决方法2:清空文件而不是删除
> /var/log/large.log  # 推荐做法

五、网络故障排查技巧

5.1 网络连接故障定位

# 1. 检查网络连通性
ping -c 4 目标IP
traceroute 目标IP
mtr 目标IP  # 结合ping和traceroute

# 2. 检查DNS解析
nslookup domain.com
dig +trace domain.com

# 3. 检查端口连通性
telnet IP PORT
nc -zv IP PORT

# 4. 查看连接状态
ss -antp
netstat -antp | awk '{print $6}' | sort | uniq -c

# 5. 抓包分析
tcpdump -i eth0 -nn -s0 -v port 80
tcpdump -i eth0 -w capture.pcap  # 保存后用Wireshark分析

5.2 TIME_WAIT过多问题

故障现象:大量TIME_WAIT连接导致端口耗尽

# 查看TIME_WAIT数量
ss -ant | grep TIME-WAIT | wc -l

# 优化内核参数
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0  # 注意:不建议开启
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_fin_timeout = 30
EOF
sysctl -p

5.3 网络性能优化

# 1. 查看网络流量
iftop -i eth0
nethogs

# 2. 查看网络错误和丢包
ip -s link show eth0
ethtool -S eth0

# 3. 优化网络缓冲区
echo 'net.core.rmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.core.wmem_max = 134217728' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_rmem = 4096 87380 134217728' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_wmem = 4096 65536 134217728' >> /etc/sysctl.conf

六、进程和服务故障处理

6.1 僵尸进程处理

# 查找僵尸进程
ps aux | grep defunct
ps aux | awk '$8 ~ /^Z/ { print }'

# 找出僵尸进程的父进程
ps -ef | grep defunct | grep -v grep | awk '{print $3}' | sort | uniq

# 处理方法
# 1. 向父进程发送SIGCHLD信号
kill -SIGCHLD [父进程PID]
# 2. 如果无效,重启父进程
systemctl restart [服务名]

6.2 服务无法启动排查

# 1. 查看服务状态和日志
systemctl status service_name
journalctl -u service_name -n 50

# 2. 检查端口占用
ss -tlnp | grep :端口号
lsof -i :端口号

# 3. 检查配置文件语法
nginx -t
httpd -t
mysql --help --verbose | grep -A 1 "Default options"

# 4. 检查权限问题
ls -la /path/to/service
namei -l /path/to/service/file

# 5. 查看SELinux问题
getenforce
setenforce 0  # 临时关闭测试
ausearch -m AVC -ts recent

七、系统日志分析技巧

7.1 高效的日志分析命令

# 1. 快速定位错误日志
grep -E "ERROR|WARN|FATAL" /var/log/app.log | tail -100

# 2. 统计错误频率
awk '/ERROR/ {print $1,$2}' app.log | uniq -c | sort -rn

# 3. 分析访问日志
# 统计状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 统计慢请求
awk '$NF > 1000 {print $7,$NF}' access.log | sort -k2 -rn | head

# 4. 实时日志监控
tail -f /var/log/messages | grep --line-buffered ERROR

# 5. 多文件日志合并分析
zcat /var/log/app.log*.gz | grep ERROR | less

7.2 使用journalctl高效排查

# 查看指定时间段的日志
journalctl --since "2024-01-01 00:00:00" --until "2024-01-01 01:00:00"
# 查看指定服务的日志
journalctl -u nginx.service -f
# 查看内核日志
journalctl -k
# 查看指定优先级的日志
journalctl -p err..emerg
# 导出日志for分析
journalctl -u service_name -o json > service.json

八、数据库故障处理

8.1 MySQL性能问题排查

# 1. 查看慢查询
show variables like 'slow_query%';
show variables like 'long_query_time';

# 2. 查看当前执行的SQL
show processlist;
show full processlist;

# 3. 查看锁等待
show engine innodb status\G
SELECT * FROM information_schema.INNODB_LOCKS;
SELECT * FROM information_schema.INNODB_LOCK_WAITS;

# 4. 查看表锁情况
show open tables where in_use > 0;

# 5. 分析SQL执行计划
explain select * from table where condition;

死锁处理案例

-- 查看最近的死锁信息
SHOW ENGINE INNODB STATUS\G
-- 找出持有锁的事务
SELECT * FROM information_schema.INNODB_TRX\G
-- 杀掉问题事务
KILL [进程ID];

8.2 Redis故障处理

# 1. 查看Redis状态
redis-cli ping
redis-cli info

# 2. 查看慢查询
redis-cli slowlog get 10

# 3. 查看客户端连接
redis-cli client list

# 4. 查看内存使用
redis-cli info memory

# 5. 紧急清理缓存
redis-cli FLUSHDB  # 清空当前库
redis-cli FLUSHALL # 清空所有库(慎用)

九、容器化环境故障排查

9.1 Docker容器故障

# 1. 查看容器状态
docker ps -a
docker inspect [容器ID]

# 2. 查看容器日志
docker logs --tail 100 -f [容器ID]

# 3. 进入容器排查
docker exec -it [容器ID] /bin/bash

# 4. 查看容器资源使用
docker stats
docker top [容器ID]

# 5. 查看容器网络
docker network ls
docker port [容器ID]

容器化环境的问题排查与传统环境有所不同,更多关于云原生/IaaS的故障处理思路可以在社区找到。

9.2 Kubernetes故障排查

# 1. 查看Pod状态
kubectl get pods -o wide
kubectl describe pod [pod-name]

# 2. 查看Pod日志
kubectl logs -f [pod-name]
kubectl logs -f [pod-name] -c [container-name]

# 3. 进入Pod调试
kubectl exec -it [pod-name] -- /bin/bash

# 4. 查看事件
kubectl get events --sort-by=.metadata.creationTimestamp

# 5. 查看资源使用
kubectl top nodes
kubectl top pods

十、自动化故障处理脚本

10.1 CPU监控告警脚本

#!/bin/bash
# CPU监控告警脚本
CPU_THRESHOLD=80
LOAD_THRESHOLD=10

# 获取CPU使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}')

# 判断并告警
if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
    echo "警告: CPU使用率过高: ${CPU_USAGE}%"
    # 发送告警通知
    curl -X POST "https://your-webhook-url" \
        -H "Content-Type: application/json" \
        -d "{\"text\":\"CPU告警: 使用率${CPU_USAGE}%\"}"
fi

if (( $(echo "$LOAD_AVG > $LOAD_THRESHOLD" | bc -l) )); then
    echo "警告: 系统负载过高: ${LOAD_AVG}"
    # 记录高负载进程
    ps aux --sort=-%cpu | head -10 > /tmp/high_cpu_processes.log
fi

10.2 磁盘空间自动清理脚本

#!/bin/bash
# 磁盘空间自动清理脚本
THRESHOLD=80
LOG_DIR="/var/log"
DAYS_TO_KEEP=7

# 检查磁盘使用率
USAGE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $USAGE -gt $THRESHOLD ]; then
    echo "磁盘使用率超过${THRESHOLD}%,开始清理..."

    # 清理老旧日志
    find $LOG_DIR -name "*.log" -mtime +$DAYS_TO_KEEP -delete
    find $LOG_DIR -name "*.gz" -mtime +$DAYS_TO_KEEP -delete

    # 清理系统临时文件
    find /tmp -type f -mtime +7 -delete
    find /var/tmp -type f -mtime +7 -delete

    # 清理包管理器缓存
    yum clean all 2>/dev/null || apt-get clean 2>/dev/null

    # 清理journal日志
    journalctl --vacuum-time=7d

    echo "清理完成,当前磁盘使用率: $(df -h / | awk 'NR==2 {print $5}')"
fi

十一、故障预防和监控建设

11.1 构建完善的监控体系

关键监控指标

  1. 系统层面
    • CPU使用率、Load Average
    • 内存使用率、Swap使用情况
    • 磁盘IO、磁盘使用率
    • 网络流量、连接数
  2. 应用层面
    • 响应时间(P50/P90/P99)
    • 错误率、成功率
    • QPS/TPS
    • 业务指标
  3. 告警策略
# Prometheus告警规则示例
groups:
- name: system_alerts
  rules:
  - alert: HighCPUUsage
    expr: 100-(avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))*100) > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "CPU使用率过高"
      description: "CPU使用率超过80%已持续5分钟"

11.2 故障演练和预案

定期进行故障演练

  • 模拟CPU打满场景
  • 模拟内存泄漏
  • 模拟磁盘故障
  • 模拟网络分区

建立故障预案

## 故障预案模板
### 1. 故障类型:[具体故障类型]
### 2. 故障等级:[P0/P1/P2/P3]
### 3. 影响范围:[受影响的业务和用户]
### 4. 处理流程:
   1. 第一步:[具体操作]
   2. 第二步:[具体操作]
   3. 第三步:[具体操作]
### 5. 回滚方案:[如何回滚]
### 6. 责任人:[负责人及联系方式]

十二、性能优化最佳实践

12.1 内核参数优化

# /etc/sysctl.conf 优化配置
# 网络优化
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_reuse = 1

# 内存优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

# 文件系统优化
fs.file-max = 2097152
fs.nr_open = 2097152

12.2 应用层优化建议

  1. 数据库优化
    • 合理使用索引
    • 避免N+1查询
    • 使用连接池
    • 读写分离
  2. 缓存策略
    • 多级缓存架构
    • 缓存预热
    • 缓存更新策略
    • 防止缓存雪崩
  3. 代码优化
    • 异步处理
    • 批量操作
    • 连接复用
    • 资源池化

十三、运维工具推荐

13.1 必备命令行工具

# 系统性能分析
htop        # 更友好的top
iotop       # IO监控
iftop       # 网络流量监控
sysstat     # 系统统计工具集
dstat       # 综合监控工具

# 进程追踪
strace      # 系统调用追踪
ltrace      # 库调用追踪
perf        # 性能分析工具

# 网络工具
mtr         # 网络诊断
nmap        # 端口扫描
tcpdump     # 抓包工具
ss          # 套接字统计

13.2 监控平台推荐

  1. 开源方案
    • Prometheus + Grafana
    • Zabbix
    • ELK Stack
    • OpenFalcon
  2. 商业方案
    • Datadog
    • New Relic
    • 阿里云ARMS
    • 腾讯云监控

选择合适的监控工具是保障系统稳定的关键,更多关于数据库/中间件的性能监控方案可以参考相关专题。

十四、真实故障案例分享

案例1:双11电商平台宕机事件

背景:某电商平台双11期间,流量突增10倍,系统崩溃
故障现象

  • 用户无法下单
  • 页面加载超时
  • 数据库连接池耗尽

排查过程

  1. 发现数据库连接数达到上限
  2. 慢查询日志显示大量全表扫描
  3. 找到未加索引的热点查询
  4. 紧急添加索引,连接数恢复正常

经验教训

  • 压测要覆盖真实场景
  • 建立SQL审核机制
  • 监控要设置合理阈值

案例2:Redis缓存雪崩导致服务瘫痪

故障过程

00:00 - Redis集群某个节点宕机
00:01 - 大量请求直接打到数据库
00:03 - 数据库CPU飙升至100%
00:05 - 服务全面瘫痪

解决方案

  1. 紧急扩容数据库
  2. 实施限流降级
  3. 修复Redis节点
  4. 优化缓存策略,增加随机过期时间

运维工作就像是系统的守护者,每一次故障都是一次成长的机会。记住:最好的运维,不是能快速解决故障的运维,而是能预防故障发生的运维。 希望这些实战经验能帮助你建立系统化的故障处理思维。




上一篇:0Ω电阻额定电流详解与PCB设计应用:从选型到实战技巧
下一篇:Linux 6.19内核里程碑:Rust模块参数开启驱动生产环境部署新时代
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-12 08:34 , Processed in 0.082818 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表