温馨提示×

debian swapper为何频繁启动

小樊
42
2026-09-28 13:18:04
栏目: 智能运维

在 Debian(以及大多数 Linux 发行版)中,swapper(swap 机制 / kswapd / swapper 进程)频繁启动或活跃,通常不是“swapper 本身有问题”,而是系统在频繁进行内存回收(swap 或 page reclaim)。可以从下面几个角度理解和排查。


一、什么是“swapper 频繁启动”

你看到的通常是:

  • kswapd0 / kswapd1 CPU 占用高
  • top / htop 里看到 swapper 或 kswapd
  • 系统卡顿、磁盘 IO 高
  • free -h 中 swap 被不断使用

这说明:

系统内存压力较大,内核在频繁把内存页换出到 swap 或回收内存


二、常见原因(重点)

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

  • 内存耗尽
  • 应用内存泄漏
  • 同时运行太多服务(如 MySQL + Java + Docker)

检查:

free -h
top
htop

如果:

Mem: used ≈ total
Swap: used 不断增长

那就是内存不够。


2️⃣ swappiness 设置偏高

Debian 默认:

cat /proc/sys/vm/swappiness
# 通常 60

含义:

  • 值越大 → 越倾向使用 swap
  • 值越小 → 越倾向保留内存

如果内存并不少,但 swap 仍频繁:

sysctl vm.swappiness

可临时降低:

sudo sysctl vm.swappiness=10

永久生效:

echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf

3️⃣ 内存碎片化严重

即使总内存够,但:

  • 缺少连续大页
  • 内核无法分配

表现:

  • kswapd 高
  • 但 swap 用得不多

检查:

cat /proc/buddyinfo

4️⃣ 某些程序“唤醒” swap

常见嫌疑:

  • Java(JVM)
  • PostgreSQL / MySQL
  • Docker 容器
  • 日志服务(rsyslog、journald)

查看谁在用 swap:

for pid in $(ls /proc | grep '^[0-9]'); do
  awk -v p=$pid '/VmSwap/{print p, $2}' /proc/$pid/status
done | sort -k2 -n

5️⃣ 磁盘 IO 慢导致“看起来频繁”

  • 使用机械硬盘
  • swap 在慢磁盘上
  • 云服务器 IO 限制

即使少量 swap,也会:

  • 系统卡顿
  • kswapd 反复唤醒

建议:

  • swap 放 SSD
  • 或减小 swap 使用

三、如何确认是不是“异常”

看 kswapd 是否长期高 CPU

top -p $(pgrep kswapd0)

正常:

  • 偶尔活动

异常:

  • 持续 10%~100% CPU

看内存回收统计

vmstat 1

关注:

  • si / so(swap in/out)
  • free
  • cache

四、解决思路总结

✅ 内存不够 → 加内存 / 限制服务
✅ swappiness 高 → 调低
✅ 服务泄漏 → 重启 / 优化
✅ IO 慢 → 换磁盘 / 减 swap
✅ 容器多 → 限制 memory limit


五、如果你愿意

你可以贴出:

free -h
swapon -s
cat /proc/sys/vm/swappiness
top -b -n1 | head -20

我可以帮你精准判断是哪一种原因。

0 踩