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...


a朋
63 声望38 粉丝