温馨提示×

centos swap为何占用高

小樊
48
2026-09-08 19:41:53
栏目: 智能运维

在 CentOS(以及大多数 Linux 发行版)中,swap 占用高通常不是“内存马上不够用”的唯一信号,而是和 Linux 的内存管理策略有关。下面按常见原因 → 排查方法 → 解决思路来说明。


一、为什么 CentOS 的 swap 占用会很高

1. swappiness 设置偏高(最常见)

Linux 有一个参数 swappiness,决定系统“多积极”地把内存页换出到 swap。

  • 默认值一般是 30(CentOS 7/8)
  • 值越大 → 越容易用 swap
  • 即使内存还有剩余,也可能 swap

查看:

cat /proc/sys/vm/swappiness

2. 曾经内存紧张,swap 后被“粘住”

即使后来:

  • 内存释放了
  • 负载降下来了

已经换出到 swap 的数据不会自动换回内存,除非再次被访问。

结果就是:

  • 内存空闲很多
  • swap 仍然占用高

3. 某些进程常驻且很少被访问

例如:

  • 后台服务(数据库、日志采集)
  • 长时间运行但低频访问的进程

这些内存页容易被换出。


4. 内存泄漏 / 异常进程

某些进程:

  • 慢慢吃内存
  • 触发 swap
  • 即使杀掉,swap 也不会立刻释放

5. swap 本身不会“自动收缩”

  • swap 是文件或分区
  • 使用量只增不减(除非 swapoff)
  • 不像内存可以随便回收

二、如何排查 swap 被谁占用

1. 看内存和 swap 概况

free -h

关注:

  • Mem 是否还有可用
  • Swap 用了多少

2. 找出使用 swap 的进程

for file in /proc/*/status; do
  awk '/VmSwap|Name/{printf "%s %s\n", $1, $2}' "$file"
done | sort -k2 -h | tail

或(CentOS 8+):

smem -s swap -r | head

3. 看是否是 swappiness 问题

sysctl vm.swappiness

三、解决 / 优化方案

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

sysctl vm.swappiness=10

永久生效:

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

服务器一般建议 10,数据库场景甚至 1


✅ 方案 2:手动释放 swap(不影响业务)

⚠️ 前提:内存足够

swapoff -a
swapon -a

这会:

  • 把 swap 内容换回内存
  • 清空 swap 使用

✅ 方案 3:限制或重启异常进程

如果某些服务:

  • swap 占用异常高
  • 内存增长异常

考虑:

  • 重启服务
  • 调整 JVM / 数据库内存参数

✅ 方案 4:增加物理内存(根本解决)

如果:

  • swap 长期高
  • 内存经常吃满

那说明:

swap 高只是“症状”,内存不足才是“病根”


四、什么时候 swap 高是正常的?

✅ 以下情况不用慌

  • 内存空闲但 swap 有占用
  • 系统负载低
  • swappiness 偏高

❌ 需要关注:

  • swap 持续增长
  • 伴随 IO 升高
  • 系统变卡

五、一句话总结

CentOS swap 占用高,不一定是内存不够,更多时候是:

  • swappiness 设置高
  • 历史换出未换回
  • 某些进程低频占用

如果你愿意,可以贴一下:

free -h
swapon -s
cat /proc/sys/vm/swappiness

我可以帮你具体判断是哪种情况。

0