交换倾向参数是什么
控制容器匿名页换出的倾向,取值从零到一百,越低越少使用交换空间。在较新的统一 cgroup 层级环境下该参数不生效,内存策略仍需以内存限额与宿主交换配置为主。
基本信息
| 语法 | --memory-swappiness=<0-100> |
|---|---|
| 含义 | 匿名页换出倾向,越低越少换出 |
| 读取 | inspect 里的对应字段,特殊值表示未设置 |
| 环境限制 | 统一 cgroup 层级下不生效 |
| 关联参数 | 内存限额与交换总量 |
典型使用场景
- 延迟敏感服务减少换出以避免抖动
- 排查参数写了却没有效果的情况
- 核对容器实际生效的倾向值
- 评估宿主交换策略与容器参数的组合行为
- 容量规划时确认内存与交换的口径
设置与核对
设置与核对
docker run -d --memory=1g --memory-swappiness=10 --name cache redis:7-alpine
docker inspect -f '{{.HostConfig.MemorySwappiness}}' cache # 核对生效值
docker info -f 'CgroupVersion={{.CgroupVersion}}' # 先确认 cgroup 版本取值与适用场景
| 取值 | 含义 | 适用场景 |
|---|---|---|
| 取零 | 尽量不使用交换 | 延迟极敏感的服务 |
| 较低值 | 少换出 | 在线服务 |
| 较高值 | 多换出 | 空闲优先的批处理 |
| 未设置 | 使用系统默认 | 无特殊要求 |
对延迟敏感的服务通常倾向于少换出;但要不要用交换首先取决于宿主策略与内存容量规划。
在统一 cgroup 层级下没有对应开关,写了也不会按预期生效,先确认 cgroup 版本。
交换总量还受交换上限参数与宿主系统级配置影响,只改这一项以为万事大吉是常见误判。
核对生效值时注意特殊取值代表未设置,这说明参数并没有真正写入。
同一宿主上不同容器可以有不同的倾向设置,但整体交换行为仍由宿主策略兜底。
内存压力大的场景下,减少换出会更容易触发内存不足终止,两种风险要权衡。
宿主没有配置交换空间时,倾向参数本身没有实际作用,排查这类问题要先确认宿主是否存在交换分区或交换文件。