sysctl 内核参数72 条

vm.swappiness 换页倾向

控制内核把匿名页换出到 swap 的倾向(0-100,默认 60);数据库与延迟敏感服务常降低它减少换出抖动。

swappiness 是什么

vm.swappiness 是一个 0 到 100 的权重,默认 60,用来告诉内核在回收内存时有多倾向于把匿名页(进程堆栈、malloc 出来的内存)换出到 swap,而不是回收页缓存(文件缓存)。值越大越愿意换出匿名页,值越小越倾向于保留进程常驻内存、优先丢弃文件缓存。它不是「是否启用 swap」的开关,而是两类内存回收之间的天平。数据库、缓存代理等对换页延迟敏感的服务常把它降到 1 到 10。

基本信息

参数vm.swappiness(取值 0-100)
默认值60(多数发行版)
作用面匿名页与页缓存的回收权重,全局生效
常用调优数据库、消息队列、缓存代理降到 1~10;桌面与通用服务器保持默认
关闭方式要完全不用 swap 只能 swapoff,把 swappiness 设 0 不等于禁用
观测指标vmstat 的 si/so 列、/proc/vmstat 的 pswpin/pswpout

典型使用场景

  • 数据库服务:避免热数据被换出后再次访问触发磁盘读,造成不可预测的延迟尖刺
  • 缓存类服务(Redis、Memcached):JVM 或堆内存被换出会同时拖慢主线程与后台线程
  • 排查延迟抖动:发现 si/so 长期非零时,先确认是否换页引起,再决定调参或扩容
  • 容器与 zram 场景:内存超卖或有内存压缩设备时,评估换出行为对业务的实际影响
  • 容量规划验证:用 vmstat 与 /proc/vmstat 对比调参前后的换页量,确认改动确有收益

查看与调整

查看与调整
sysctl vm.swappiness                      # 读当前值
sysctl -w vm.swappiness=10                # 临时调整,立即生效
vmstat 1 3                                # 观察 si/so 两列:持续非零说明正在换页
grep -E 'pswpin|pswpout' /proc/vmstat      # 累计换入换出页数,作差看速率
free -h                                   # 同时确认 swap 使用量是否在增长
cat /proc/meminfo | grep -E 'SwapTotal|SwapFree'   # 核对 swap 容量与余量

落盘与回读

落盘与回读
# /etc/sysctl.d/99-vm-tuning.conf
vm.swappiness = 10    # 降低匿名页换出倾向,适合数据库与缓存服务

换页指标读法

指标含义正常与异常
vmstat si每秒从 swap 换入的内存(KB)长期非零说明内存不足,调 swappiness 治不了根
vmstat so每秒换出到 swap 的量突发少量正常,持续增长要先查内存水位
pswpin累计换入页数需两点作差换算成速率,单次读取没有意义
SwapFreeswap 剩余容量持续下降到接近零说明 swap 也被用满,已接近 OOM
设成 0 的语义是「在空闲内存与文件页还高于水位时尽量不换出匿名页」,不是彻底禁用换页;真正完全不使用 swap 需要 swapoff,而这一步在内存不足的机器上会让 OOM 更早发生,必须确认物理内存足够。
调低 swappiness 不能弥补内存不足。当 si/so 持续非零、swap 余量持续下降时,正确的动作是扩容内存、限制缓存占用或收紧密集型任务的超卖,而不是继续压参数。
注意虚拟化层级:云主机上应用看到的 /proc 与 swap 用量属于该实例,而宿主机的换页行为不可见;容器场景下 cgroup v2 还可用 memory.swap.max 在容器粒度上限制可换出的量,与全局 swappiness 是两套控制手段。
内存远大于工作集时下调 swappiness 的收益往往看不出来,因为内核本来就不会主动换出热点页。是否值得调优应当由 si/so 速率、swap 使用量与业务延迟数据决定,不要直接把别人的参数表搬过来。

易错点

  • 把 swappiness 设 0 当成关闭 swap:换页压力大时仍会换出,需要的是 swapoff 或扩容内存
  • 只调参数不看指标:si/so 依旧持续非零说明内存缺口没解决,参数改动带来的是错觉
  • 数据库强行 swapoff 却不核对余量:内存不足时 OOM killer 会更早介入,反而放大了故障
  • 在虚拟机里按宿主机经验调参:宿主的换页与气球驱动行为会叠加影响,实例内看到的指标不完整
  • 改完不落盘:重启后回到默认值,换页抖动在同一天里反复出现又找不到原因
  • 在容器里按宿主的经验设定该值:换页主体可能不在当前实例,先确认究竟是谁在换页再评估收益

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/vm.rst
  • Linux 内核 Documentation/admin-guide/mm/
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌