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

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

  1. # mount -t cgroup -o memory memcg /cgroup

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

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

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

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

  1. # free
  2. total used free shared buffers cached
  3. Mem: 1021532 415728 605804 0 24260 141764
  4. -/+ buffers/cache: 249704 771828
  5. Swap: 2064376 0 2064376
  1. # wget http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/5.6/isos/x86_64/CentOS-5.6-x86_64-LiveCD.iso
  2. --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
  3. Resolving ftp.yz.yamagata-u.ac.jp... 133.24.255.153, 133.24.255.161
  4. Connecting to ftp.yz.yamagata-u.ac.jp|133.24.255.153|:80... connected.
  5. HTTP request sent, awaiting response... 200 OK
  6. Length: 733669376 (700M) [application/x-iso9660-image]
  7. Saving to: "CentOS-5.6-x86_64-LiveCD.iso"
  8. 100%[======================================>] 733,669,376 496K/s in 22m 44s
  9. 2011-04-19 00:58:11 (525 KB/s) - "CentOS-5.6-x86_64-LiveCD.iso" saved [733669376/733669376]
  10. # free
  11. total used free shared buffers cached
  12. Mem: 1021532 957288 64244 0 12944 676844
  13. -/+ buffers/cache: 267500 754032
  14. Swap: 2064376 0 2064376

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

  1. # free
  2. total used free shared buffers cached
  3. Mem: 1021532 419988 601544 0 23280 154960
  4. -/+ buffers/cache: 241748 779784
  5. Swap: 2064376 0 2064376
  6. # wget http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos/5.6/isos/x86_64/CentOS-5.6-x86_64-LiveCD.iso
  7. --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
  8. Resolving ftp.yz.yamagata-u.ac.jp... 133.24.255.153, 133.24.255.161
  9. Connecting to ftp.yz.yamagata-u.ac.jp|133.24.255.153|:80... connected.
  10. HTTP request sent, awaiting response... 200 OK
  11. Length: 733669376 (700M) [application/x-iso9660-image]
  12. Saving to: "CentOS-5.6-x86_64-LiveCD.iso"
  13. 100%[======================================>] 733,669,376 579K/s in 24m 4s
  14. 2011-04-19 23:28:51 (496 KB/s) - "CentOS-5.6-x86_64-LiveCD.iso" saved [733669376/733669376]
  1. # free
  2. total used free shared buffers cached
  3. Mem: 1021532 432732 588800 0 25744 164656
  4. -/+ buffers/cache: 242332 779200
  5. Swap: 2064376 0 2064376

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

  1. # free; tar cf linux.tar linux; free
  2. total used free shared buffers cached
  3. Mem: 1021532 286136 735396 0 20144 110392
  4. -/+ buffers/cache: 155600 865932
  5. Swap: 2064376 0 2064376
  6. total used free shared buffers cached
  7. Mem: 1021532 949472 72060 0 20644 718776
  8. -/+ buffers/cache: 210052 811480
  9. Swap: 2064376 0 2064376

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

  1. # free; tar cf linux.tar linux; free
  2. total used free shared buffers cached
  3. Mem: 1021532 288760 732772 0 20204 110372
  4. -/+ buffers/cache: 158184 863348
  5. Swap: 2064376 0 2064376
  6. total used free shared buffers cached
  7. Mem: 1021532 340476 681056 0 21732 118752
  8. -/+ buffers/cache: 199992 821540
  9. Swap: 2064376 0 2064376

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

  1. # echo 1 > /cgroup/memory.use_hierarchy

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

  1. # mkdir /cgroup/A
  2. # echo 100M > /cgroup/A/memory.limit_in_bytes
  3. # mkdir /cgroup/A/{B1,B2}
  4. # echo 70M > /cgroup/A/B1/memory.limit_in_bytes
  5. # echo 30M > /cgroup/A/B2/memory.limit_in_bytes
  6. # mkdir /cgroup/A/B1/{C11,C12}
  7. # echo 40M > /cgroup/A/B1/C11/memory.limit_in_bytes
  8. # echo 30M > /cgroup/A/B1/C12/memory.limit_in_bytes
  9. # mkdir /cgroup/A/B2/{C21,C22}
  10. # echo 20M > /cgroup/A/B2/C21/memory.limit_in_bytes
  11. # echo 10M > /cgroup/A/B2/C22/memory.limit_in_bytes

图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

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

  1. 《Linux内核精髓:精通Linux内核必会的75个绝技》目录

    1章 内核入门HACK #1 如何获取Linux内核HACK #2 如何编译Linux内核HACK #3 如何编写内核模块HACK #4 如何使用GitHACK #5 使用checkpatch.pl检 ...

  2. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #1 如何获取Linux内核

    HACK #1 如何获取Linux内核 本节介绍获取Linux内核源代码的各种方法.“获取内核”这个说法看似简单,其实Linux内核有很多种衍生版本.要找出自己想要的源代码到底是哪一个,必须首先理解各 ...

  3. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #15 ramzswap

    HACK #15 ramzswap 本节介绍将一部分内存作为交换设备使用的ramzswap.ramzswap是将一部分内存空间作为交换设备使用的基于RAM的块设备.对要换出(swapout)的页面进行 ...

  4. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #14 虚拟存储子系统的调整

    HACK #14 虚拟存储子系统的调整 本节介绍如何使用/proc进行虚拟存储子系统的调整.虚拟空间存储方式在Linux上向应用程序分配内存时,是通过以页面为单位的虚拟存储方式进行的.采用虚拟存储方式 ...

  5. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #3 如何编写内核模块

    HACK #3 如何编写内核模块 本节将介绍向Linux内核中动态添加功能的结构—内核模块的编写方法.内核模块Linux内核是单内核(monolithic kernel),也就是所有的内核功能都集成在 ...

  6. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #21FUSE

    HACK #21FUSE 本节将介绍使用用户进程的文件系统框架—FUSE.FUSE概要FUSE(Filesystem in Userspace,用户空间文件系统),是用来生成用户空间的一般进程的框架. ...

  7. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #20 使用fio进行I/O的基准测试

    HACK #20 使用fio进行I/O的基准测试 本节介绍使用fio进行模拟各种情况的I/O基准测试的操作方法.I/O的基准测试中有无数需要考虑的因素.是I/O依次访问还是随机访问?是通过read/w ...

  8. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #17 如何使用ext4

    HACK #17 如何使用ext4 本节介绍ext4的编写和挂载方法.开发版ext4的使用方法.ext4是ext3的后续文件系统,从Linux 2.6.19开始使用.现在主要的发布版中多数都是采用ex ...

  9. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #16 OOM Killer的运行与结构

    HACK #16 OOM Killer的运行与结构(1) 本节介绍OOM Killer的运行与结构. Linux中的Out Of Memory(OOM) Killer功能作为确保内存的最终手段,可以在 ...

随机推荐

  1. python 列表元素的筛选

    color = ['Red', 'Green', 'White', 'Black', 'Pink', 'Yellow'] color = [x ,,)] print(color)

  2. c#只读字段和常量的区别,以及静态构造函数的使用 .

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Console ...

  3. Java研发工程师知识点总结

    Java研发工程师知识点总结 最近一次更新2017年12月08日 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 ...

  4. Java中字符串比较的注意点

    Java中必须使用string1.equals(string2)来进行判断 补充如果: string s1=new String("Hello"); string s2=new S ...

  5. form表单post请求保护 隐藏秘钥

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. TR-069: ACS Discovery

    ACS Discovery 原文链接:http://www.qacafe.com/knowledgebase/tr-069-training-series-acs-discovery/ In TR-0 ...

  7. 在JavaScript中进行文件处理,第五部分:Blobs

    译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 到目前为止,这个系列的帖子集中在和这些文件交互- ...

  8. 免费一年MAP2014+6个月免费MIS2014

    活动页面:http://promos.mcafee.com/en-us/Affiliates/400/Lp/np2815_mavp.aspx?rfhs=1&LPName=np2815_mavp ...

  9. window和Linux下Redis的安装及运行

    Window篇  Redis的官方目前公开的版本分为三个类别Stable.Beta和Unstable.这些版本一般只是针对Linux.Unix内核的系统,虽然官方的不支持Window系统,但是微软开源 ...

  10. How to get the full error stack trace of SharePoint

    博客地址 http://blog.csdn.net/foxdave SharePoint开发,怎么得到真实的详细错误信息. 大家在开发遇到页面报错需要提问的时候,先将详细错误信息获取到再提问,谢谢. ...