文章内容
2025/11/12 20:11:59,作 者: 黄兵
Ubuntu 24.04 服务器 CPU 占用 100% 故障排查与修复流程
当服务器出现 CPU 占用 100% 的情况时,可按以下步骤快速定位并处理。
✅ 一、快速定位高 CPU 占用进程
1️⃣ 使用 top
top
进入后:
-
默认按 CPU 占用率 排序
-
关注
%CPU一列 -
按
P可重新按 CPU 占用排序 -
按
q退出
重点关注:
PID(进程号)、USER(用户)、%CPU、COMMAND(命令名)
✅ 二、发现 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
若持续出现该问题,考虑:
-
升级实例内存;
-
优化或替换内存占用较高的程序。
✅ 九、完整处理流程总结(快速参考)
-
执行
top→ 找出占用 CPU 最高的进程 -
若发现
kswapd0高占用 → 判断内存不足问题 -
执行
free -h→ 检查内存与 swap 状态 -
无 swap 时立即创建 →
fallocate -l 4G /swapfile -
永久写入
/etc/fstab -
调整
vm.swappiness=10 -
必要时释放缓存与重启服务
-
确认问题解决 →
kswapd0占用恢复正常
其它相关推荐:
评论列表