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