温馨提示×

centos swapper为何占用高

小樊
54
2026-09-18 07:38:35
栏目: 智能运维

在 CentOS(以及大多数 Linux 发行版)中,swapper(swap 进程,通常是 PID 0 或 kswapd0)占用高,通常不是“swapper 本身在吃 CPU”,而是系统在频繁进行内存回收 / 交换(swap)操作导致的现象。下面从原因、排查和解决方法三个角度说明。


一、swapper / kswapd0 是什么

  • swapper / kswapd0 是 内核线程
  • 职责:
    • 回收空闲内存
    • 把不常用的内存页换出到 swap 分区
    • 在内存紧张时持续工作

当 物理内存不足 或 内存分配压力大 时,kswapd 会一直运行,表现为 CPU 占用高。


二、常见导致 swapper 占用高的原因

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

  • 可用内存(available)很低
  • 系统开始频繁使用 swap
  • kswapd 不断回收内存

查看:

free -h
top

如果:

  • Mem 几乎用满
  • Swap 使用量持续增长

就说明内存不够。


2️⃣ Swappiness 设置过高

CentOS 默认:

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

如果设置成 60~100,系统会过早使用 swap,即使内存还有。


3️⃣ 内存泄漏 / 某个进程吃内存

  • Java / Python / Docker / 数据库
  • 某进程内存持续增长不释放

查看:

top
ps aux --sort=-%mem

4️⃣ 磁盘 I/O 慢(swap 在慢盘上)

  • swap 在:
    • HDD
    • 云服务器低性能云盘
  • swap 一旦使用,I/O 阻塞 → kswapd 持续忙

5️⃣ 大页内存 / 透明大页问题(数据库常见)

  • MySQL / Oracle / Redis
  • THP 导致内存碎片,kswapd 压力大

6️⃣ ZRAM / 交换文件配置异常(较少见)

  • swap 文件损坏
  • zram 配置不合理

三、如何排查(实战步骤)

1️⃣ 看内存和 swap

free -h
swapon -s

2️⃣ 看是谁在用内存

ps aux --sort=-%mem | head

3️⃣ 看 kswapd 是否在忙

top -p 0
# 或
ps -eo pid,comm,%cpu | grep kswapd

4️⃣ 看内存压力

vmstat 1

关注:

  • si / so(swap in/out)
  • free
  • wa(I/O 等待)

5️⃣ 看内核日志

dmesg | grep -i oom
dmesg | grep -i memory

四、解决办法

✅ 1. 增加物理内存(根本方案)

  • 升级服务器配置
  • 减少并发 / 服务数

✅ 2. 降低 swappiness

# 临时
sysctl vm.swappiness=10

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

✅ 3. 关闭或减小 swap(内存充足时)

swapoff -a

⚠️ 不建议在内存紧张时直接关


✅ 4. 限制进程内存

  • Docker:
--memory=2g
  • Java:
-Xmx

✅ 5. 优化数据库

  • 关闭 THP:
echo never > /sys/kernel/mm/transparent_hugepage/enabled

✅ 6. 使用更快的 swap 设备

  • SSD
  • NVMe
  • zram(内存压缩)

五、一句话总结

CentOS 中 swapper / kswapd 占用高,本质是“内存不够或 swap 使用过度”导致内核疯狂回收内存。

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

  • free -h
  • top 前几行
  • swapon -s
  • 服务器用途(Web / DB / Docker)

0 踩