服务公告

服务公告 > 常见问题 > 内存充足仍触发 swap:参数与透明大页

内存充足仍触发 swap:参数与透明大页

发布时间:2026-02-18 18:15
## 概念 可用内存还有不少,换页却在持续发生,这是让很多运维困惑的现象。内存看起来够用只是总量视角,内核的分配粒度与回收倾向决定了另一套事实:大页机制让内存的分配单位变大,碎片让连续大页难以满足,回收倾向参数决定了内核愿意多早开始换页。三件事叠在一起,就出现了总量充足而换页不停的矛盾表现。 ## 原理:两个推手 透明大页把小页合并成大页以提升性能,数据库类应用申请内存时按大页粒度拿取。物理内存被长时间运行切碎后,空闲总量虽然够,拼不出连续的大页区域,内核被迫回收或换出部分页来腾连续空间,换页因此发生,这也解释了为什么重启机器后这类换页往往消失一段时间、运行数周后又回来:碎片是随运行积累的。另一个推手是回收倾向参数,它规定内核牺牲交换还是牺牲缓存:倾向值设得偏向交换,内核早早就把不活跃页挪出去,哪怕缓存还很充裕。数据库社区的普遍建议是关闭透明大页,原因就在这里。 ## 最小实操 查看当前状态与倾向值。 ``` cat /sys/kernel/mm/transparent_hugepage/enabled cat /proc/sys/vm/swappiness ``` 数据库类负载的常见调整。 ``` echo never > /sys/kernel/mm/transparent_hugepage/enabled sysctl vm.swappiness=10 ``` ## 常见错误 一是把这类换页当成内存不足盲目扩容,扩了照样换,钱花了病没好;二是调整后不做持久化,重启后参数回到默认,问题周期性回归,表现为每隔一阵就要手动再调一次;三是关闭透明大页一刀切用在所有负载上,某些连续大块访问的应用反而受益于大页,按负载类型分别对待才对。调整后观察换页速率曲线,回落到零星水平即达标。顺云云服务器上跑数据库实例时,这两项参数的调整做进初始化脚本,环境一致性问题就少一个来源。