linux cgroup 技术总结

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错误。

猜你喜欢

转载自blog.csdn.net/qq_35462323/article/details/83413157