之前薅羊毛买3年腾讯云的轻量级服务器,2核2G内存的那个,装个mysql和一个只供自己使用的一个程序,系统用的是Rocky,后来一次偶然的机会碰到我的程序无法使用,ssh无法连接,我以为是我程序的问题,就重启完事,没做过多的处理,但是每隔一段时间就会出现一次,我也一直就重启完事,后来实在受不了了。就去腾讯云后台查看监控,缺少那段时间的监控数据,只知道一开始出现磁盘IO突然变大,然后就没监控数据了,重启服务器后,问题解决。给腾讯云发工单让查查啥问题,但是腾讯那面的回复完全没有任何价值。一生气买了又个阿里云的轻量级服务器,也是2核2G内存的小机器。同时给腾讯云的那个机器装了个atop程序做个监控,想查查啥问题。
结果阿里云也有卡的时候,不过阿里云卡的话,他能恢复过来,你能从监控上看到异常,过后ssh能连上。但是腾讯云属于他自己的程序能回收内存,也能缓过劲(从他们的监控上能看到监控数据正常了),但是ssh有很大概率继续没法连接,只能重启。
经过我查看atop记录的时间片的数据,总结下就是这个过程:
| 时间 | 14:49 | 14:50 | 14:51 | 14:52 | 14:53 | 14:54 | 14:55 |
|---|---|---|---|---|---|---|---|
| CPU idle | 198% | 197% | 198% | 133% | 0% | 0% | 0% |
| 负载 avg1 | 0.00 | 0.00 | 0.00 | 11.94 | 36.49 | 50.13 | 52.12 |
| 内存 free | 446.8M | 444.7M | 445.8M | 51.7M | 52.4M | 51.8M | 51.9M |
| cache | 307.7M | 307.9M | 308.0M | 29.9M | 27.8M | 29.8M | 28.6M |
| 磁盘读 MB/s | 0.0 | 0.0 | 0.0 | 82.6 | 224.4 | 129.5 | 130.5 |
| scan/steal | 0/0 | 0/0 | 0/0 | 369万/274万 | 918万/689万 | 585万/398万 | 592万/400万 |
| kswapd0 CPU | 未显示 | 未显示 | 未显示 | 25% | 72% | 74% | 73% |
前置状态(14:49 - 14:51):系统平稳运行
- 系统空闲,CPU idle ~198%,负载几乎为 0。
- 内存 free ~445M,cache ~308M,page scan/steal 均为 0,无内存压力。
- 磁盘几乎无读取,所有进程的 RDDSK 均为 0。
- 此时
dnf进程未出现。
触发瞬间(14:52:19):dnf 启动,内存被瞬间吞噬
dnf突然出现,在短短 1 分钟内:- VGROW(虚拟内存增长)= 876.5MB
- RGROW(物理内存增长)= 745.5MB
- 这一瞬间的内存申请量,相当于系统总内存(1.6G)的 46%。
- 此时系统原来的
free约 445M,加上cache约 308M,可回收内存约 753M。dnf申请 745M,几乎耗尽了所有可回收内存。内核被迫启动紧急回收:cache从 308M 暴跌至 29.9M(被回收了 278M)。free从 445M 降至 51.7M(暴跌 394M)。scan瞬间达到 369 万,steal达到 274 万,kswapd0开始以 25% CPU 运行。
连锁反应(14:53 - 14:55):
- 由于大量进程(mysqld、YDService、goblog 等)的物理内存页被内核回收,当它们再次被调度时,触发海量缺页中断(Major Fault),不得不从磁盘重新读取代码和数据。
- 这导致了几个连锁后果:
- 磁盘读取飙升:从 0 MB/s → 82.6 → 224.4 MB/s。
- CPU 系统态饱和:内核忙于处理 I/O 等待和内存回收,
sys从 1% → 58% → 197%(双核完全占满)。 - 进程状态卡死:大量进程变为
D(不可中断睡眠),等待磁盘 I/O。 - 负载爆炸:
avg1从 0 → 11.94 → 52.12,远超 2 核的处理能力。
我首先查看了dnf自己的日志:
sudo grep -i "2026-08-19 14:5[0-5]" /var/log/dnf.log
没啥数据,然后我就想看一下systemd 定时器状态,查看时器的上次运行时间,如果时间点与故障时间吻合,那就可能是真凶。
sudo systemctl list-timers --all | grep -i dnf
果然有数据,有这样的结果:
Wed 2026-08-19 16:54:30 CST 59min left Wed 2026-08-19 14:51:58 CST 1h 3min
dnf-makecache.timer 的上次运行时间 14:51:58,与在 atop 中看到 dnf 进程出现的时间点 14:52:19 几乎完全吻合。
后面我又分析了几个腾讯云无监控数据的时间片,发生过程都和这个类似,一开始正常,然后dnf进程出现,然后出现磁盘IO飙升,然后系统卡死。整个过程就是:
dnf-makecache.timer 定时触发 → dnf makecache 解析元数据异常消耗内存(745M)→ 物理内存+Cache 被瞬间榨干 → 无 Swap 兜底 → 内核暴力回收 → 系统崩溃。
最简单的方法是直接禁用这个 dnf-makecache.timer
sudo systemctl disable --now dnf-makecache.timer
当然也可以采取为 dnf-makecache.service 添加内存限制或者创建 Swap 文件作为缓冲等方式来解决。
还想多说一点,腾讯云提的工单,你让他分析问题,感觉他们好像不知道分析啥,我吧账号和密码给了腾讯云,然后他们的工程师吭哧吭哧分析了个把小时,愣是啥也没分析出来,没有什么有价值的信息,我后面给他说你看看atop的数据,执行命令我都发给他了,结果又过了小半小时,还是没分析出个啥,我怀疑这些运维是外包的。
💬 评论 0
还没有评论,快来抢沙发吧~