温馨提示×

centos swapper为何频繁使用

小樊
49
2026-09-15 07:14:04
栏目: 智能运维

在 CentOS(以及其它 Linux 发行版)中,swapper(swap 交换分区/交换文件)频繁被使用,通常不是“swapper 本身有问题”,而是系统内存压力或配置导致内核不得不把内存页换出到磁盘。下面从原因、排查和解决办法三个层面说明。


一、swapper 是什么

  • swapper / swap 是 Linux 的虚拟内存机制
  • 当 物理内存(RAM)不足 或 某些内存久未使用 时,内核把内存页写入 swap 空间
  • swap 通常在磁盘上(分区或文件),速度远慢于内存

二、CentOS 中 swap 频繁使用的常见原因

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

  • 应用内存需求 > 实际 RAM
  • 例如:
    • Java / MySQL / Elasticsearch 占用大量内存
    • 多个服务同时运行
  • 表现:
    • free -h 中 available 很小
    • si / so(swap in/out)频繁不为 0
free -h
vmstat 1

2. swappiness 设置偏高

CentOS 默认:

cat /proc/sys/vm/swappiness
# 常见值:30(CentOS 7/8)
  • swappiness 越大,越“愿意”使用 swap
  • 即使内存还有剩余,也可能换出“不活跃”内存

3. 内存泄漏或缓存未释放

  • 某些程序:
    • 内存只增不减
    • 缓存(cache/buffer)占用高但不释放
  • 内核误判需要 swap

4. 服务配置不合理

  • JVM 堆内存设置过大
  • 数据库 innodb_buffer_pool_size 过大
  • 容器(Docker / K8s)未限制内存

5. 系统长期运行,碎片或冷内存多

  • 长时间不重启
  • 一些进程偶发占用内存后进入休眠

三、如何排查 CentOS swap 频繁使用

1. 看内存和 swap 使用情况

free -h
swapon -s

2. 看是谁在用内存

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

3. 看 swap 换入换出频率

vmstat 1

关注:

  • si:从 swap 读入内存
  • so:从内存写入 swap

如果 si/so 长期 > 0,说明在频繁使用 swap

4. 查具体进程用了多少 swap

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

四、解决和优化方案

✅ 1. 增加物理内存(最彻底)

  • 如果是云服务器:升级配置
  • 如果是物理机:加内存条

✅ 2. 降低 swappiness(推荐)

# 临时
sysctl vm.swappiness=10

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

一般服务器建议 10,数据库服务器可设为 1~5


✅ 3. 限制应用内存

  • Java:
-Xms2g -Xmx2g
  • MySQL:
innodb_buffer_pool_size = 2G
  • Docker:
--memory=2g --memory-swap=2g

✅ 4. 清理 cache(谨慎)

sync
echo 3 > /proc/sys/vm/drop_caches

仅用于排查,不建议定期执行


✅ 5. 如果是“误用 swap”

  • 内存充足但仍 swap
  • 降低 swappiness 通常即可解决

五、什么时候 swap 频繁是“正常”的?

  • 系统长时间空闲
  • 某些后台进程极低频使用
  • swap in/out 极少,不影响性能

⚠️ 但如果有:

  • 卡顿
  • 磁盘 IO 高
  • 响应变慢

那就说明 swap 已成为性能瓶颈


六、一句话总结

CentOS swapper 频繁使用,本质原因几乎都是:内存不够或 swappiness 配置不合理。

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

  • free -h
  • vmstat 1
  • top 内存占用

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

0 踩