之前薅羊毛买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的数据,执行命令我都发给他了,结果又过了小半小时,还是没分析出个啥,我怀疑这些运维是外包的。