> 技术文档 > 深度实战:Ubuntu服务器宕机排查全记录_ubuntu宕机怎么排查

深度实战:Ubuntu服务器宕机排查全记录_ubuntu宕机怎么排查


从紧急救援到根因分析,附自动化诊断工具开发**

一、生死时速:宕机现场紧急响应

场景描述

  • 凌晨3:15,监控系统告警:生产环境Ubuntu 22.04服务器无响应
  • 用户访问全部超时,SSH连接失败
  • 硬件指示灯:电源正常,硬盘黄灯闪烁

第一阶段响应流程

#mermaid-svg-sywa7EqzWh3ixmIu {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sywa7EqzWh3ixmIu .error-icon{fill:#552222;}#mermaid-svg-sywa7EqzWh3ixmIu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sywa7EqzWh3ixmIu .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-sywa7EqzWh3ixmIu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sywa7EqzWh3ixmIu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sywa7EqzWh3ixmIu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sywa7EqzWh3ixmIu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sywa7EqzWh3ixmIu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sywa7EqzWh3ixmIu .marker.cross{stroke:#333333;}#mermaid-svg-sywa7EqzWh3ixmIu svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sywa7EqzWh3ixmIu .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sywa7EqzWh3ixmIu .cluster-label text{fill:#333;}#mermaid-svg-sywa7EqzWh3ixmIu .cluster-label span{color:#333;}#mermaid-svg-sywa7EqzWh3ixmIu .label text,#mermaid-svg-sywa7EqzWh3ixmIu span{fill:#333;color:#333;}#mermaid-svg-sywa7EqzWh3ixmIu .node rect,#mermaid-svg-sywa7EqzWh3ixmIu .node circle,#mermaid-svg-sywa7EqzWh3ixmIu .node ellipse,#mermaid-svg-sywa7EqzWh3ixmIu .node polygon,#mermaid-svg-sywa7EqzWh3ixmIu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sywa7EqzWh3ixmIu .node .label{text-align:center;}#mermaid-svg-sywa7EqzWh3ixmIu .node.clickable{cursor:pointer;}#mermaid-svg-sywa7EqzWh3ixmIu .arrowheadPath{fill:#333333;}#mermaid-svg-sywa7EqzWh3ixmIu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sywa7EqzWh3ixmIu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sywa7EqzWh3ixmIu .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-sywa7EqzWh3ixmIu .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-sywa7EqzWh3ixmIu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sywa7EqzWh3ixmIu .cluster text{fill:#333;}#mermaid-svg-sywa7EqzWh3ixmIu .cluster span{color:#333;}#mermaid-svg-sywa7EqzWh3ixmIu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sywa7EqzWh3ixmIu :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 正常 黄灯常亮 熄灭 物理检查 电源状态 硬盘指示灯 网络端口灯 IPMI远程控制 硬盘故障预警 网络配置问题


二、紧急救援:四步恢复系统访问

1. 通过IPMI强制重启

# 使用IPMItool远程管理ipmitool -I lanplus -H 10.0.100.10 -U admin -P password power reset

📌 注意:若硬件支持,优先通过BMC/IPMI访问,避免机房奔波

2. 进入GRUB救援模式
启动时按Shift进入GRUB菜单:

# 选择Advanced options > recovery mode# 挂载根目录读写权限mount -o remount,rw /

3. 检查文件系统完整性

# 扫描所有分区错误fsck -y /dev/sda1fsck -y /dev/sdb2# 检查日志输出关键信息dmesg | grep -i \'error\' | tail -n 20

4. 临时禁用故障服务

# 停止可能引发崩溃的服务systemctl stop docker containerd kubelet

三、深度排查:五维根因分析法

1. 内存泄漏分析

# 检查内核OOM日志grep -i \'killed process\' /var/log/syslog# 查看内存使用历史sar -r | tail -n 24

关键指标

  • %memused > 90% 持续2小时
  • kswapd0进程CPU占用100%

2. CPU异常定位

# 1. 查看最近高负载进程journalctl --since \"2 hours ago\" | grep -i \'overload\'# 2. 生成CPU使用火焰图perf record -F 99 -a -g -- sleep 30perf script > out.perf./FlameGraph/stackcollapse-perf.pl out.perf | ./FlameGraph/flamegraph.pl > cpu.svg

🔥 火焰图解读:横向宽度=CPU耗时,纵向=调用栈深度

3. 磁盘I/O瓶颈

# 查看磁盘等待队列iostat -dxm 1# 输出示例:# Device: await %util# sda 120.3 98% # 严重阻塞!# sdb 1.2 5%# 定位高IO进程iotop -oP

4. 网络风暴检测

# 抓取异常数据包tcpdump -i eth0 -w panic.pcap# 分析TOP连接ss -s | grep \'Total:\'# Total: 32458 (kernel 0)# TCP: 31245 (estab 28976, closed 2269, orphaned 143)

⚠️ 危险信号

  • ESTAB连接数 > 25000
  • Orphaned sockets持续增长

5. 内核崩溃分析

# 检查内核转储文件apt install crash kdump-toolscrash /var/crash/2024070303/dump.2024070303# 常用命令crash> log # 查看崩溃日志crash> bt # 打印调用栈crash> ps # 查看崩溃时进程状态

四、根因定位:僵尸进程引发级联故障

证据链还原

sequenceDiagram 数据库客户端->>Worker进程: 创建子进程处理查询 Worker进程-->>父进程: 返回结果后意外终止 父进程->>系统: 未回收子进程(僵尸) 循环 每5分钟 系统-->>僵尸进程表: 累计+150 end 系统->>内核: 进程PID耗尽 内核->>服务: 拒绝新进程创建 服务-->>用户: 服务不可用

关键日志佐证

$ grep \'zombie\' /var/log/kern.logJul 03 02:18:01 host kernel: [19876.123] Out of PIDs: fork failure in pid_namespaceJul 03 02:33:45 host kernel: [20789.456] zombie created by pid 14523 (python3)

五、创新方案:自动化宕机分析工具

功能设计

  • 自动收集系统快照
  • 生成可视化诊断报告
  • 微信/邮件实时告警

代码实现autopsy.sh

#!/bin/bash# 服务器宕机自动诊断工具REPORT_DIR=\"/var/autopsy/$(date +%Y%m%d_%H%M%S)\"mkdir -p $REPORT_DIR# 1. 系统基础信息top -b -n1 > $REPORT_DIR/top.txtfree -m > $REPORT_DIR/mem.txtdf -h > $REPORT_DIR/disk.txt# 2. 进程级诊断ps auxf > $REPORT_DIR/ps.txtlsof +D / > $REPORT_DIR/lsof_all.txt 2>/dev/null# 3. 网络状态分析ss -tulnp > $REPORT_DIR/ss.txtnetstat -s > $REPORT_DIR/netstat.txt# 4. 日志关键错误journalctl -S \"-1 hour\" > $REPORT_DIR/journal.logdmesg -T > $REPORT_DIR/dmesg.log# 5. 生成HTML报告echo \"

Autopsy Report

\"
> $REPORT_DIR/report.htmlecho \"

Top Processes

$(cat $REPORT_DIR/top.txt | head -n20)

\" >> $REPORT_DIR/report.htmlecho \"

Memory Leak Check

$(grep -A5 \'slabinfo\' $REPORT_DIR/mem.txt)

\" >> $REPORT_DIR/report.html# 微信告警(需安装企业微信机器人)curl -s -X POST -H \"Content-Type: application/json\" \\-d \'{\"msgtype\": \"text\", \"text\": {\"content\": \"🚨 服务器宕机!诊断报告路径: \'$REPORT_DIR\'\"}}\' \\https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY


六、根治方案:构建抗崩溃体系

1. 僵尸进程防御层

# 在Python应用中添加子进程回收import osimport signaldef handler(signum, frame): os.waitpid(-1, os.WNOHANG)signal.signal(signal.SIGCHLD, handler)

2. 资源隔离方案

# /etc/systemd/system/myapp.service[Service]MemoryMax=8G # 内存硬限制CPUQuota=300% # 最多使用3核TasksMax=1000 # 最大进程数

3. 高可用架构升级

#mermaid-svg-NBabQN8uFIqMSUUy {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NBabQN8uFIqMSUUy .error-icon{fill:#552222;}#mermaid-svg-NBabQN8uFIqMSUUy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NBabQN8uFIqMSUUy .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-NBabQN8uFIqMSUUy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NBabQN8uFIqMSUUy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NBabQN8uFIqMSUUy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NBabQN8uFIqMSUUy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NBabQN8uFIqMSUUy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NBabQN8uFIqMSUUy .marker.cross{stroke:#333333;}#mermaid-svg-NBabQN8uFIqMSUUy svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NBabQN8uFIqMSUUy .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NBabQN8uFIqMSUUy .cluster-label text{fill:#333;}#mermaid-svg-NBabQN8uFIqMSUUy .cluster-label span{color:#333;}#mermaid-svg-NBabQN8uFIqMSUUy .label text,#mermaid-svg-NBabQN8uFIqMSUUy span{fill:#333;color:#333;}#mermaid-svg-NBabQN8uFIqMSUUy .node rect,#mermaid-svg-NBabQN8uFIqMSUUy .node circle,#mermaid-svg-NBabQN8uFIqMSUUy .node ellipse,#mermaid-svg-NBabQN8uFIqMSUUy .node polygon,#mermaid-svg-NBabQN8uFIqMSUUy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NBabQN8uFIqMSUUy .node .label{text-align:center;}#mermaid-svg-NBabQN8uFIqMSUUy .node.clickable{cursor:pointer;}#mermaid-svg-NBabQN8uFIqMSUUy .arrowheadPath{fill:#333333;}#mermaid-svg-NBabQN8uFIqMSUUy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NBabQN8uFIqMSUUy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NBabQN8uFIqMSUUy .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-NBabQN8uFIqMSUUy .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-NBabQN8uFIqMSUUy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NBabQN8uFIqMSUUy .cluster text{fill:#333;}#mermaid-svg-NBabQN8uFIqMSUUy .cluster span{color:#333;}#mermaid-svg-NBabQN8uFIqMSUUy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NBabQN8uFIqMSUUy :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 心跳检测 心跳检测 心跳检测 负载均衡 Server A Server B Server C Redis Sentinel

4. 智能熔断机制

# 当系统负载>5时自动拒绝新请求import psutilfrom flask import Flask, abortapp = Flask(__name__)@app.before_requestdef check_load(): if psutil.getloadavg()[0] > 5.0: abort(503, \"Server overload, please retry later\")

七、预防性监控体系搭建

Prometheus核心监控项

# prometheus.ymlscrape_configs: - job_name: \'node\' static_configs: - targets: [\'localhost:9100\'] # 关键告警规则 alerting_rules: - alert: ZombieProcesses expr: sum(count_over_time({__name__=~\"processes.*\"}[5m])) by (state) > 100 for: 10m - alert: PIDExhaustion expr: node_processes_max - node_processes_count < 100

Grafana看板关键面板

  1. 进程状态热力图(运行/僵尸/睡眠)
  2. PID分配速率曲线
  3. 系统调用错误率
  4. 资源等待队列长度

八、总结与思考

本次宕机时间线

时间轴 事件 响应动作 03:15 监控告警 启动应急预案 03:22 IPMI强制重启 进入救援模式 03:40 定位僵尸进程累积 清理+临时限制进程数 04:15 服务恢复 流量灰度导入 06:00 防御代码上线 监控体系增强

经验总结

  1. 监控盲区:传统监控未覆盖PID资源池水位
  2. 技术债代价:未回收子进程的代码缺陷引发雪崩
  3. 恢复效率:IPMI和救援模式节省90%恢复时间

💡 终极建议

  • 每月进行Chaos Engineering故障注入测试
  • 核心服务实现无状态化设计
  • 建立黄金指标告警体系(时延、流量、错误、饱和度)

附录

  • Linux进程管理权威指南
  • 本文工具集:https://github.com/yourname/ubuntu-crisis-kit
  • 推荐阅读:《Site Reliability Engineering》