1. 问题现象与初步诊断
上周五凌晨3点,监控系统突然报警提示生产环境服务器负载飙升到26+,IO等待高达94.7%。通过SSH连上这台阿里云Ubuntu 20.04服务器后,首先用三板斧命令快速抓取系统状态:
bash复制# 实时系统负载监控
top -d 1
# 内存使用情况
free -h
# 综合性能指标
vmstat 1
从top输出中发现了几个关键线索:
- 系统负载平均值(load average)高达26.14,远超CPU核心数(2核)
- CPU使用率中wa(I/O等待)占比94.7%,说明系统卡在磁盘I/O上
- 内存几乎耗尽(407MB总内存中已用350MB)
- 可疑进程apt-check占用7.3%内存和3.9%CPU
vmstat的输出更触目惊心:
- bi(块设备读取)指标持续在140-150MB/s波动
- CPU空闲(id)时间始终为0%,完全被I/O等待(wa)占满
经验提示:当wa持续>30%就说明存在严重I/O瓶颈,而这里94.7%已经是灾难级别
2. 深度排查与根因定位
2.1 进程级I/O分析
使用pidstat定位具体I/O来源:
bash复制pidstat -d 1
输出显示apt-check进程的kB_rd/s(读取速率)高达84MB/s,是其他进程总和的5倍多。结合进程名判断,这是Ubuntu的自动更新检查服务。
2.2 系统服务检查
排查相关服务状态:
bash复制systemctl list-timers --all
发现两个关键定时器在运行:
- apt-daily.timer:每天触发apt更新
- apt-daily-upgrade.timer:每天触发自动升级
查看服务日志确认:
bash复制journalctl -u apt-daily.service -n 50
日志显示服务正在执行"apt-get update"和"apt-get upgrade"操作。
2.3 资源瓶颈验证
通过free命令发现内存仅剩6.4MB,导致系统频繁触发kswapd内存回收:
bash复制 total used free shared buff/cache available
Mem: 407Mi 350Mi 6.4Mi 2.5Mi 72Mi 56Mi
Swap: 4.0Gi 0B 4.0Gi
这正是I/O雪崩的根源——内存不足引发大量磁盘交换,而apt-check又在疯狂读取软件包索引,形成死亡螺旋。
3. 解决方案与实施步骤
3.1 紧急止血措施
- 立即停止定时器服务:
bash复制systemctl stop apt-daily.timer
systemctl stop apt-daily-upgrade.timer
- 终止正在运行的apt进程:
bash复制kill -9 $(pgrep apt-check)
- 关闭无人值守升级:
bash复制systemctl stop unattended-upgrades
3.2 永久配置修改
- 禁用自动更新配置:
bash复制vim /etc/apt/apt.conf.d/20auto-upgrades
修改为:
code复制APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
- 禁用相关服务开机启动:
bash复制systemctl disable apt-daily.service
systemctl disable apt-daily-upgrade.service
systemctl disable unattended-upgrades
3.3 后续优化建议
- 内存扩容:至少升级到1GB内存,避免频繁swap
- 更新策略调整:
- 改为手动更新:
apt update && apt upgrade -y - 或使用cron在低峰期执行
- 改为手动更新:
- 监控增强:
bash复制# 添加Zabbix监控项 UserParameter=io.wait, top -bn1 | grep "%Cpu(s)" | awk '{print $8}'
4. 避坑指南与经验总结
4.1 典型误判场景
-
误判为阿里云监控导致:
- AliYunDun进程确实有较高CPU(2.3%)
- 但pidstat显示其I/O仅13MB/s,非主因
-
忽视定时服务影响:
- 默认apt-daily.timer在开机后随机延迟触发
- 可能运行几天后才突然出现问题
4.2 关键排查技巧
-
I/O瓶颈快速定位法:
bash复制# 查看await指标(>10ms说明磁盘过载) iostat -x 1 -
内存压力测试法:
bash复制stress-ng --vm 1 --vm-bytes 300M --timeout 60s -
服务依赖分析:
bash复制
systemctl list-dependencies apt-daily.service
4.3 生产环境建议
-
云服务器基线配置:
- Ubuntu 20.04+至少1vCPU/1GB内存
- 避免使用突发性能实例(t系列)
-
更新策略黄金法则:
- 测试环境先验证
- 生产环境错峰执行
- 重要服务配置更新黑名单
-
监控指标必选清单:
- CPU wa% >20%持续5分钟告警
- 内存可用量 <10%告警
- 磁盘await >20ms告警
这次事故让我深刻体会到:看似无害的自动更新,在资源受限环境下可能引发连锁反应。现在我的运维checklist里永远多了这一条——部署完系统第一步,先检查自动更新配置!