Linux Cgroups
Linux Cgroups
Namespace是用來實現進程之間的隔離,但是并没有限制其空间的大小。如果想要限制一个进程可以使用的空间,保证各个进程之间不会互相争抢就要用到
Cgroups。
Linux Cgroups(Linux Control Groups)提供了对一组进程及将来子进程的资源限制、控制、统计的能力。这些资源包括cpu、内存、存储、网络
等。通过Cgroups,可以方便的控制某个进程占用的资源,并可以实施监控和统计信息。
Cgroups中的三个组件
cgroup 是对进程分组管理的一种机制,一个cgroup包含一组进程,并可以在这个cgroup上增加Linux subsystem的各种参数配置,将一组进程和一
组subsystem的系统参数关联起来。subsystem 是一组资源控制的模块。包含以下几项。
- blkio 设置对块设备输入输出的访问控制。例如磁盘
- cpu 设置cgroup中进程的cpu被调度策略。
- cpuacct 可以统计cgroup中进程的cpu占用。
- cpuset 在多核机器上,设置cgroup中进程可以使用的cpu和内存。此处仅限于NUMA架构。
- devices 控制cgroup对设备的访问。
- freezer 挂起(suspend)和恢复(resue) cgroup中的进程。
- memory 用于控制cgroup中进程的内存占用。
- net_cls 将cgroup中进程产生的网络包分类,便于linux tc(traffic controller)可以根据分类区分出来自某个cgroup包并做监控。
- net_prio 设置cgroup中进程产生的网络流量的优先级。
- ns 使cgroup中的进程在新的Namespace中fork新进程时,创建一个新的cgroup,这个cgroup包含新的Namespace中的进程。
每个subsystem会关联到定义的cgroup,并对这个cgroup中的进程做限制和控制。这些subsystem是逐步合并到内核中的,可以安装apt-get install
cgroup-bin 然后通过 lssubsys -a 查看

- hierarchy 把一组cgroup串成一个柱状结构,这样的树便是一个hierarchy,通过这种结构,Cgroups可以做到继承。
三个组件的关系
- 系统创建hierarchy 之后,所有的进程都会加入这个hierarchy的cgroup的根节点。在这个cgroup根节点是hierarchy默认创建的。
- 一个subsystem只能附加到一个hierarchy上面。
- 一个进程可以作为多个cgroup的成员,但是cgroup必须在不同的hierarchy中。
- 一个进程fork的子进程和父进程在同一个cgroup中也可以根据需要移到其他cgroup中。
Kernel接口
前面说道Cgroups中的hierarchy是一种树状结构,Kernel为了对Cgroups的配置更直观,也会显示为树状结构。下面进行实例,了解如何操作Cgroups。
首先创建并挂在一个hierarchy(cgroup树),如下.
leon@leon:~$ mkdir cgroup-test
leon@leon:~$ sudo mount -t cgroup -o none,name=cgroup1 cgroup1 ./cgroup-test/
leon@leon:~$ ls ./cgroup-test/
cgroup.clone_children cgroup.procs cgroup.sane_behavior notify_on_release release_agent tasks
这些文件就是这个hierarchy中cgroup根节点的配置项,上面这些文件含义如下。
- cgroup.clone_children, cpuset的subsystem会读取这个文件的配置,如果值是1(默认值0),子cgroup才会继承父cgroup的cpuset配置。
- cgroup.procs 是树中当前结点cgroup的进程组id,现在的位置是在根节点,这个文件中会有现在系统中所有进程组的ID。
- notify_on_release和release_agent会在一起使用。notify_on_release标识当这个cgroup最后一个进程退出的时候是否执行了
release_agent;release_agent则是一个路径,通常用作进程退出后自动清理掉不再使用的cgroup。 - tasks标识该cgroup下面的进程ID,如果把一个进程ID写到tasks中便会将相应的进程加入到这个cgroup中。
然后创建刚才建立的hierarchy上cgroup根节点中扩展出的两个子cgroup。

可以看到创建子文件夹的同时,Kernel会标记这个cgroup的子cgroup,他们会继承父cgroup的属性。
- 在cgroup中添加和移动进程
一个进程在Cgroups的hierarchy中,只能在一个cgroup节点上存在,系统所有进程都会默认在根节点上存在,可以将进程移动到其他节点上,只需要将
进程ID移动到cgroup节点的tasks文件即可。

可以看到当前进程已经被添加到cgroup-1中了。**第一行**
通过subsystem限制cgroup进程的资源
上面的hierarchy没有关系任何的subsystem,所以没有限制cgroup占用的系统资源。本质系统默认为subsystem创建了hierarchy,比如memory的hierarchy。
可以看到/sys/fs/cgroup/memory目录挂载在memory subsystem的hierarchy上。下面进入到memory目录下创建cgroup。限制内存。

这样就创建成功,并添加了内存使用的限制。

可以看到9752 使用内存最大为100M
Docker是如何使用Cgroups的
Docker是通过Cgroups实现容器资源的限制和监控。

可以看到最大限制是134217728 使用的是1970176.这些都是我们在/sys/fs/cgroup/memory中找到的。由此可见docker本质上也是这样做的。
Go语言实现Cgroups限制容器资源
在Namespace的基础之上增加Cgroup的限制,使其具有限制内存的功能。
package main
import (
"os"
"os/exec"
"log"
"syscall"
"path"
"fmt"
"io/ioutil"
"strconv"
)
const cgroupMemoryHierarchyMount = "/sys/fs/cgroup/memory" //内存挂载点的路径
func main() {//
if os.Args[0] == "/proc/self/exe"{
fmt.Printf("current pid %d", syscall.Getpid())
fmt.Println()
cmd := exec.Command("sh", "-c" ,"strees --vm-bytes 200m --vm-keep -m 1") // 之前我们通过命令行,这里命令还是一样的。
cmd.SysProcAttr = &syscall.SysProcAttr{
}
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Run();err!=nil{
fmt.Println(err)
os.Exit(1)
}
}
cmd :=exec.Command("/proc/self/exe")
cmd.SysProcAttr = &syscall.SysProcAttr{
Cloneflags:syscall.CLONE_NEWUTS|syscall.CLONE_NEWPID|syscall.CLONE_NEWNS,
}
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if err := cmd.Start(); err !=nil{
fmt.Println("error", err)
os.Exit(1)
}else {
//获取fork的进程pid
fmt.Printf("%v" ,cmd.Process.Pid)
// 在系统中默认创建挂在了memory subsystem的hierarchy上创建Cgroup
os.Mkdir(path.Join(cgroupMemoryHierarchyMount,"testmemorylimit"),0755)
// 将容器加入到这个Cgroup中
ioutil.WriteFile(path.Join(cgroupMemoryHierarchyMount,"testmemorylimit","tasks"),[]byte(strconv.Itoa(cmd.Process.Pid)),0644)
//限制cgroup的使用
ioutil.WriteFile(path.Join(cgroupMemoryHierarchyMount,"testmemorylimit","memory.limit_in_bytes"),[]byte("100m"),0644)
}
cmd.Process.Wait()
}
通过top就可以查看。
Linux Cgroups的更多相关文章
- Docker之Linux Cgroups
Linux Cgroups介绍 上面是构建Linux容器的namespace技术,它帮进程隔离出自己单独的空间,但Docker又是怎么限制每个空间的大小,保证他们不会互相争抢呢?那么就要用到Linux ...
- Docker 基础技术之 Linux cgroups 详解
PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 推荐大家到公众号阅读,那里阅读体验更好,也沉淀了很多篇干货. 前面两篇 ...
- linux cgroups简介(下)Cgroups 与 Systemd
Cgroups 是 linux 内核提供的一种机制,如果你还不了解 cgroups,请参考前文<Linux cgroups 简介>先了解 cgroups.当 Linux 的 init 系统 ...
- linux cgroups简介(上)
Linux CGroups简介 1.CGroups是什么 与Linux namespace对比来看,Linux namespace用来限制进程的运行范围或者运行环境的可见性,比如:uts限制进程读取到 ...
- linux cgroups 简介
cgroups(Control Groups) 是 linux 内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统 ...
- Linux Cgroups详解(一)
[转载]http://blog.chinaunix.net/uid-23253303-id-3999432.html Cgroups是什么? Cgroups是control groups的缩写,是Li ...
- 理解Docker(4):Docker 容器使用 cgroups 限制资源使用
本系列文章将介绍Docker的有关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- Red Hat Enterprise Linux 7的新功能
简介红帽最新版本的旗舰平台交付显著增强的可用性. 性能和可靠性. 丰富的新功能为架构. 系统管理员和开发人员提供所需的资源以更高效地进行创新和管理.架构师: 红帽® 企业 Linux® 7 适合 ...
- [Linux容器]当我们谈容器的时候,我们在谈什么
Docker在当下很火,那么,当我们谈Docker,谈容器的时候,我们在谈什么? 或者说,你对Docker,对容器了解吗?容器,到底是怎么一回事儿? 这篇文章着重来讲一下Linux容器,为什么强调Li ...
随机推荐
- mysql-总结select各子句及其顺序
顺序:from->where ->group by->having ->order by
- rest_framework 权限功能
权限: 问题:不用视图不用权限可以访问 基本使用 写上一个权限类 创建utils 中 permission.py文件 class SvipPermisson(object): message = &q ...
- 18.查询效率最高的unordered_map
#include <string> #include <iostream> //查询性能最高 //增删查改与map是一样的,但是本质区别就是unordered_map底层是ha ...
- BZOJ 3503 高斯消元
思路: 高斯消元就好啦 注意每个格子最多只能和4个相邻 所以是 n*m*n*m*5 的 并不会TLE //By SiriusRen #include <cstdio> #include & ...
- GPU学习笔记(二)
找到了一个还不错的教程http://blog.csdn.net/augusdi/article/details/12527497 今天课比较多,但是有了这个教程解决了昨天不能运行的问题.
- #p-complete原来比np更难
转载一下豆瓣的一个不知名的朋友的介绍: NP是指多项式时间内验证其解是否正确.比如: 我们给一个0-1背包的解,就可以在多项式时间内验证是否满足条件.至于是否能找到 满足条件的解,这在NP复杂度里没有 ...
- C#线程安全打开/保存文件对话框
在多线程单元模式(MTA)中为应用程序使用.NET OpenFileDialog和SaveFileDialog 下载FileDialogsThreadAppartmentSafe_v1.zip 如果您 ...
- [POI2015]WIL-Wilcze doły(单调队列)
题意 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. (1<=d<=n< ...
- 学习参考《高性能MySQL(第3版)》中文PDF+英文PDF
学习mysql数据库时推荐看看mysql 领域的经典之作<高性能mysql(第3版)>,共分为16 章和6 个附录,内容涵盖mysql 架构和历史,基准测试和性能剖析,数据库软硬件性能优化 ...
- Lenovo k860i 移植Android 4.4 cm11进度记录【上篇已完结】
2014.5.16 为了验证一下下载的CM11的源码有没有问题,决定编译一下cm官方支持的机器,手上正好有台nexus7 2012,就拿它为例测试一下在mac os x平台的整个编译过程. 1. 最开 ...