Linux Cgroups 的全称是 Linux Control Group。
`
CPU
、内存
、磁盘
、暴露出来的操作接口是文件系统
。mount -t cgroup这里的t表示type
root@server1 ~]# mount -t cgroup
在 /sys/fs/cgroup
下面有很多诸如 cpuset
、cpu
、memory
这样
的子目录,也叫子系统。
cpu.cfs_period_us
表示将cpu时间片分成100000份
cpu.cfs_quota_us
表示当前这个组中的task中的PID将分配多少比例的cpu时间片
tasks
这个文件里面可以写入一个或多个pid,配额设置将影响这些task
cpu.shares
优先级,只有在争抢时候生效,数字越大,优先级越高
在每个子系统下面,为每个容器创建一个控制组(即创建一 个新目录)。控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指
1.CPU限额
对物理机cpu限额
不限额的情况:
dd if=/dev/zero of=/dev/null & #开启一个进程使该进程独占cpu
top #查看cpu资源分配
root@server1 cpu]# mkdir x1
[root@server1 cpu]# ls
cgroup.clone_children cgroup.sane_behavior cpuacct.usage_percpu cpu.rt_period_us cpu.stat notify_on_release tasks
cgroup.event_control cpuacct.stat cpu.cfs_period_us cpu.rt_runtime_us docker release_agent user.slice
cgroup.procs cpuacct.usage cpu.cfs_quota_us cpu.shares kubepods system.slice x1
[root@server1 cpu]# cd x1
[root@server1 x1]# echo 20000 > cpu.cfs_quota_us#限制control group占用时间为20000微秒
[root@server1 x1]# dd if=/dev/zero of=/dev/null 通过命令使整个cpu资源分配个一个进程
[2] 28391
[root@server1 x1]# top#仍为100
[root@server1 x1]# top#查看id
[root@server1 x1]# echo 1085 > tasks
[root@server1 x1]# top #再次查看
docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash
cpu_period
和cpu_quota
这两个参数需要组合使用,用来限制进程在
长度为 cpu_period
的一段时间内,只能被分配到总量为cpu_quota
的
CPU 时间,以上设置表示20%的cpu时间。
#在容器中通过命令使整个cpu资源分配个一个进程
root@9b535e3a4378:/# dd if=/dev/zero of=/dev/null &
[1] 15
root@9b535e3a4378:/# top查看cpu占用情况
[root@server1 x1]# docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu bash
root@86d58b5a31dc:/# 容器不结束进程
[root@server1 docker]# pwd
/sys/fs/cgroup/cpu/docker
[root@server1 docker]# ls
86d58b5a31dc26e90bc7182ff532fe8ece979076cf2e5eed3307830c3b53c2f4 cpuacct.stat cpu.cfs_quota_us cpu.stat
cgroup.clone_children cpuacct.usage cpu.rt_period_us notify_on_release
cgroup.event_control cpuacct.usage_percpu cpu.rt_runtime_us tasks
cgroup.procs cpu.cfs_period_us cpu.shares
[root@server1 docker]# cd 86d58b5a31dc26e90bc7182ff532fe8ece979076cf2e5eed3307830c3b53c2f4/
[root@server1 86d58b5a31dc26e90bc7182ff532fe8ece979076cf2e5eed3307830c3b53c2f4]# ls
[root@server1 86d58b5a31dc26e90bc7182ff532fe8ece979076cf2e5eed3307830c3b53c2f4]# cat cpu.cfs_quota_us #容器cpu限额文件
20000
[root@server1 86d58b5a31dc26e90bc7182ff532fe8ece979076cf2e5eed3307830c3b53c2f4]# cat cpu.cfs_period_us
100000
2.内存限制
容器可用内存包括两个部分:物理内存
和swap交换分区
。
对物理机的内存限制
[root@server1 memory]# pwd
/sys/fs/cgroup/memory
[root@server1 memory]# ls
默认情况下,cgroup在系统中对内存的限制是默认很大的,如果不作限制,当系统中跑的某个进程占用非常大时候,将有可能影响其他进程的运行,甚至可能会不断消耗系统内存,导致系统崩溃。
[root@server1 memory]# cat memory.limit_in_bytes
9223372036854771712 #默认值
#做限制:
[root@server1 memory]# mkdir x2
[root@server1 memory]# cd x2
[root@server1 x2]# ls
[root@server1 x2]# pwd
/sys/fs/cgroup/memory/x2
[root@server1 x2]# echo 314572800 > memory.limit_in_bytes
[root@server1 ~]# dd if=/dev/zero of=file1 bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 0.203291 s, 1.0 GB/s
[root@server1 shm]# free -m
对内存限制并没有生效,因此需要安装cgexec
管理工具来使用,安装libcgroup-tools.x86_64
软件包,对指定控制器做限制
[root@server1 ~]# cgexec -g memory:x2 dd if=/dev/zero of=file bs=1M count=400
400+0 records in
400+0 records out
419430400 bytes (419 MB) copied, 0.46192 s, 908 MB/s
docker run -it --memory 200M --memory-swap=200M ubuntu
--memory
设置内存使用限额--memory-swap
设置swap交换分区限额