我目前正在使用docker的Kubernetes
集群上工作。
该集群允许我启动作业。对于每个作业,我都指定一个内存请求和一个内存限制。
创建容器时,Kubernetes
将使用内存限制来填充--memory
命令的docker run
选项。如果此容器超过此限制,它将因OOM原因而被杀死。
现在,如果我进入一个容器,我会惊讶地发现可用的系统内存不是来自--memory
选项的那个,而是来自docker计算机的那个。 (Kubernetes节点)
我很惊讶,因为关于可用资源的信息有误的系统将无法正常运行。
例如,IO操作使用的内存缓存。如果在磁盘上写入,则页面将在写入之前缓存在RAM中。为此,系统将评估使用sysctl vm.dirty_ratio
(默认为20%)可以缓存多少页以及系统的内存大小。但是,如果容器系统的内存大小错误,这将如何工作。
我已验证:
我在一个限制为10Gi的RAM的容器上和一个180Gi的节点上运行了具有很多IO操作(os.write,解压缩等)的程序。该容器将被杀死,因为它将达到10Gi内存限制。此OOM是由dirty_ratio
*系统内存的错误评估引起的。
这太可怕了。
所以,我的问题是:
是否可以使用Docker容器限制来设置Docker容器系统的可用资源?