生活随笔
收集整理的这篇文章主要介绍了
Docker容器之cgroup搭建
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
一、知识剖析
什么是cgroup
Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由 google 的工程师提出,后来被整合进 Linux 内核。Cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC。
cgroup可以干什么
限制进程组可以使用的资源数量 (Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM(out of memory)。
进程组的优先级控制 (Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。
记录进程组使用的资源数量 (Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间
进程组隔离 (Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。
进程组控制 (Control)。比如:使用freezer子系统可以将进程组挂起和恢复。
cgroup中需要了解的四个概念
Subsystems: 称之为子系统,一个子系统就是一个资源控制器,比如 cpu子系统就是控制cpu时间分配的一个控制器。 Hierarchies: 可以称之为层次体系也可以称之为继承体系,指的是Control Groups是按照层次体系的关系进行组织的。 Control Groups: 一组按照某种标准划分的进程。进程可以从一个Control Groups迁移到另外一个Control Groups中,同时Control Groups中的进程也会受到这个组的资源限制。 Tasks: 在cgroups中,Tasks就是系统的一个进程。
二、cgroup的部署
此实验是基于docker已经安装好的基础上,且使用的系统是rhel7.3 对cpu内存的限制
打开docker并检测cgroup是否开启
[ root@foundation19
~ ] # systemctl start docker
[ root@foundation19
~ ] # mount
- t cgroup ##都显示on即可
查看cgroup子系统的层级路径
[ root@foundation19
~ ] # cd
/ sys
/ fs
/ cgroup
/
[ root@foundation19 cgroup
] # ll
total
0
drwxr
- xr
- x
. 5 root root
0 Mar
23 08 : 57 blkio
lrwxrwxrwx
. 1 root root
11 Mar
23 08 : 57 cpu
- > cpu
, cpuacct
lrwxrwxrwx
. 1 root root
11 Mar
23 08 : 57 cpuacct
- > cpu
, cpuacct
drwxr
- xr
- x
. 5 root root
0 Mar
23 08 : 57 cpu
, cpuacct
drwxr
- xr
- x
. 3 root root
0 Mar
23 08 : 57 cpuset
drwxr
- xr
- x
. 5 root root
0 Mar
23 08 : 57 devices
drwxr
- xr
- x
. 3 root root
0 Mar
23 08 : 57 freezer
drwxr
- xr
- x
. 3 root root
0 Mar
23 08 : 57 hugetlb
drwxr
- xr
- x
. 5 root root
0 Mar
23 08 : 57 memory
lrwxrwxrwx
. 1 root root
16 Mar
23 08 : 57 net_cls
- > net_cls
, net_prio
drwxr
- xr
- x
. 3 root root
0 Mar
23 08 : 57 net_cls
, net_prio
lrwxrwxrwx
. 1 root root
16 Mar
23 08 : 57 net_prio
- > net_cls
, net_prio
drwxr
- xr
- x
. 3 root root
0 Mar
23 08 : 57 perf_event
drwxr
- xr
- x
. 3 root root
0 Mar
23 08 : 57 pids
drwxr
- xr
- x
. 5 root root
0 Mar
23 08 : 57 systemd
建立一个CPU控制族群
首先进入cpu子系统对应的层级路径下:cd /sys/fs/cgroup/cpu 通过新建文件夹创建一个cpu控制族群:mkdir x1,即新建了一个cpu控制族群:x1 新建x1之后,可以看到目录下自动建立了相关的文件,这些文件是伪文件。
[ root@foundation19 cgroup
] # cd cpu
[ root@foundation19 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@foundation19 cpu
] # mkdir x1
[ root@foundation19 cpu
] # cd x1
/
[ root@foundation19 x1
] # ll
total
0
- rw
- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 cgroup
. clone_children
-- w
-- w
-- w
- . 1 root root
0 Mar
23 10 : 18 cgroup
. event_control
- rw
- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 cgroup
. procs
- r
-- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 cpuacct
. stat
- rw
- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 cpuacct
. usage
- r
-- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 cpuacct
. usage_percpu
- rw
- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 cpu
. cfs_period_us
- rw
- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 cpu
. cfs_quota_us
- rw
- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 cpu
. rt_period_us
- rw
- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 cpu
. rt_runtime_us
- rw
- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 cpu
. shares
- r
-- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 cpu
. stat
- rw
- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 notify_on_release
- rw
- r
-- r
-- . 1 root root
0 Mar
23 10 : 18 tasks
测试限制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。
[ root@foundation19 x1
] # cat cpu
. cfs_period_us
100000
[ root@foundation19 x1
] # cat cpu
. cfs_quota_us ##默认为
- 1 ,表示不限制
- 1 [ root@foundation19 x1
] # echo
20000 > cpu
. cfs_quota_us
[ root@foundation19 x1
] # cat cpu
. cfs_quota_us
20000
[ root@foundation19 x1
] # dd
if = / dev
/ zero
of = / dev
/ null &
[ 1 ] 5548
此时用top查看
创建一个容器,并限制cpu的使用
[ root@foundation19 x1
] # echo
5548 > tasks
[ root@foundation19 x1
] # fg
dd
if = / dev
/ zero
of = / dev
/ null
^ C456424541 + 0 records
in
456424541 + 0 records out
233689364992 bytes ( 234 GB ) copied
, 201.225 s
, 1.2 GB / s
[ root@foundation19 x1
] # docker rm vm1
vm1
[ root@foundation19 x1
] # docker run
- it
-- name vm1
-- cpu
- quota
= 20000 ubuntu
root@
59 cc642e2e74
: / # dd
if = / dev
/ zero
of = / dev
/ null
再开一个shell查看 top > cpu 使用率20% 不做限制则为100%
[ root@foundation19 x1
] # docker run
- it
-- name vm1 ubuntu
root@b57de623c536
: / # dd
if = / dev
/ zero
of = / dev
/ null
[ root@foundation19 cpu
] # pwd
/ sys
/ fs
/ cgroup
/ cpu
[ root@foundation19 cpu
] # cd docker
[ root@foundation19 docker
] # ls
40036 f2187cf8787924db508068bdfb10955d31e5c2cb6baa622afc80adba20a
[ root@foundation19 docker
] # cd
40036 f2187cf8787924db508068bdfb10955d31e5c2cb6baa622afc80adba20a
[ root@foundation19
40036 f2187cf8787924db508068bdfb10955d31e5c2cb6baa622afc80adba20a
] # cat cpu
. cfs_quota_us
20000 ##显示刚才所设置的大小
首先可以查看一下分区
[ root@foundation19
~ ] # docker run
- it
-- rm
-- privileged
= true ubuntu
root@
0 dacba0df90d
: / # fdisk
- lDisk
/ dev
/ sda
: 320.1 GB , 320072933376 bytes
255 heads
, 63 sectors
/ track
, 38913 cylinders
, total
625142448 sectors
Units
= sectors
of 1 * 512 = 512 bytes
Sector
size ( logical
/ physical
) : 512 bytes
/ 512 bytes
I / O size ( minimum
/ optimal
) : 512 bytes
/ 512 bytes
Disk identifier
: 0x00023675 Device Boot Start End Blocks Id System
/ dev
/ sda1
* 2048 613081087 306539520 83 Linux
/ dev
/ sda2
613081088 625141759 6030336 82 Linux swap
/ Solaris
测试
[ root@foundation19
~ ] # docker run
- it
-- rm
-- device
- write
- bps
/ dev
/ sda
: 30 M ubuntu ##写入速度为每秒
30 M
root@
9810 eb110add
: / # dd
if = / dev
/ zero
of = file bs
= 1 M count
= 300
限制内存的占用 此实验是新开了一个虚拟机,不想对物理机做过多的更改
虚拟机安装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@docker1 lxcfs
] # ls
[ root@docker1 lxcfs
] # cd
[ root@docker1
~ ] # lxcfs
/ var / lib
/ lxcfs
/ &
[ 1 ] 1197
[ root@docker1
~ ] # hierarchies
: 0 : fd
: 5 : perf_event
1 : fd
: 6 : devices
2 : fd
: 7 : freezer
3 : fd
: 8 : net_prio
, net_cls
4 : fd
: 9 : cpuset
5 : fd
: 10 : pids
6 : fd
: 11 : hugetlb
7 : fd
: 12 : memory
8 : fd
: 13 : cpuacct
, cpu
9 : fd
: 14 : blkio
10 : fd
: 15 : name
= systemd
测试
[ root@docker1
~ ] # cd
/ var / lib
/ lxcfs
/
[ root@docker1 lxcfs
] # ls
cgroup proc
[ root@docker1 lxcfs
] # cd proc
/
[ root@docker1 proc
] # ls
cpuinfo diskstats meminfo stat swaps uptime##不设置的时候和虚拟机的内存是一样的
[ root@docker1 proc
] # free
- mtotal used free shared buff
/ cache available
Mem
: 992 124 543 6 325 713
Swap
: 2047 0 2047 [ root@docker1 proc
] # docker run
- it
-- name vm1 ubuntu
root@
20 f6cdfa82f1
: / # free
- mtotal used free shared buffers cached
Mem
: 992 460 532 6 0 290
- / + buffers
/ cache
: 169 823
Swap
: 2047 0 2047
[ root@docker1 proc
] # docker run
- it
-- name vm1
- m
200 m
- 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@
322 f87592f39
: / # free
- m
总结
以上是生活随笔 为你收集整理的Docker容器之cgroup搭建 的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔 网站内容还不错,欢迎将生活随笔 推荐给好友。