生活随笔
收集整理的這篇文章主要介紹了
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搭建 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。