Docker容器的cgroup搭建

一,基本知识

1.什么是cgroup
Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由 google 的工程师提出,后来被整合进 Linux 内核。Cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC。

2.cgroup可以干什么

(1)限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)。

(2)进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。

(3)记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间

(4)进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。

(5)进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。

3.cgroup中需要了解的四个概念

(1)Subsystems: 称之为子系统,一个子系统就是一个资源控制器,比如 cpu子系统就是控制cpu时间分配的一个控制器。

(2)Hierarchies: 可以称之为层次体系也可以称之为继承体系,指的是Control Groups是按照层次体系的关系进行组织的。

(3)Control Groups: 一组按照某种标准划分的进程。进程可以从一个Control Groups迁移到另外一个Control Groups中,同时Control Groups中的进程也会受到这个组的资源限制。
(4)Tasks: 在cgroups中,Tasks就是系统的一个进程。

二、cgroup的部署

对cpu内存的限制
1.打开docker并检测cgroup是否开启

[root@server1 ~]# systemctl start docker
[root@server1 ~]# mount -t cgroup 		 ##都显示on即可
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)

2.查看cgroup子系统的层级路径

[root@server1 ~]# cd /sys/fs/cgroup/
[root@server1 cgroup]# ll
total 0
drwxr-xr-x 5 root root  0 Jun  3 10:26 blkio
lrwxrwxrwx 1 root root 11 Jun  3 10:26 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Jun  3 10:26 cpuacct -> cpu,cpuacct
drwxr-xr-x 5 root root  0 Jun  3 10:26 cpu,cpuacct
drwxr-xr-x 3 root root  0 Jun  3 10:26 cpuset
drwxr-xr-x 5 root root  0 Jun  3 10:26 devices
drwxr-xr-x 3 root root  0 Jun  3 10:26 freezer
drwxr-xr-x 3 root root  0 Jun  3 10:26 hugetlb
drwxr-xr-x 5 root root  0 Jun  3 10:26 memory
lrwxrwxrwx 1 root root 16 Jun  3 10:26 net_cls -> net_cls,net_prio
drwxr-xr-x 3 root root  0 Jun  3 10:26 net_cls,net_prio
lrwxrwxrwx 1 root root 16 Jun  3 10:26 net_prio -> net_cls,net_prio
drwxr-xr-x 3 root root  0 Jun  3 10:26 perf_event
drwxr-xr-x 3 root root  0 Jun  3 10:26 pids
drwxr-xr-x 5 root root  0 Jun  3 10:26 systemd

3.建立一个CPU控制群组

(1)首先进入cpu子系统对应的层级路径下:cd /sys/fs/cgroup/cpu
(2)通过新建文件夹创建一个cpu控制族群:mkdir x1,即新建了一个cpu控制族群:x1
(3)新建x1之后,可以看到目录下自动建立了相关的文件(继承了上一及的文件),这些文件是伪文件。

[root@server1 cgroup]# cd cpu
[root@server1 cpu]# ls
cgroup.clone_children  cpuacct.usage         cpu.rt_runtime_us  release_agent
cgroup.event_control   cpuacct.usage_percpu  cpu.shares         system.slice
cgroup.procs           cpu.cfs_period_us     cpu.stat           tasks
cgroup.sane_behavior   cpu.cfs_quota_us      docker             user.slice
cpuacct.stat           cpu.rt_period_us      notify_on_release
[root@server1 cpu]# mkdir x1
[root@server1 cpu]# cd x1/
[root@server1 x1]# ls
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
cpuacct.stat           cpu.cfs_quota_us      cpu.stat

4.测试限制CPU的使用

(1)我们的测试示例主要用到cpu.cfs_period_us和cpu.cfs_quota_us两个文件。
(2)cpu.cfs_period_us:cpu分配的周期(微秒),默认为100000。
(3)cpu.cfs_quota_us:表示该control group限制占用的时间(微秒),默认为-1,表示不限制。如果设为20000,表示占用20000/100000=20%的CPU。

[root@server1 x1]# cat cpu.cfs_period_us 
100000
[root@server1 x1]# cat cpu.cfs_quota_us 
-1
[root@server1 x1]# echo 20000 > cpu.cfs_period_us 
[root@server1 x1]# cat cpu.cfs_period_us 
20000
[root@server1 x1]# dd if=/dev/zero of=/dev/null &
[1] 20195

5.top查看cpu占用情况
可以看出几乎占用了100%
Docker容器的cgroup搭建_第1张图片

6.创建一个容器,并限制cpu的使用

[root@server1 x1]# echo 20195 > tasks 
[root@server1 x1]# fg
dd if=/dev/zero of=/dev/null
^C339592796+0 records in
339592796+0 records out
173871511552 bytes (174 GB) copied, 118.582 s, 1.5 GB/s
[root@server1 x1]# docker rm vm1
[root@server1 x1]#  docker run -it --name vm1 --cpu-quota=20000 ubuntu
root@3115c40c7ede:/# dd if=/dev/zero of=/dev/null &

Docker容器的cgroup搭建_第2张图片
不做限制时则为100%

[root@server1 x1]# docker rm vm1
vm1
[root@server1 x1]# docker run -it --name vm1  ubuntu
root@159e1b52c802:/# dd if=/dev/zero of=/dev/null &
[1] 15
root@159e1b52c802:/# top

Docker容器的cgroup搭建_第3张图片
查看相关配置文进阿

[root@server1 x1]# pwd
/sys/fs/cgroup/cpu/x1
[root@server1 x1]# cd ../docker/
[root@server1 docker]# ls
215c0ded74b158aac969af99b1f7e03b39f482a5c67c07cf2a8c32c22c2fbd7e
[root@server1 215c0ded74b158aac969af99b1f7e03b39f482a5c67c07cf2a8c32c22c2fbd7e]# cat cpu.cfs_quota_us 
20000

限制内存的占用
1.虚拟机安装docker并开启,下载软件

[root@docker1 ~]# systemctl start docker
[root@docker1 ~]# yum install -y lxcfs-2.0.5-3.el7.centos.x86_64.rpm
[root@docker1 ~]# cd /var/lib/lxcfs/
[root@server1 lxcfs]# ls
[root@server1 lxcfs]# cd 
[root@server1 ~]# lxcfs /var/lib/lxcfs/ &
[1] 20935
[root@server1 ~]# hierarchies:
  0: fd:   5: freezer
  1: fd:   6: net_prio,net_cls
  2: fd:   7: cpuset
  3: fd:   8: devices
  4: fd:   9: memory
  5: fd:  10: hugetlb
  6: fd:  11: blkio
  7: fd:  12: perf_event
  8: fd:  13: pids
  9: fd:  14: cpuacct,cpu
 10: fd:  15: name=systemd

2.测试
查看初始状态

[root@server1 ~]# cd /var/lib/lxcfs/
[root@server1 lxcfs]# ls
cgroup  proc
[root@server1 lxcfs]# cd proc/
[root@server1 proc]# ls
cpuinfo  diskstats  meminfo  stat  swaps  uptime

##不受限制的时候和虚拟机的内存是一样的
[root@server1 proc]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1839         162         132           8        1545        1460
Swap:          2047           0        2047
[root@server1 proc]# docker run -it --name vm2 ubuntu
root@268fa6d715d8:/# free -m
             total       used       free     shared    buffers     cached
Mem:          1839       1719        119          8          0       1402
-/+ buffers/cache:        316       1522
Swap:         2047          0       2047

Docker容器的cgroup搭建_第4张图片
设置内存占用为200m

[root@docker1 proc]# 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@322f87592f39:/# free -m

Docker容器的cgroup搭建_第5张图片

你可能感兴趣的:(linux)