CGroup 介绍
CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。2007 年进入 Linux 2.6.24 内核,CGroups 不是全新创造的,它将进程管理从 cpuset 中剥离出来,作者是 Google 的 Paul Menage。CGroups 也是 LXC 为实现虚拟化所使用的资源管理手段。
blkio -- 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。
cpu -- 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。
cpuacct -- 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。
cpuset -- 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
devices -- 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。
freezer -- 这个子系统挂起或者恢复 cgroup 中的任务。
memory -- 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。
net_cls -- 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。
(设置开机自启并启动)
systemctl enable cgconfig
systemctl start cgconfig
mount -l cgroup(查看cgroup挂载点)/sys/fs/cgroup
限制cpu实例
控制一个进程的cpu资源分配
docker run -it 镜像id /bin/bash
vi cpu.sh
!/bin/bash
i=0
while true
do
let i++
done
chmod +x cpu.sh
./cpu.sh
top(查看脚本占用cpu的资源量)
systemd-cgls(查看系统cgroup tree)
查看主要内容
─system.slice
??├─systemd-machined.service
??│ └─4909 /usr/lib/systemd/systemd-machined
??├─docker-06e008e6ecec4f5c138e568c6b5b1659387a003b1cfb037c07006679db976d63.scope(容器)
??│ ├─4889 /bin/bash
??│ └─4982 /bin/bash ./cpu.sh
cd /sys/fs/cgroup/cpu/system.slice/docker-06e008e6ecec4f5c138e568c6b5b1659387a003b1cfb037c07006679db976d63.scope
echo 50000>cpu.cfs_quota_us
cat cpu.cfs_quota_us
cat cpu.cfs_period_us(相对于cpu.cfs_period_us的100000是50%)
top(此时cpu占用率将近50%)
容器cpu资源控制(弹性---加权)
docker run -itd --cpu-shares 100 docker-io/centos:latest
cat /sys/fs/cgroup/cpu/system.slice/docker-...(容器)/cpu.shares
100
因为是弹性的所以cpu-shares的值不能够确保一定能获得相对cpu资源,默认情况下cpu份额为1024,只有在多容器运行的时候,cpu加权才会有机会获得较多的cpu时间片给加权值大一点的容器,如果加权值多的容器处于空闲状态,那么比他少的容器也可以获得较多的时间片
弹性分配实例
删除docker主机上运行的容器
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
给一个容器分配cpu份额为1024
docker run -it --rm --cpu-shares 1024 --cpuset-cpus 0 --name shares docker-io/centos:latest.
修改cpu份额
echo "512">/sys/fs/cgroup/cpu/system.slice/容器/cpu.shares
cpu使用率
cgroups 里,可以用 cpu.cfs_period_us 和 cpu.cfs_quota_us 来限制该组中的所有进程在单位时间里可以使用的 cpu 时间。cpu.cfs_period_us 就是时间周期,默认为 100000,即百毫 秒。cpu.cfs_quota_us就是在这期间内可使用的cpu时间,默认 -1,即无限制。
cpu.cfs_period_us:设定时间周期(单位为微秒(μs)),必须与 cfs_quota_us 配合使用。 cpu.cfs_quota_us :设定周期内最多可使用的时间(单位为微秒(μs))。这里的配置指 task 对单个 cpu 的使用上限。
举个例子,如果容器进程需要每 1 秒使用单个 CPU 的 0.2 秒时间,可以将 cpu-period 设置随笔为
1000000(即 1 秒),cpu-quota 设置为 200000(0.2 秒)。
当然,在多核情况下,若 cfs_quota_us 是 cfs_period_us 的两倍,就表示在两个核上 完全使用 CPU,例如如果允许容器进程需要完全占用两个 CPU,则可以将 cpu-period 设置为 100000(即 0.1 秒),cpu-quota 设置为 200000(0.2 秒)。
实例同上,只是改为--cpu-period --cpu-quota而已
cpuset - CPU 绑定
对多核 CPU 的服务器,docker 还可以控制容器运行限定使用哪些 cpu 内核和内存节点,即 使用–cpuset-cpus 和–cpuset-mems 参数。对具有 NUMA 拓扑(具有多 CPU、多内存节点)的 服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。如果服务器只有一个 内存节点,则–cpuset-mems 的配置基本上不会有明显效果
docker run -itd --name rest --cpuset-cpus 0-2 docker.io/centos:latest
cpuset.cpus:在这个文件中填写 cgroup 可使用的 CPU 编号,如 0-2,16 代表 0、1、2 和 16这 4 个 cpu。
cpuset.mems:与 CPU 类似,表示 cgroup 可使用的cpu内存块,格式同上
docker stats 容器名
关于磁盘IO的分配
磁盘 IO 配额控制 主要包括以下参数:
--device-read-bps:限制此设备上的读速度(bytes per second),单位可以是 kb、mb 或者 gb。
--device-read-iops:通过每秒读 IO 次数来限制指定设备的读速度。
--device-write-bps :限制此设备上的写速度(bytes per second),单位可以是 kb、mb 或者 gb。
--device-write-iops:通过每秒写 IO 次数来限制指定设备的写速度。
--blkio-weight:容器默认磁盘 IO 的加权值,有效值范围为 10-1000。
--blkio-weight-device: 针对特定设备的 IO 加权控制。其格式为 DEVICE_NAME:WEIGHT
这里就交给大家自己去实例了