温馨提示×

CentOS Swap满了该如何处理

小樊
64
2026-07-19 09:19:28
栏目: 智能运维

当 CentOS 系统的 Swap 被占满 时,通常意味着物理内存(RAM)不足,系统开始频繁使用磁盘上的交换空间,这会导致系统性能下降,甚至卡死。

处理 Swap 满的问题,需要分 临时应急根本解决 两种情况来处理。


一、先查看当前状态

1. 查看 Swap 使用情况

free -h

swapon -s

2. 查看内存和 Swap 使用情况

top

htop   # 如果没有安装:yum install htop -y

3. 查看哪些进程占用内存最多

ps aux --sort=-%mem | head

二、临时应急方案(快速释放 Swap)

✅ 方法 1:关闭并重新开启 Swap(推荐)

⚠️ 前提:物理内存足够剩余,否则会 OOM

swapoff -a
swapon -a

如果提示无法关闭(内存不足):

swapoff: /dev/sda2: swapoff failed: Cannot allocate memory

说明 物理内存也快满了,不能这样操作。


✅ 方法 2:清理缓存(释放部分内存)

sync
echo 3 > /proc/sys/vm/drop_caches

仅释放 page cache、dentries、inodes,不影响运行中的程序。


✅ 方法 3:重启占用内存最多的进程

例如 MySQL / Java / Docker:

systemctl restart mysql

三、根本解决方案(推荐)

✅ 1. 增加物理内存(RAM)

这是最根本的方法。


✅ 2. 增加 Swap 空间(临时缓解)

创建 Swap 文件(例如 4G)

dd if=/dev/zero of=/swapfile bs=1M count=4096
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

设置开机自动挂载

echo '/swapfile swap swap defaults 0 0' >> /etc/fstab

✅ 3. 优化应用内存使用

常见原因:

  • Java 应用 -Xmx 设置过大
  • MySQL innodb_buffer_pool_size 过大
  • Docker 容器无内存限制

示例(Docker):

docker run -m 512m --memory-swap=1g ...

✅ 4. 调整 Swap 使用倾向(减少 Swap 使用)

echo 10 > /proc/sys/vm/swappiness

永久生效:

echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p

默认是 30~60,数值越小越优先使用物理内存。


四、常见场景总结

场景 建议
Swap 满但内存还有 swapoff -a && swapon -a
内存 + Swap 都满 杀进程 / 扩容
临时云服务器 增加 Swap
数据库服务器 减少缓存参数
Java 应用 降低 -Xmx

五、⚠️ 注意事项

  • Swap 满 不等于异常,但长期满说明系统不健康
  • 频繁 Swap 会导致 磁盘 IO 飙升
  • 生产环境建议 监控内存 + Swap(Zabbix / Prometheus)

如果你愿意,可以把以下信息发我,我可以精准判断原因

  • free -h 输出
  • top 前几行
  • 服务器用途(Web / DB / Docker)
  • CentOS 版本(6 / 7 / 8)

我可以帮你给出最优配置方案

0