温馨提示×

centos swapper为什么会满

小樊
45
2026-09-30 07:27:27
栏目: 智能运维

在 CentOS(以及其它 Linux 发行版)里,swapper / swap 空间“满”通常不是指某个叫 swapper 的进程占满了,而是swap 分区(或 swap 文件)被用满了。下面分几方面说清楚原因和排查方法。


一、先澄清:swapper 是什么

  • swapper 是内核里负责**交换内存(swap)**的机制(早期叫 swapper 进程,现在基本是内核线程)。
  • 你看到的“swapper 满”,实际是:
    • swap used = 100%
    • 或 free -h 里 Swap 的 used 很大,available 很小

二、CentOS swap 被用满的常见原因

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

当 RAM 不够用时,内核会把不活跃的内存页换到 swap。

表现:

free -h
  • Mem 的 available 很小
  • Swap 的 used 很大

常见于:

  • Java / MySQL / Redis 等占用大内存的服务
  • 并发突然升高
  • 服务器配置偏低

2️⃣ swappiness 设置偏高

CentOS 默认:

cat /proc/sys/vm/swappiness
  • 默认一般是 30(CentOS 7/8)
  • 值越大,越“愿意”用 swap

如果设成 60~100,即使内存还有,也可能用 swap。


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

某些进程:

  • 不断申请内存不释放
  • 长期运行后把 RAM + swap 吃满

排查:

top
# 或
ps aux --sort=-%mem

4️⃣ 长时间运行未重启

  • swap 一旦写入,不会自动回收
  • 即使后来内存空闲,swap 仍显示 used

这是正常现象,不代表现在有问题。


5️⃣ 数据库 / 缓存服务配置不合理

例如:

  • MySQL innodb_buffer_pool_size 太大
  • Elasticsearch heap 设置过高
  • Docker 容器没限制内存

6️⃣ 系统使用了 zram / swapfile 但空间小

  • 小云服务器常见
  • 1~2G swap,很容易满

三、如何确认 swap 被谁用

1️⃣ 看整体

free -h
swapon -s

2️⃣ 看哪些进程在用 swap

for pid in $(ls /proc | grep '^[0-9]'); do
  if [ -f /proc/$pid/status ]; then
    swap=$(awk '/VmSwap/{print $2}' /proc/$pid/status)
    if [ "$swap" != "" ] && [ "$swap" -gt 0 ]; then
      name=$(awk '/Name/{print $2}' /proc/$pid/status)
      echo "$pid $name $swap KB"
    fi
  fi
done | sort -k3 -n -r

四、swap 满了会有什么影响

  • 系统变卡(磁盘 IO 慢)
  • OOM Killer 可能杀进程
  • 服务响应延迟明显

五、解决和缓解方法

✅ 临时释放 swap(不重启)

swapoff -a
swapon -a

⚠️ 前提:RAM 足够,否则会 OOM


✅ 调整 swappiness

sysctl vm.swappiness=10
# 永久
echo "vm.swappiness=10" >> /etc/sysctl.conf

✅ 加内存 / 加 swap

# 增加 swap 文件示例
dd if=/dev/zero of=/swapfile bs=1G count=4
mkswap /swapfile
swapon /swapfile

✅ 限制服务内存

  • Docker:--memory
  • systemd:MemoryMax=

六、一句话总结

CentOS 的 “swapper 满” 本质是 swap 被用满,绝大多数情况是 内存不够 + swappiness 偏高 + 长期运行不释放 导致。

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

  • free -h
  • swapon -s
  • top 前几行

我可以帮你精确判断是哪一类问题。

0 踩