文章内容

2025/11/12 20:11:59,作 者: 黄兵

Ubuntu 24.04 服务器 CPU 占用 100% 故障排查与修复流程

当服务器出现 CPU 占用 100% 的情况时,可按以下步骤快速定位并处理。

✅ 一、快速定位高 CPU 占用进程

1️⃣ 使用 top

top

进入后:

  • 默认按 CPU 占用率 排序

  • 关注 %CPU 一列

  • P 可重新按 CPU 占用排序

  • q 退出

重点关注:

PID(进程号)USER(用户)%CPUCOMMAND(命令名)

✅ 二、发现 kswapd0 占用大量 CPU

如果在 top 中看到 kswapd0 占用很高的 CPU,说明这是 内核级的内存交换问题

🧠 三、kswapd0 是什么?

kswapd0 是 Linux 内核的 页面交换守护进程(Kernel Swap Daemon),负责:

当系统内存不足时,把一部分内存页从 RAM 交换(swap)到磁盘,以释放内存。

它属于内核线程(非用户进程),PID 通常较小,例如:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 51 root      20   0       0      0      0 R  95.0   0.0   1:34.21 kswapd0

⚠️ 四、当 kswapd0 占用高 CPU 的含义

kswapd0 高 CPU 不是问题本身,而是系统内存紧张的表现。
它表示系统在不停地尝试回收页面(page reclaim)。

原因说明
🧩 可用内存太少系统物理内存不足,内核不停回收页面
🧨 程序内存泄漏某进程不断吃内存,导致频繁换页
🧱 没有启用 swap内存耗尽后没有可用交换空间
🐌 I/O 或 cache 异常文件缓存占满或磁盘 I/O 太慢

🔍 五、诊断步骤

1️⃣ 查看总体内存使用情况

free -h

重点关注:

  • Mem: 行的 available(可用内存)

  • Swap: 行的 used(已用交换空间)

示例结果:

               total        used        free      shared  buff/cache   available
Mem:           1.9Gi       1.8Gi        52Mi        16Mi        45Mi        52Mi
Swap:             0B          0B          0B
项目 说明
物理内存总量 1.9 GiB VPS 内存总共只有 2 GB
已用内存 1.8 GiB 几乎全部被占用
可用内存 52 MiB 极度紧张(随时触发内核回收)
Swap 0 B 未配置交换空间

🧩 六、问题结论

系统内存完全耗尽且 未启用 swap,内核反复尝试回收页面(page reclaim),形成“假交换循环”,导致 kswapd0 长时间占用高 CPU。

不是 kswapd0 出错,而是系统在拼命回收内存。

💡 七、解决方案(立刻可执行)

✅ 1️⃣ 添加 2 ~ 4 GB 的 Swap(推荐 4 GB)

sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

验证是否启用:

swapon --show

示例输出:

NAME      TYPE  SIZE  USED PRIO
/swapfile file  4G    0B   -2

✅ 2️⃣ 让 Swap 永久生效

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

✅ 3️⃣ 降低内核换页倾向(减少频繁 Swap)

sudo sysctl vm.swappiness=10
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

✅ 4️⃣ 释放缓存(可选)

若内存极度紧张,可手动释放文件缓存:

sudo sync
sudo sysctl -w vm.drop_caches=3

✅ 5️⃣ 重启占用内存过高的进程

找到占用最高的进程(例如 /usr/local/process/process server):

sudo systemctl restart process

✅ 6️⃣ 确认修复结果

再次查看:

free -h

期望结果:

               total        used        free      shared  buff/cache   available
Mem:           1.9Gi       1.2Gi       600Mi        20Mi       100Mi       650Mi
Swap:          4.0Gi          0B        4.0Gi

此时 kswapd0 的 CPU 占用应明显下降。

📋 八、后续优化建议

  • 对于 2GB 内存的 VPS,建议始终配置至少 2GB swap

  • 定期监控内存使用情况:

ps -eo pid,cmd,%mem,%cpu --sort=-%mem | head -n 5

若持续出现该问题,考虑:

  • 升级实例内存;

  • 优化或替换内存占用较高的程序。

✅ 九、完整处理流程总结(快速参考)

  1. 执行 top → 找出占用 CPU 最高的进程

  2. 若发现 kswapd0 高占用 → 判断内存不足问题

  3. 执行 free -h → 检查内存与 swap 状态

  4. 无 swap 时立即创建fallocate -l 4G /swapfile

  5. 永久写入 /etc/fstab

  6. 调整 vm.swappiness=10

  7. 必要时释放缓存与重启服务

  8. 确认问题解决kswapd0 占用恢复正常


其它相关推荐:

1、Ubuntu 24.04 CPU 占用 100% 的诊断与解决方法

2、2019年4月13日DDOS攻击细节

3、该发生的事情始终会发生

4、Zabbix CPU utilization监控参数

5、关于最近服务不稳定的说明

分享到:

发表评论

评论列表