linux cgroup全称linux control group ,是linux内核的一个功能,用来限 制、控制与分离一个进程组群的资源(如cpu、内存、磁盘输入输出等)。这个项目最早是由Google的工程师在2006年发起(主要是Paul Menage和Rohit Seth),最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词太过广泛,为避免混乱,被重命名为cgroup。
linux把cgroup实现成了一个file system。 默认情况下编译内核时打开cgroup的系统中所有进行位于同一个cgroup,就是根,这个cgroup享有所有的系统资源。 我们可以通过cgroup文件系统建立一个新的cgroup,然后配置这个新的cgroup,配置内容包括为其分配进程,分配资源等。这个创建和分配的过程都是通过cgroup文件系统通过shell echo写进文件系统资源的。
lssubsys –all查看系统中默认挂载的子系统 。
cgroup子系统
-
blkio -- 为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。
-
cpu -- 使用调度程序提供对 CPU 的 cgroup 任务访问。
-
cpuacct -- 自动生成 cgroup 中任务所使用的 CPU 报告。
-
cpuset -- 为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
-
devices -- 可允许或者拒绝 cgroup 中的任务访问设备。
-
freezer -- 挂起或者恢复cgroup 中的任务。
-
memory -- 设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。
-
net_cls -- 使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。
-
net_prio -- 提供了一种动态控制每个网卡流量优先级的功能
-
ns -- 名称空间子系统
cgroup限制内存示例
1、在/cgroup/memory下创建一个子目录即创建了一个子cgroup。如test。
ls 查看当前目录文件。可以看到几个和memeroy相关的文件。
memory.usage_in_bytes #显示当前已用的内存
memory.limit_in_bytes #设置/显示当前限制的内存额度
memory.failcnt #显示内存使用量达到限制值的次数
memory.max_usage_in_bytes #历史内存最大使用量
memory.soft_limit_in_bytes #设置/显示当前限制的内存软额度
memory.stat #显示当前cgroup的内存使用情况
memory.use_hierarchy #设置/显示是否将子cgroup的内存使用情况统计到当前cgroup里面
memory.force_empty #触发系统立即尽可能的回收当前cgroup中可以回收的内存
memory.pressure_level #设置内存压力的通知事件,配合cgroup.event_control一起使用
memory.swappiness #设置和显示当前的swappiness
memory.move_charge_at_immigrate #设置当进程移动到其他cgroup中时,它所占用的内存是否也随着移动过去
memory.oom_control #设置/显示oom controls相关的配置
memory.numa_stat #显示numa相关的内存
2、进入test目录,ls命令可以看到该目录下以memory开头的文件。
memory.failcnt
memory.limit_in_bytes
memory.usage_in_bytes
memory.max_usage_in_bytes
memory.memsw.failcnt
memory.memsw.limit_in_bytes
memory.memsw.max_usage_in_bytes
memory.memsw.usage_in_bytes
memory.soft_limit_in_bytes
memory.oom_control
memory.use_hierarchy
memory.swappiness
memory.stat
带 memsw 的表示虚拟内存,不带 memsw 的仅包括物理内存。其中,limit_in_bytes 是用来限制内存使用的,其他的则是统计报告。
memory.memsw.limit_in_bytes:内存+swap空间使用的总量限制。 memory.limit_in_bytes:内存使用量限制。
memory.memsw.limit_in_bytes 必须大于或等于 memory.limit_in_byte。
往test这个cgroup中添加进程只要将进程号写入cgroup.procs就可以了
3.设置限额
echo
64M > /sys/fs/cgroup/memory/test/memory.limit_in_bytes
echo
64M > /sys/fs/cgroup/memory/test/memory.memsw.limit_in_bytes
如果一个进程加入了某一个控制组,该控制组对Linux的系统资源都有严格的限制,进程在使用这些资源时,不能超过其最大的限制数,例如:memory资源,如果加入控制组的进程使用的memory大于其限制,可能会出现OOM错误。