在server1上将环境恢复
[root@server1 ~]# docker rm vm1
vm1
在server2上一样的操作
1.在server1上运行容器(此时是root身份,但是并不是真正意义上的root)
解决:
[root@server1 ~]# docker run -it --name vm1 --privileged=true ubuntu
[root@server1 ~]# mount -t cgroup
测试:
[root@server1 cgroup]# docker run -it --name vm1 ubuntu
1.查看cgroup子系统的层级路径
2.建立一个控制族群
首先进入cpu子系统对应的层级路径下:cd /sys/fs/cgroup/memory
通过新建文件夹创建一个memory控制族群:mkdir x1,即新建了一个memory控制族群:x1
新建x1之后,可以看到目录下自动建立了相关的文件,这些文件是伪文件。
[root@server1 x1]# pwd
/sys/fs/cgroup/memory/
[root@server1 x1]# ll memory.limit_in_bytes
-rw-r--r-- 1 root root 0 May 19 00:35 memory.limit_in_bytes
[root@server1 x1]# echo 314572800 > memory.limit_in_bytes
[root@server1 x1]# cat memory.limit_in_bytes
314572800
截取400M,但是此时使用限制好像并没有生效
安装cgroup工具
[root@server1 shm]# yum install -y libcgroup-tools.x86_64
进行截取测试:
[root@server1 shm]# cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=400
注意:此时受到限制,超出300M限制后swap被时用了111M
[root@server1 x1]# pwd
/sys/fs/cgroup/memory/x1
[root@server1 x1]# ll memory.memsw.limit_in_bytes
-rw-r--r-- 1 root root 0 May 19 00:35 memory.memsw.limit_in_bytes
[root@server1 x1]# echo 314572800 > memory.memsw.limit_in_bytes
[root@server1 x1]# cat memory.memsw.limit_in_bytes
314572800
注意:此时swap没有被使用
[root@server1 ~]# docker run -it --name vm1 --memory 314572800 --memory-swap 314572800 ubuntu
注意:此时已经设置过,但看到的却没有改变
解决办法:
利用LXCFS增强docker容器的隔离性和资源的可见性
获取资源,安装lxcfs服务
[root@server1 ~]# yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm
打开服务,打入后台
[root@server1 ~]# lxcfs /var/lib/lxcfs/ &
[1] 4119
[root@server1 ~]# hierarchies:
0: fd: 5: perf_event
1: fd: 6: net_prio,net_cls
2: fd: 7: blkio
3: fd: 8: memory
4: fd: 9: freezer
5: fd: 10: cpuset
6: fd: 11: pids
7: fd: 12: cpuacct,cpu
8: fd: 13: devices
9: fd: 14: hugetlb
10: fd: 15: name=systemd
[root@server1 proc]# docker run -it --name vm1 -m 314572800 --memory-swap 314572800 \
> -v /var/lib/lxcfs/proc/cpuinfo:/proc/cpuinfo:rw \
> -v /var/lib/lxcfs/proc/diskstats:/proc/diskstats:rw \
> -v /var/lib/lxcfs/proc/meminfo:/proc/meminfo:rw \
> -v /var/lib/lxcfs/proc/stat:/proc/stat:rw \
> -v /var/lib/lxcfs/proc/swaps:/proc/swaps:rw \
> -v /var/lib/lxcfs/proc/uptime:/proc/uptime:rw \
> ubuntu
测试限制cpu的使用
我们的测试示例主要用到cpu.cfs_period_us和cpu.cfs_quota_us两个文件。
cpu.cfs_period_us:cpu分配的周期(微秒),默认为100000。
cpu.cfs_quota_us:表示该control group限制占用的时间(微秒),默认为-1,表示不限制。如果设为20000,表示占用20000/100000=20%的CPU。
建立一个CPU控制族群
首先进入cpu子系统对应的层级路径下:cd /sys/fs/cgroup/cpu
通过新建文件夹创建一个cpu控制族群:mkdir x2,即新建了一个cpu控制族群:x2
新建x2之后,可以看到目录下自动建立了相关的文件,这些文件是伪文件。
[root@server1 x2]# echo 100 > cpu.shares
[root@server1 x2]# cat tasks #空
[root@server1 cpu]# dd if=/dev/zero of=/dev/null &
[2] 4425
当再次进行截取
[root@server1 cpu]# dd if=/dev/zero of=/dev/null &
[3] 4429
[root@server1 cpu]# top
注意:此时两个任务会争抢cpu的资源
设置任务的队列
[root@server1 cpu]# cd x2/
[root@server1 x2]# echo 4425 > tasks #将id为4425的设置为等待任务
将截取的进程kill掉
[root@server1 ~]# docker run -it --name vm1 --cpu-period 100000 --cpu-quota 20000 ubuntu
此时cpu占用率20%
此时top查看