一.关于cgroup
1.cgroup简介
cgroup是Control Groups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、memory、磁盘IO等等) 的机制,被LXC、docker等很多项目用于实现进程资源控制。cgroup将任意进程进行分组化管理的 Linux 内核功能。cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。
2.cgroup子系统
blkio:设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。
cpu:使用调度程序为cgroup任务提供cpu的访问。
cpuacct:产生cgroup任务的cpu资源报告。
cpuset:如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。
devices:允许或拒绝cgroup任务对设备的访问。
freezer:暂停和恢复cgroup任务。
memory:设置每个cgroup的内存限制以及产生内存资源报告。
net_cls:标记每个网络包以供cgroup方便使用。
ns:命名空间子系统。
perf_event:增加了对每group的监测跟踪的能力,即可以监测属于某个特定的group的所有线程以及运行在特定CPU上的线程。
二.cgroup的功能实现
1.控制cpu的占用情况
[root@foundation78 ~]# mount -t cgroup # 查看cgroup的挂载
[root@foundation78 ~]# cd /sys/fs/cgroup/
[root@foundation78 cgroup]# cd cpu
[root@foundation78 cpu]# mkdir x1
[root@foundation78 cpu]# ll
[root@foundation78 cpu]# cd x1/
[root@foundation78 x1]# cat cpu.cfs_period_us # cpu分配的周期(微秒),默认为100000
100000
[root@foundation78 x1]# cat cpu.cfs_quota_us # 该control group 限制占用时间,默认为-1
-1
[root@foundation78 x1]# echo 20000 > cpu.cfs_quota_us # 我们设置占用30%的cpu,即为20000
[root@foundation78 x1]# cat cpu.cfs_quota_us
20000
[root@foundation78 x1]# dd if=/dev/zero of=/dev/null & # 默认占用为100%
- 重新打开一个shell,查看cpu占用情况
[root@foundation78 ~]# top
[root@foundation78 x1]# ps ax
[root@foundation78 x1]# cat tasks
[root@foundation78 x1]# echo 12183 > tasks # 扔到任务列表中控管
[root@foundation78 x1]# cat tasks # 查看任务列表
12183
[root@foundation78 x1]# cd
[root@foundation78 ~]# docker run -it --name vm1 --cpu-quota=20000 ubuntu # 打开ubuntu的shell,控制cpu在20%左右
root@0dec1714fe3b:/# dd if=/dev/zero of=/dev/null
- 再次查看cpu占用量
[root@foundation78 ~]# top # 重新打开一个shell查看cpu的占用量,控制成功
- 回到ubuntu的shell
root@0dec1714fe3b:/# exit
exit
[root@foundation78 ~]# docker rm vm1
vm1
[root@foundation78 ~]# docker run -it --name vm1 ubuntu
root@97506ce5cb0d:/# dd if=/dev/zero of=/dev/null
- 查看cpu的占用情况
2.测试写入速度
[root@foundation78 ~]# cat /proc/partitions
[root@foundation78 ~]# docker run -it --device-write-bps /dev/sda:30MB ubuntu
root@78745770506b:/# dd if=/dev/zero of=file bs=1M count=300 oflag=direct
- oflag=direct表示直连io,不经过系统缓存
root@78745770506b:/# fdisk -l # 查看不到磁盘设备,因为不被允许
root@78745770506b:/# exit
exit
[root@foundation78 ~]# docker run -it --rm --privileged=true ubuntu
--privileged默认处理是False,即不允许container内的root拥有真正的root权限,设置为true表示赋予所有权限
root@172ade00dc4a:/# fdisk -l
- –privileged权限太大了,我们现在仅仅设置NET_ADMIN权限,使之可以添加ip即可
[root@foundation78 ~]# docker run -it --rm --cap-add=NET_ADMIN ubuntu
root@06e2a14fa868:/# fdisk -l
root@06e2a14fa868:/# ip addr
root@06e2a14fa868:/# ip addr add 172.17.0.3/24 dev eth0 # 添加ip
root@06e2a14fa868:/# ip addr # 查看ip添加成功
3.增强docker容器的隔离性
[root@base1 ~]# systemctl start docker
[root@base1 ~]# ls
lxcfs-2.0.5-3.el7.centos.x86_64.rpm
[root@base1 ~]# yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm
[root@base1 ~]# cd /var/lib/lxcfs/
[root@base1 lxcfs]# ls # 没有任何文件
[root@base1 lxcfs]# cd
[root@base1 ~]# lxcfs /var/lib/lxcfs/ & # 启动 lxcfs,如果卡住,可以按回车
[root@base1 ~]# cd /var/lib/lxcfs/
[root@base1 lxcfs]# ls
cgroup proc
[root@base1 lxcfs]# cd proc/ # 查看进程
[root@base1 proc]# ls
cpuinfo diskstats meminfo stat swaps uptime
[root@base1 proc]# cd
[root@base1 ~]# docker load -i ubuntu.tar
[root@base1 ~]# docker run -it --name vm1 -m 200m -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo \
-v /var/lib/lxcfs/proc/diskstats:/proc/diskstats \
-v /var/lib/lxcfs/proc/meminfo:/proc/meminfo \
-v /var/lib/lxcfs/proc/stat:/proc/stat \
-v /var/lib/lxcfs/proc/swaps:/proc/swaps \
-v /var/lib/lxcfs/proc/uptime:/proc/uptime \
ubuntu
root@d2f97169e5a6:/# free -m # 我们可以看到total的内存为200MB,说明已经生效