生活随笔
收集整理的這篇文章主要介紹了
Docker容器之cgroup搭建
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、知識(shí)剖析
什么是cgroup
Cgroups 是 control groups 的縮寫,是 Linux 內(nèi)核提供的一種可以限制、記錄、隔離進(jìn)程組(process groups)所使用的物理資源(如:cpu,memory,IO等等)的機(jī)制。最初由 google 的工程師提出,后來被整合進(jìn) Linux 內(nèi)核。Cgroups 也是 LXC 為實(shí)現(xiàn)虛擬化所使用的資源管理手段,可以說沒有cgroups就沒有LXC。
cgroup可以干什么
限制進(jìn)程組可以使用的資源數(shù)量 (Resource limiting )。比如:memory子系統(tǒng)可以為進(jìn)程組設(shè)定一個(gè)memory使用上限,一旦進(jìn)程組使用的內(nèi)存達(dá)到限額再申請(qǐng)內(nèi)存,就會(huì)出發(fā)OOM(out of memory)。
進(jìn)程組的優(yōu)先級(jí)控制 (Prioritization )。比如:可以使用cpu子系統(tǒng)為某個(gè)進(jìn)程組分配特定cpu share。
記錄進(jìn)程組使用的資源數(shù)量 (Accounting )。比如:可以使用cpuacct子系統(tǒng)記錄某個(gè)進(jìn)程組使用的cpu時(shí)間
進(jìn)程組隔離 (Isolation)。比如:使用ns子系統(tǒng)可以使不同的進(jìn)程組使用不同的namespace,以達(dá)到隔離的目的,不同的進(jìn)程組有各自的進(jìn)程、網(wǎng)絡(luò)、文件系統(tǒng)掛載空間。
進(jìn)程組控制 (Control)。比如:使用freezer子系統(tǒng)可以將進(jìn)程組掛起和恢復(fù)。
cgroup中需要了解的四個(gè)概念
Subsystems: 稱之為子系統(tǒng),一個(gè)子系統(tǒng)就是一個(gè)資源控制器,比如 cpu子系統(tǒng)就是控制cpu時(shí)間分配的一個(gè)控制器。 Hierarchies: 可以稱之為層次體系也可以稱之為繼承體系,指的是Control Groups是按照層次體系的關(guān)系進(jìn)行組織的。 Control Groups: 一組按照某種標(biāo)準(zhǔn)劃分的進(jìn)程。進(jìn)程可以從一個(gè)Control Groups遷移到另外一個(gè)Control Groups中,同時(shí)Control Groups中的進(jìn)程也會(huì)受到這個(gè)組的資源限制。 Tasks: 在cgroups中,Tasks就是系統(tǒng)的一個(gè)進(jìn)程。
二、cgroup的部署
此實(shí)驗(yàn)是基于docker已經(jīng)安裝好的基礎(chǔ)上,且使用的系統(tǒng)是rhel7.3 對(duì)cpu內(nèi)存的限制
打開docker并檢測(cè)cgroup是否開啟
[ root@foundation19
~ ] # systemctl start docker
[ root@foundation19
~ ] # mount
- t cgroup ##都顯示on即可
查看cgroup子系統(tǒng)的層級(jí)路徑
[ 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
建立一個(gè)CPU控制族群
首先進(jìn)入cpu子系統(tǒng)對(duì)應(yīng)的層級(jí)路徑下:cd /sys/fs/cgroup/cpu 通過新建文件夾創(chuàng)建一個(gè)cpu控制族群:mkdir x1,即新建了一個(gè)cpu控制族群:x1 新建x1之后,可以看到目錄下自動(dòng)建立了相關(guān)的文件,這些文件是偽文件。
[ 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
測(cè)試限制cpu的使用
我們的測(cè)試示例主要用到cpu.cfs_period_us和cpu.cfs_quota_us兩個(gè)文件。 cpu.cfs_period_us:cpu分配的周期(微秒),默認(rèn)為100000。 cpu.cfs_quota_us:表示該control group限制占用的時(shí)間(微秒),默認(rèn)為-1,表示不限制。如果設(shè)為20000,表示占用20000/100000=20%的CPU。
[ root@foundation19 x1
] # cat cpu
. cfs_period_us
100000
[ root@foundation19 x1
] # cat cpu
. cfs_quota_us ##默認(rèn)為
- 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
此時(shí)用top查看
創(chuàng)建一個(gè)容器,并限制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
再開一個(gè)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 ##顯示剛才所設(shè)置的大小
首先可以查看一下分區(qū)
[ 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
測(cè)試
[ 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
限制內(nèi)存的占用 此實(shí)驗(yàn)是新開了一個(gè)虛擬機(jī),不想對(duì)物理機(jī)做過多的更改
虛擬機(jī)安裝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
測(cè)試
[ 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##不設(shè)置的時(shí)候和虛擬機(jī)的內(nèi)存是一樣的
[ 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
總結(jié)
以上是生活随笔 為你收集整理的Docker容器之cgroup搭建 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。