Michael_Tong
近期目标:按时吃药,努力做个正常人。

HACK #12 使用Memory Cgroup限制内存使用量

Memory Cgroup是Cgroup的资源限制功能之一,可以控制特定进程可以使用的内存量。
Memory Cgroup
Memory Cgroup是Cgroup(参考Hack #7)之一,用来控制进程所使用的内存(LRU管理的缓存)数量。
其用法有很多种,例如,可以用来避免因一时处理较大文件或大量文件,而导致无用的页面缓存增大,内存资源紧张的情况。另外,还可以在多用户环境中限制各用户可以使用的内存量。
用法
Memory Cgroup是Cgroup的一种,因此使用前必须挂载cgroup文件系统。启用Memory Cgroup时,可以为挂载命令指定memory选项,也可以不指定选项以启用Cgroup的所有功能。
本节使用下列方式挂载到/cgroup。

# mount -t cgroup -o memory memcg /cgroup

挂载cgroup后,通过在/cgroup下创建新目录来创建新的分组。Memory Cgroup可以通过对该目录下的文件设置参数,来控制内存使用量。
另外,能否通过Cgroup文件系统控制以及特殊文件的种类多少,会根据内核版本和内核config的不同有所差异。
Cgroup文件系统中关于Memory Cgroup配置的主要特殊文件如表2-3所示。
表2-3 关于Memory Cgroup的主要文件
image

限制内存使用量
内存使用量可以使用memory.limit_in_bytes进行限制。这里创建一个名称为GroupA的分组,尝试将内存使用量限制为10MB。可以通过如下命令行实现。

# mkdir /cgroup/GroupA
# echo 10M > /cgroup/GroupA/memory.limit_in_bytes
# echo $$ > /cgroup/GroupA/tasks

下面看一下Memory Cgroup限制内存使用量的效果。
1.获取较大的文件
首先,看一下不对内存使用量进行限制时的结果。

# free
             total       used       free     shared    buffers     cached
Mem:       1021532     415728     605804          0      24260     141764
-/+ buffers/cache:     249704     771828
Swap:      2064376          0    2064376
# wget http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/5.6/isos/x86_64/CentOS-5.6-x86_64-LiveCD.iso
--2011-04-19 00:35:27--  http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/5.6/isos/x86_64/CentOS-5.6-x86_64-LiveCD.iso
Resolving ftp.yz.yamagata-u.ac.jp... 133.24.255.153, 133.24.255.161
Connecting to ftp.yz.yamagata-u.ac.jp|133.24.255.153|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 733669376 (700M) [application/x-iso9660-image]
Saving to: "CentOS-5.6-x86_64-LiveCD.iso"

100%[======================================>] 733,669,376  496K/s   in 22m 44s 

2011-04-19 00:58:11 (525 KB/s) - "CentOS-5.6-x86_64-LiveCD.iso" saved [733669376/733669376]

# free
             total       used       free     shared    buffers     cached
Mem:       1021532     957288      64244          0      12944     676844
-/+ buffers/cache:     267500     754032
Swap:      2064376          0    2064376

从free来看,原本有约600MB的空闲内存减少到约60MB。而cached的值大幅增加,可以看出对wget命令获取的约700MB的文件进行缓存时使用了空闲内存。
下面看一下将内存使用量限制为10MB时的结果。

# free
             total       used       free     shared    buffers     cached
Mem:       1021532     419988     601544          0      23280     154960
-/+ buffers/cache:     241748     779784
Swap:      2064376          0    2064376

# wget http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/5.6/isos/x86_64/CentOS-5.6-x86_64-LiveCD.iso
--2011-04-19 23:04:47--  http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/5.6/isos/x86_64/CentOS-5.6-x86_64-LiveCD.iso
Resolving ftp.yz.yamagata-u.ac.jp... 133.24.255.153, 133.24.255.161
Connecting to ftp.yz.yamagata-u.ac.jp|133.24.255.153|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 733669376 (700M) [application/x-iso9660-image]
Saving to: "CentOS-5.6-x86_64-LiveCD.iso"

100%[======================================>] 733,669,376  579K/s   in 24m 4s  

2011-04-19 23:28:51 (496 KB/s) - "CentOS-5.6-x86_64-LiveCD.iso" saved [733669376/733669376]
# free
             total       used       free     shared    buffers     cached
Mem:       1021532     432732     588800          0      25744     164656
-/+ buffers/cache:     242332     779200
Swap:      2064376          0    2064376

从free命令中cached的差别可以看出内存使用量限制在约10MB。
2.备份处理
在通过tar命令创建数据库时也可以使用。以Linux内核源代码数据库为例进行说明。
不限制内存使用量时:

# free; tar cf linux.tar linux; free
             total       used       free     shared    buffers     cached
Mem:       1021532     286136     735396          0      20144     110392
-/+ buffers/cache:     155600     865932
Swap:      2064376          0    2064376
             total       used       free     shared    buffers     cached
Mem:       1021532     949472      72060          0      20644     718776
-/+ buffers/cache:     210052     811480
Swap:      2064376          0    2064376

内存使用量限制为10MB时:

# free; tar cf linux.tar linux; free
             total       used       free     shared    buffers     cached
Mem:       1021532     288760     732772          0      20204     110372
-/+ buffers/cache:     158184     863348
Swap:      2064376          0    2064376
             total       used       free     shared    buffers     cached
Mem:       1021532     340476     681056          0      21732     118752
-/+ buffers/cache:     199992     821540
Swap:      2064376          0    2064376

可以发现内存同样限制为10MB。
层次结构
通过Memory Cgroup控制的分组可以采用层次结构。可以在memory.use_hierarchy中写入1,启用分组的层次结构。

# echo 1 > /cgroup/memory.use_hierarchy

例如,通过执行下列命令审校者注1,可以创建如图2-1所示的分组结构。

# mkdir /cgroup/A
# echo 100M > /cgroup/A/memory.limit_in_bytes
# mkdir /cgroup/A/{B1,B2}
# echo 70M > /cgroup/A/B1/memory.limit_in_bytes
# echo 30M > /cgroup/A/B2/memory.limit_in_bytes
# mkdir /cgroup/A/B1/{C11,C12}
# echo 40M > /cgroup/A/B1/C11/memory.limit_in_bytes
# echo 30M > /cgroup/A/B1/C12/memory.limit_in_bytes
# mkdir /cgroup/A/B2/{C21,C22}
# echo 20M > /cgroup/A/B2/C21/memory.limit_in_bytes
# echo 10M > /cgroup/A/B2/C22/memory.limit_in_bytes

image

图2-1 创建的分组结构
显示统计信息
关于各分组内存使用量的统计信息可以从memory.stat文件中读取(见表2-4)。
表2-4 内存使用量的统计信息
image

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

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

小结
本节介绍了Memory Cgroup。使用Memory Cgroup设置内存使用量的上限,就可以避免产生多余的页面缓存,减少对其他处理的影响。
参考文献
Documentation/cgroup/memory.txt
—Hiroshi Shimamoto

posted on 2018-03-12 23:12  Michael_Tong唐唐  阅读(344)  评论(0编辑  收藏  举报