天天看点

《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #12 使用Memory Cgroup限制内存使用量

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的主要文件

《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #12 使用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所示的分组结构。

《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #12 使用Memory Cgroup限制内存使用量

图2-1 创建的分组结构

显示统计信息

关于各分组内存使用量的统计信息可以从memory.stat文件中读取(见表2-4)。

表2-4 内存使用量的统计信息

《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #12 使用Memory Cgroup限制内存使用量

下列内容在使用层次结构时有效,将显示层次结构中处于上层的分组所限制的值(见表2-5)。

表2-5 使用层次结构时的分组限制值

《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #12 使用Memory Cgroup限制内存使用量

表2-6所示为层次结构中分组的合计,在本分组下创建的所有分组的合计值。

表2-6 层次结构中分组下的合计值

《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #12 使用Memory Cgroup限制内存使用量

小结

本节介绍了memory cgroup。使用memory cgroup设置内存使用量的上限,就可以避免产生多余的页面缓存,减少对其他处理的影响。

参考文献

documentation/cgroup/memory.txt

—hiroshi shimamoto