memory cgroup是cgroup的资源限制功能之一,可以控制特定进程可以使用的内存量。
memory cgroup
memory cgroup是cgroup(参考hack #7)之一,用来控制进程所使用的内存(lru管理的缓存)数量。
其用法有很多种,例如,可以用来避免因一时处理较大文件或大量文件,而导致无用的页面缓存增大,内存资源紧张的情况。另外,还可以在多用户环境中限制各用户可以使用的内存量。
用法
memory cgroup是cgroup的一种,因此使用前必须挂载cgroup文件系统。启用memory cgroup时,可以为挂载命令指定memory选项,也可以不指定选项以启用cgroup的所有功能。
本节使用下列方式挂载到/cgroup。
挂载cgroup后,通过在/cgroup下创建新目录来创建新的分组。memory cgroup可以通过对该目录下的文件设置参数,来控制内存使用量。
另外,能否通过cgroup文件系统控制以及特殊文件的种类多少,会根据内核版本和内核config的不同有所差异。
cgroup文件系统中关于memory cgroup配置的主要特殊文件如表2-3所示。
表2-3 关于memory cgroup的主要文件
限制内存使用量
内存使用量可以使用memory.limit_in_bytes进行限制。这里创建一个名称为groupa的分组,尝试将内存使用量限制为10mb。可以通过如下命令行实现。
下面看一下memory cgroup限制内存使用量的效果。
1.获取较大的文件
首先,看一下不对内存使用量进行限制时的结果。
从free来看,原本有约600mb的空闲内存减少到约60mb。而cached的值大幅增加,可以看出对wget命令获取的约700mb的文件进行缓存时使用了空闲内存。
下面看一下将内存使用量限制为10mb时的结果。
从free命令中cached的差别可以看出内存使用量限制在约10mb。
2.备份处理
在通过tar命令创建数据库时也可以使用。以linux内核源代码数据库为例进行说明。
不限制内存使用量时:
内存使用量限制为10mb时:
可以发现内存同样限制为10mb。
层次结构
通过memory cgroup控制的分组可以采用层次结构。可以在memory.use_hierarchy中写入1,启用分组的层次结构。
例如,通过执行下列命令审校者注1,可以创建如图2-1所示的分组结构。
图2-1 创建的分组结构
显示统计信息
关于各分组内存使用量的统计信息可以从memory.stat文件中读取(见表2-4)。
表2-4 内存使用量的统计信息
下列内容在使用层次结构时有效,将显示层次结构中处于上层的分组所限制的值(见表2-5)。
表2-5 使用层次结构时的分组限制值
表2-6所示为层次结构中分组的合计,在本分组下创建的所有分组的合计值。
表2-6 层次结构中分组下的合计值
小结
本节介绍了memory cgroup。使用memory cgroup设置内存使用量的上限,就可以避免产生多余的页面缓存,减少对其他处理的影响。
参考文献
documentation/cgroup/memory.txt
—hiroshi shimamoto