Linux上swap内存对应一块磁盘分区,当内存紧张时,可以把内存中的数据写入到swap分区;当需要读写这部分数据时,又可以将其从swap分区读入内存。
一.容器swap内存的弊端
容器使用swap内存,会导致Memory CGroup对容器内存的限制失效。
比如,在一个开启swap的节点上,启动一个容器:
- 容器的Memory Cgroup限制=100MB;
- 容器中的进程持续申请内存,共申请1GB内存;
容器的内存虽然限制在100MB,但是由于使用了swap,导致容器申请1GB内存成功(使用swap换入换出),也不会被OOM Kill。
也就是说,在使用Swap的场景下,Memory CGroup对容器的内存限制limit就失效了。
二.容器关闭swap分区(推荐)
启动容器时,增加启动参数--memory-swappiness=0,即可禁止容器使用swap;
--memory-swappiness details
A value of 0 turns off anonymous page swapping.
A value of 100 sets all anonymous pages as swappable.
By default, if you do not set --memory-swappiness, the value is inherited from the host machine.
同时,配置 --memory的值 与 --memory-swap的值 相等,也可以阻止容器使用swap:
Prevent a container from using swap
If --memory and --memory-swap are set to the same value, this prevents containers from using any swap.
This is because --memory-swap is the amount of combined memory and swap that can be used, while --memory is only the amount of physical memory that can be used.
三.容器使用swap分区
某些程序,可能需要使用Swap空间,才能防止因为偶尔的内存突然增加,而被OOM Kill杀死。
那么,容器进程的内存有哪些组成部分,在内存紧张时,优先选择哪部分写入swap分区呢?
1. 容器进程内存
容器进程内存主要有2部分:
RSS: Resident Set Size
- RSS中的内存,主要是malloc()申请得到的内存,也称为匿名内存(Anonymous memory);
- 当Swap开启后,在内存紧张时,可以将RSS的内存写入swap空间;
Page Cache:
- 在有磁盘文件访问的时候,Linux会尽量把系统的空闲内存用作Page Cache来提供文件的读写性能;
- 一旦内存不够,就会产生内存回收,回收Page Cache;
那么,当内存紧张时,Linux系统是如何选择 释放Page Cahce 还是 将匿名内存写入Swap ?
这由容器的swappiness参数决定。
2. 容器的swappiness参数
Memory CGroup下,每个容器都有memory.swappiness参数:
# cat memory.swappiness
60
该参数的值,决定了释放Page Cahce、将匿名内存写入Swap的优先级:
默认=60:
- 优先选择 释放Page Cahce;
当swappiness=100时:
- 释放Page Cahce 和 将匿名内存写入Swap 有相同的优先级,等比例释放;
当swappiness=0时:
- 禁止使用swap;
参考
1.docker swap参数:https://docs.docker.com/config/containers/resource_constraint...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。