真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

技術解析系列|阿里PouchContainer資源管理探秘

創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、婁煩網(wǎng)站定制設計、自適應品牌網(wǎng)站建設、H5頁面制作、成都商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設、成都外貿(mào)網(wǎng)站建設公司、高端網(wǎng)站制作、響應式網(wǎng)頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為婁煩等各大城市提供網(wǎng)站開發(fā)制作服務。

技術解析系列 | 阿里 PouchContainer 資源管理探秘


PouchContainer 是阿里巴巴集團開源的高效、企業(yè)級容器引擎技術,擁有隔離性強、可移植性高、資源占用少等特點。可以幫助企業(yè)快速實現(xiàn)存量業(yè)務容器化,同時提高超大規(guī)模下數(shù)據(jù)中心的物理資源利用率。

資源管理是容器運行時的一個重要的部分,本文將給大家介紹PouchContainer資源管理的常用接口和其對應的底層內(nèi)核接口,為了讓讀者加深理解,本文為部分接口提供了測試用例。

1. PouchContainer資源管理常用接口

技術解析系列 | 阿里 PouchContainer 資源管理探秘

2. PouchContainer資源管理底層的內(nèi)核技術

2.1 Memory資管管理

技術解析系列 | 阿里 PouchContainer 資源管理探秘

2.2 cpu資管管理

技術解析系列 | 阿里 PouchContainer 資源管理探秘

2.3 io資管管理

技術解析系列 | 阿里 PouchContainer 資源管理探秘

2.4 其他資源管理接口

技術解析系列 | 阿里 PouchContainer 資源管理探秘

3. PouchContainer資源管理接口詳解與測試方法

以下內(nèi)容針對各資源管理接口做了詳盡的說明。為了加深讀者理解,部分接口提供有測試用例。用例中的PouchContainer版本為0.4.0。如果在你的鏡像中stress命令不可用,你可以通過sudo apt-get install stress來安裝stress工具。

3.1 Memory資管管理

3.1.1 -m, --memory

可以限制容器使用的內(nèi)存量,對應的cgroup文件是cgroup/memory/memory.limit_in_bytes。

單位:b,k,m,g

在默認情況下,容器可以占用無限量的內(nèi)存,直至主機內(nèi)存資源耗盡。

運行如下命令來確認容器內(nèi)存的資源管理對應的cgroup文件。

# pouch run -ti --memory 100M reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/memory/memory.limit_in_bytes"
104857600

可以看到,當內(nèi)存限定為100M時,對應的cgroup文件數(shù)值為104857600,該數(shù)值的單位為字節(jié),即104857600字節(jié)等于100M。

本機內(nèi)存環(huán)境為:

# free -m
             total        used        free      shared  buff/cache   available
Mem:         257755        2557      254234           1         963      254903
Swap:          2047           0        2047

我們使用stress工具來驗證內(nèi)存限定是否生效。stress是一個壓力工具,如下命令將要在容器內(nèi)創(chuàng)建一個進程,在該進程中不斷的執(zhí)行占用內(nèi)存(malloc)和釋放內(nèi)存(free)的操作。在理論上如果占用的內(nèi)存少于限定值,容器會工作正常。注意,如果試圖使用邊界值,即試圖在容器中使用stress工具占用100M內(nèi)存,這個操作通常會失敗,因為容器中還有其他進程在運行。

下面嘗試對一個限制內(nèi)存使用為100M的容器執(zhí)行一個占用150M內(nèi)存的操作,但容器運行是正常的,沒有出現(xiàn)OOM。

# pouch run -ti --memory 100M reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04stress stress --vm 1 --vm-bytes 150M
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd

通過以下命令看一下系統(tǒng)的內(nèi)存使用量,你會發(fā)現(xiàn)Swap的內(nèi)存占用量有所增加,說明--memory選項沒有限制Swap內(nèi)存的使用量。

#free -m
             total        used        free      shared  buff/cache   available
Mem:         257755        2676      254114           1         965      254783
Swap:          2047          41        2006

嘗試使用swapoff -a命令關閉Swap時我們再次執(zhí)行早先的命令。從以下log中可以看到,當容器使用內(nèi)存超過限制時會觸發(fā)錯誤。

# pouch run -ti --memory 100M reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04stress stress --vm 1 --vm-bytes 150M
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 0s
esses
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 0s

3.1.2 --memory-swap

可以限制容器使用交換分區(qū)和內(nèi)存的總和,對應的cgroup文件是cgroup/memory/memory.memsw.limit_in_bytes

取值范圍:大于內(nèi)存限定值

單位:b,k,m,g

運行如下命令來確認容器交換分區(qū)的資源管理對應的cgroup文件。可以看到,當memory-swap限定為1G時,對應的cgroup文件數(shù)值為1073741824,該數(shù)值的單位為字節(jié),即1073741824B等于1G。

# pouch run -ti -m 300M --memory-swap 1G reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/memory/memory.memsw.limit_in_bytes"
1073741824

如下所示,當嘗試占用的內(nèi)存數(shù)量超過memory-swap值時,容器出現(xiàn)異常。

# pouch run -ti -m 100M --memory-swap 200M reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04stress bash -c "stress --vm 1 --vm-bytes 300M"
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: FAIL: [1] (416) <-- worker 10 got signal 9
stress: WARN: [1] (418) now reaping child worker processes
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 0s

3.1.3 --memory-swappiness

該接口可以設定容器使用交換分區(qū)的趨勢,取值范圍為0至100的整數(shù)(包含0和100)。0表示容器不使用交換分區(qū),100表示容器盡可能多的使用交換分區(qū)。對應的cgroup文件是cgroup/memory/memory.swappiness。

# pouch run -ti --memory-swappiness=100 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c 'cat /sys/fs/cgroup/memory/memory.swappiness'
100

3.1.4 --memory-wmark-ratio

用于計算low_wmark,low_wmark = memory.limit_in_bytes * MemoryWmarkRatio。當memory.usage_in_bytes大于low_wmark時,觸發(fā)內(nèi)核線程進行內(nèi)存回收,當回收到memory.usage_in_bytes小于high_wmark時停止。對應的cgroup接口是cgroup/memory/memory.wmark_ratio。

# pouch run -ti --memory-wmark-ratio=60 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c 'cat /sys/fs/cgroup/memory/memory.wmark_ratio'
60

3.1.5 --oom-kill-disable

當out-of-memory (OOM)發(fā)生時,系統(tǒng)會默認殺掉容器進程,如果你不想讓容器進程被殺掉,可以使用該接口。接口對應的cgroup文件是cgroup/memory/memory.oom_control

當容器試圖使用超過限定大小的內(nèi)存值時,就會觸發(fā)OOM。此時會有兩種情況,第一種情況是當接口--oom-kill-disable=false的時候,容器會被殺掉;第二種情況是當接口--oom-kill-disable=true的時候,容器會被掛起。

以下命令設置了容器的的內(nèi)存使用限制為20M,將--oom-kill-disable接口的值設置為true。查看該接口對應的cgroup文件,oom_kill_disable的值為1。

# pouch run -m 20m --oom-kill-disable=true reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c 'cat /sys/fs/cgroup/memory/memory.oom_control'
oom_kill_disable 1
under_oom 0

oom_kill_disable:取值為0或1,當值為1的時候表示當容器試圖使用超出內(nèi)存限制時(即20M),容器會掛起。

under_oom:取值為0或1,當值為1的時候,OOM已經(jīng)出現(xiàn)在容器中。

通過x=a; while true; do x=$x$x$x$x; done命令來耗盡內(nèi)存并強制觸發(fā)OOM,log如下所示。

# pouch run -m 20m --oom-kill-disable=false reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c 'x=a; while true; do x=$x$x$x$x; done'
[root@r10d08216.sqa.zmf /root]
#echo $?
137

通過上面的log可以看出,當容器的內(nèi)存耗盡的時候,容器退出,退出碼為137。因為容器試圖使用超出限定的內(nèi)存量,系統(tǒng)會觸發(fā)OOM,容器會被殺掉,此時under_oom的值為1。我們可以通過系統(tǒng)中cgroup文件(/sys/fs/cgroup/memory/docker/${container_id}/memory.oom_control)查看under_oom的值(oom_kill_disable 1,under_oom 1)。

當--oom-kill-disable=true的時候,容器不會被殺掉,而是被系統(tǒng)掛起。

3.1.6 --oom-score-adj

參數(shù)--oom-score-adj可以設置容器進程觸發(fā)OOM的可能性,值越大時越容易觸發(fā)容器進程的OOM。當值為-1000時,容器進程完全不會觸發(fā)OOM。該選項對應著底層的/proc/$pid/oom_score_adj接口。

# pouch run -ti --oom-score-adj=300 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04stress bash -c "cat /proc/self/oom_score_adj"
300

3.2 cpu資源管理

3.2.1 --cpu-period

內(nèi)核默認的Linux 調(diào)度CFS(完全公平調(diào)度器)周期為100ms,我們通過--cpu-period來設置容器對CPU的使用周期,同時--cpu-period接口需要和--cpu-quota接口一起來使用。--cpu-quota接口設置了CPU的使用值。CFS(完全公平調(diào)度器) 是內(nèi)核默認使用的調(diào)度方式,為運行的進程分配CPU資源。對于多核CPU,根據(jù)需要調(diào)整--cpu-quota的值。

對應的cgroup文件是cgroup/cpu/cpu.cfs_period_us。以下命令創(chuàng)建了一個容器,同時設置了該容器對CPU的使用時間為50000(單位為微秒),并驗證了該接口對應的cgroup文件對應的值。

# pouch run -ti --cpu-period 50000 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/cpu/cpu.cfs_period_us"
50000

以下命令將--cpu-period的值設置為50000,--cpu-quota的值設置為25000。該容器在運行時可以獲取50%的cpu資源。

# pouch run -ti --cpu-period=50000 --cpu-quota=25000 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04stress stress -c 1
stress: info: [1] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd

從log的最后一行中可以看出,該容器的cpu使用率約為50.0%,與預期相符。

# top -n1
top - 17:22:40 up 1 day, 57 min,  3 users,  load average: 0.68, 0.16, 0.05
Tasks: 431 total,   2 running, 429 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 26354243+total, 25960588+free,  1697108 used,  2239424 buff/cache
KiB Swap:  2096636 total,        0 free,  2096636 used. 25957392+avail Mem
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
53256 root      20   0    7324    100      0 R  50.0  0.0   0:12.95 stress

3.2.2 --cpu-quota

對應的cgroup文件是cgroup/cpu/cpu.cfs_quota_us。

# pouch run -ti --cpu-quota 1600 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us"
1600

--cpu-quota接口設置了CPU的使用值,通常情況下它需要和--cpu-period接口一起來使用。具體使用方法請參考--cpu-period選項。

3.2.3 --cpu-share

對應的cgroup文件是cgroup/cpu/cpu.shares。

# pouch run -ti --cpu-quota 1600 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/cpu/cpu.shares"
1600

通過--cpu-shares可以設置容器使用CPU的權重,這個權重設置是針對CPU密集型的進程的。如果某個容器中的進程是空閑狀態(tài),那么其它容器就能夠使用本該由空閑容器占用的CPU資源。也就是說,只有當兩個或多個容器都試圖占用整個CPU資源時,--cpu-shares設置才會有效。

我們使用如下命令來創(chuàng)建兩個容器,它們的權重分別為1024和512。

# pouch run -d --cpuset-cpus=0 --cpu-share 1024 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04stress stress -c 1
c7b99f3bc4cf1af94da35025c66913d4b42fa763e7a0905fc72dce66c359c258
[root@r10d08216.sqa.zmf /root]
# pouch run -d --cpuset-cpus=0 --cpu-share 512 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04stress stress -c 1
1ade73df0dd9939cc65e05117e3b0950b78079fb36f6cc548eff8b20e8f5ecb9

從如下top命令的log可以看到,第一個容器產(chǎn)生的進程PID為10513,CPU占用率為65.1%,第二個容器產(chǎn)生進程PID為10687,CPU占用率為34.9%。兩個容器CPU占用率約為2:1的關系,測試結(jié)果與預期相符。

#top
top - 09:38:24 up 3 min,  2 users,  load average: 1.20, 0.34, 0.12
Tasks: 447 total,   3 running, 444 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.1 us,  0.0 sy,  0.0 ni, 96.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 26354243+total, 26187224+free,   964068 used,   706120 buff/cache
KiB Swap:  2096636 total,  2096636 free,        0 used. 26052548+avail Mem
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
10513 root      20   0    7324    100      0 R  65.1  0.0   0:48.22 stress
10687 root      20   0    7324     96      0 R  34.9  0.0   0:20.32 stress

3.2.4 --cpuset-cpus

該接口對應的cgroup文件是cgroup/cpuset/cpuset.cpus。

在多核CPU的虛擬機中,啟動一個容器,設置容器只使用CPU核1,并查看該接口對應的cgroup文件會被修改為1,log如下所示。

# pouch run -ti --cpuset-cpus 1 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/cpuset/cpuset.cpus"
1

通過以下命令指定容器使用cpu核1,并通過stress命令加壓。

# pouch run -ti --cpuset-cpus 1 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 stress -c 1

查看CPU資源的top命令的log如下所示。需要注意的是,輸入top命令并按回車鍵后,再按數(shù)字鍵1,終端才能顯示每個CPU的狀態(tài)。

#top
top - 17:58:38 up 1 day,  1:33,  3 users,  load average: 0.51, 0.11, 0.04
Tasks: 427 total,   2 running, 425 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

從以上log得知,只有CPU核1的負載為100%,而其它CPU核處于空閑狀態(tài),結(jié)果與預期結(jié)果相符。

3.2.5 --cpuset-mems

該接口對應的cgroup文件是cgroup/cpuset/cpuset.mems。

# pouch run -ti --cpuset-mems=0 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/cpuset/cpuset.mems"
0

以下命令將限制容器進程使用內(nèi)存節(jié)點1、3的內(nèi)存。

# pouch run -ti --cpuset-mems="1,3" reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash

以下命令將限制容器進程使用內(nèi)存節(jié)點0、1、2的內(nèi)存。

# pouch run -ti --cpuset-mems="0-2" reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash

3.3 io資管管理

3.3.1 --blkio-weight

通過--blkio-weight接口可以設置容器塊設備IO的權重,有效值范圍為10至1000的整數(shù)(包含10和1000)。默認情況下,所有容器都會得到相同的權重值(500)。對應的cgroup文件為cgroup/blkio/blkio.weight。以下命令設置了容器塊設備IO權重為10,在log中可以看到對應的cgroup文件的值為10。

# pouch run -ti --rm --blkio-weight 10 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/blkio/blkio.weight"
10

通過以下兩個命令來創(chuàng)建不同塊設備IO權重值的容器。

# pouch run -it --name c1 --blkio-weight 300 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 /bin/bash
# pouch run -it --name c2 --blkio-weight 600 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 /bin/bash

如果在兩個容器中同時進行塊設備操作(例如以下命令)的話,你會發(fā)現(xiàn)所花費的時間和容器所擁有的塊設備IO權重成反比。

# time dd if=/mnt/zerofile of=test.out bs=1M count=1024 oflag=direct

3.3.2 --blkio-weight-device

通過--blkio-weight-device="設備名:權重"接口可以設置容器對特定塊設備IO的權重,有效值范圍為10至1000的整數(shù)(包含10和1000)。

對應的cgroup文件為cgroup/blkio/blkio.weight_device。

# pouch run --blkio-weight-device "/dev/sda:1000" reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/blkio/blkio.weight_device"
8:0 1000

以上log中的"8:0"表示sda的設備號,可以通過stat命令來獲取某個設備的設備號。從以下log中可以查看到/dev/sda對應的主設備號為8,次設備號為0。

#stat -c %t:%T /dev/sda
8:0

如果--blkio-weight-device接口和--blkio-weight接口一起使用,那么Docker會使用--blkio-weight值作為默認的權重值,然后使用--blkio-weight-device值來設定指定設備的權重值,而早先設置的默認權重值將不在這個特定設備中生效。

# pouch run --blkio-weight 300 --blkio-weight-device "/dev/sda:500" reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/blkio/blkio.weight_device"
8:0 500

通過以上log可以看出,當--blkio-weight接口和--blkio-weight-device接口一起使用的時候,/dev/sda設備的權重值由--blkio-weight-device設定的值來決定。

3.3.3 --device-read-bps

該接口用來限制指定設備的讀取速率,單位可以是kb、mb或者gb。對應的cgroup文件是cgroup/blkio/blkio.throttle.read_bps_device。

# pouch run -it --device /dev/sda:/dev/sda --device-read-bps /dev/sda:1mb reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device"
8:0 1048576

以上log中顯示8:0 1000,8:0表示/dev/sda, 該接口對應的cgroup文件的值為1048576,是1MB所對應的字節(jié)數(shù),即1024的平方。

創(chuàng)建容器時通過--device-read-bps接口設置設備讀取速度為500KB/s。從以下log中可以看出,讀取速度被限定為498KB/s,與預期結(jié)果相符合。

# pouch run -it --device /dev/sda:/dev/sda --device-read-bps /dev/sda:500k reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash
root@r10f10195:/# dd iflag=direct,nonblock if=/dev/sda of=/dev/null bs=5000k coun
1+0 records in
1+0 records out
5120000 bytes (5.1 MB) copied, 10.2738 s, 498 kB/s

3.3.4 --device-write-bps

該接口用來限制指定設備的寫速率,單位可以是kb、mb或者gb。對應的cgroup文件是cgroup/blkio/blkio.throttle.write_bps_device。

# pouch run -it --device /dev/sda:/dev/sda --device-write-bps /dev/sda:1mB reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device"
8:0 1048576

以上log中顯示8:0 1000,8:0表示/dev/sda, 該接口對應的cgroup文件的值為1048576,是1MB所對應的字節(jié)數(shù),即1024的平方。

創(chuàng)建容器時通過--device-write-bps接口設置設備寫速度為1MB/s。從以下log中可以看出,讀取速度被限定為1.0MB/s,與預期結(jié)果相符合。

限速操作:

# pouch run -it --device /dev/sdb:/dev/sdb --device-write-bps /dev/sdb:1mB reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash
root@r10d08216:/# dd oflag=direct,nonblock of=/dev/sdb if=/dev/urandom bs=10K count=1000
1024+0 records in
1024+0 records out
10485760 bytes (10 MB) copied, 10.0022 s, 1.0 MB/s

3.3.5 --device-read-iops

該接口設置了設備的IO讀取速率,對應的cgroup文件是cgroup/blkio/blkio.throttle.read_iops_device。

# pouch run -it --device /dev/sda:/dev/sda --device-read-iops /dev/sda:400 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/blkio/blkio.throttle.read_iops_device"
8:0 400

可以通過"--device-read-iops /dev/sda:400"來限定sda的IO讀取速率(400次/秒),log如下所示。

# pouch run -it --device /dev/sda:/dev/sda --device-read-iops /dev/sda:400 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash
root@r10d08216:/# dd iflag=direct,nonblock if=/dev/sda of=/dev/null bs=1k count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 2.51044 s, 418 kB/s
root@r10d08216:/#

通過上面的log信息可以看出,容器每秒IO的讀取次數(shù)為400,共需要讀取1024次(log第二行:count=1024),測試結(jié)果顯示執(zhí)行時間為2.51044秒,與預期值2.56(1024/400)秒接近,符合預期。

3.3.6 --device-write-iops

該接口設置了設備的IO寫速率,對應的cgroup文件是cgroup/blkio/blkio.throttle.write_iops_device

# pouch run -it --device /dev/sda:/dev/sda --device-write-iops /dev/sda:400 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash -c "cat /sys/fs/cgroup/blkio/blkio.throttle.write_iops_device"
8:0 400

可以通過"--device-write-iops /dev/sda:400"來限定sda的IO寫速率(400次/秒),log如下所示。

# pouch run -it --device /dev/sdb:/dev/sdb --device-write-iops /dev/sdb:400 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04 bash
root@r10d08216:/# dd oflag=direct,nonblock of=/dev/sdb if=/dev/urandom bs=1K count=1024
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 2.50754 s, 418 kB/s

通過上面的log信息可以看出,容器每秒IO的寫入次數(shù)為400,共需要寫1024次(log第二行:count=1024),測試結(jié)果顯示執(zhí)行時間為2.50754秒,與預期值2.56(1024/400)秒接近,符合預期。

3.4 其他資源管理接口

--pids-limit

--pids-limit用于限制容器內(nèi)部的pid數(shù)量,對應的cgroup接口是cgroup/pids/pids.max。

# pouch run -ti --pids-limit 100 reg.docker.alibaba-inc.com/sunyuan/ubuntu:14.04stress bash -c "cat /sys/fs/cgroup/pids/pids.max"
100

如果在容器內(nèi)部不斷創(chuàng)建新的進程,系統(tǒng)會提示如下錯誤。

bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable

4. 總結(jié)

PouchContainer的資源管理依賴于Linux底層的內(nèi)核技術,感興趣的讀者可以根據(jù)自己興趣補充一些有針對性的測試。關于其依賴的內(nèi)核技術的實現(xiàn)已經(jīng)遠超本文的范疇。感興趣的讀者可以自行閱讀內(nèi)核手冊。



網(wǎng)站欄目:技術解析系列|阿里PouchContainer資源管理探秘
當前網(wǎng)址:http://weahome.cn/article/goicoj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部