温馨提示×

centos swap为何占满

小樊
38
2026-09-14 21:35:52
栏目: 智能运维

在 CentOS(及其他 Linux 发行版)中,swap 被占满通常不是“故障”,而是系统内存管理的一种表现。下面从常见原因 → 排查方法 → 解决建议给你系统讲一下。


一、CentOS swap 占满的常见原因

1️⃣ 物理内存不足(最常见)

RAM 不够用时,内核会把不常用的内存页换出到 swap。

典型场景:

  • 运行了 Java / MySQL / Elasticsearch 等吃内存服务
  • 并发请求突然增多
  • 系统内存配置偏小(如 2G / 4G)

✅ 表现:

free -h
top

看到:

  • Mem 几乎用满
  • Swap 使用率持续上升

2️⃣ swappiness 设置偏高

CentOS 默认:

cat /proc/sys/vm/swappiness
# 通常是 30

值越大,越“积极”使用 swap。

即使内存还有空闲,也可能写入 swap。


3️⃣ 长时间运行,内存未释放

  • 某些服务(如 JVM)会长期占用内存
  • 即使负载下降,swap 也不会自动回收
  • 只有进程退出或主动释放才会减少

4️⃣ 内存泄漏(程序 bug)

某些程序:

  • 不断申请内存但不释放
  • 最终逼系统使用 swap

常见于:

  • 自研服务
  • 老版本中间件

5️⃣ 系统曾经内存爆满(历史遗留)

即使现在内存空闲:

  • swap 里仍有“旧数据”
  • 不会立即换回内存

6️⃣ 使用了 zram / swapfile 配置异常

  • 错误的 swap 文件大小
  • 多个 swap 叠加
  • 容器 / 虚拟化环境配置问题

二、如何快速排查

✅ 1. 看内存 & swap 状态

free -h
swapon -s

✅ 2. 看是谁在用内存

top
# 按 M 排序

或:

ps aux --sort=-%mem | head

✅ 3. 看 swap 使用详情(高级)

smem -s swap -r | head

(需安装 smem


✅ 4. 查看 swappiness

cat /proc/sys/vm/swappiness

三、解决 & 优化建议

✅ 方案 1:临时释放 swap(不重启)

⚠️ 有风险,生产环境谨慎

swapoff -a
swapon -a

会先把 swap 数据换回内存,内存不足会卡死


✅ 方案 2:降低 swappiness(推荐)

sysctl vm.swappiness=10

永久生效:

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

✅ 方案 3:增加内存 or swap

  • 加物理内存(最稳妥)
  • 或增加 swap:
dd if=/dev/zero of=/swapfile bs=1G count=4
mkswap /swapfile
swapon /swapfile

✅ 方案 4:限制服务内存

如:

  • JVM:-Xmx
  • MySQL:innodb_buffer_pool_size
  • Docker:-m

✅ 方案 5:重启相关服务

如果是某个服务导致:

systemctl restart xxx

四、什么时候“swap 占满”是危险的?

⚠️ 危险信号:

  • swap 占满 + 系统卡顿
  • 磁盘 IO 很高
  • OOM Killer 出现(dmesg | grep oom

✅ 正常情况:

  • swap 占用但系统流畅
  • 内存仍有空闲

五、总结一句话

CentOS swap 占满,本质原因几乎都是:内存不够 or 使用策略偏激进。

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

  • free -h
  • top / htop 截图
  • 服务器用途(Web / DB / 容器)
  • 内存大小

0