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://www.fwqtg.net