温馨提示×

CentOS Swap满了怎么清理

小樊
37
2026-07-08 01:36:46
栏目: 智能运维

在 CentOS 中,Swap 被占满通常不是“清理”就能解决,而是要先搞清楚是谁在用、为什么用,再决定处理方式。下面按排查 → 释放 → 优化配置一步步来。


一、先确认 Swap 使用情况

free -h
swapon --show

查看具体 swap 占用:

cat /proc/swaps

二、找出占用 Swap 的进程

⚠️ Swap 不能按“文件”删除,只能从进程层面解决。

方法 1:用 top

top
  • f
  • 勾选 SWAP
  • 按回车
  • 再按 PM 排序

方法 2:直接查进程 swap

for file in /proc/*/status ; do 
  awk '/VmSwap|Name/{printf $2 " " $3}END{print ""}' $file
done | sort -k2 -n -r | head -20

可以看到哪个进程 / 程序用了多少 Swap


三、如何“清理 / 释放” Swap(正确方式)

✅ 方法 1:重启占 Swap 的进程(推荐)

如果某个 Java / MySQL / PHP / Python 进程吃了大量 Swap:

systemctl restart xxx

kill -9 PID

这是最安全、最推荐的方式


✅ 方法 2:强制 swapoff(风险较高)

如果你确认内存足够:

swapoff -a
swapon -a

✅ 作用:

  • 把 swap 数据强制换回内存
  • 然后重新启用 swap

⚠️ 风险:

  • 内存不足会直接 OOM(进程被杀)
  • 线上服务器慎操作

确认内存足够再执行:

free -h

四、为什么 Swap 会被占满?(常见原因)

1️⃣ 内存不足

free -h
  • 如果 Mem available 很小,就会疯狂用 Swap

✅ 解决:

  • 扩容内存
  • 优化程序
  • 限制某些服务内存

2️⃣ Swappiness 设置不合理

查看:

cat /proc/sys/vm/swappiness

默认通常是 3060

临时降低(不立即释放,但能减少未来占用)

sysctl vm.swappiness=10

永久生效

vi /etc/sysctl.conf
vm.swappiness=10
sysctl -p

推荐服务器设置 10–30


3️⃣ 程序内存泄漏

常见:

  • Java 没有限制 -Xmx
  • MySQL innodb_buffer_pool_size 太大
  • PHP-FPM 进程太多

✅ 用 top / htop / ps 查异常进程


五、CentOS 7/8 常见 Swap 场景处理

场景 1:MySQL 把 Swap 吃满

innodb_buffer_pool_size = 60% 内存

场景 2:Java 服务

java -Xms512m -Xmx1024m

六、总结(最重要)

Swap 满了 ≠ 清 Swap,而是:

  1. 找进程
  2. 看是否内存不足
  3. 重启 / 优化 / 扩容

❌ 不建议频繁 swapoff -a
✅ 长期目标是:让内存够用,Swap 只是保险


如果你愿意,可以把下面信息发我,我可以帮你精确判断:

  • free -h
  • top 前 10 行
  • 服务器用途(MySQL / Java / Docker / K8s)

我可以直接告诉你该动哪里、不动哪里

0