1. 程式人生 > >Docker資源限制

Docker資源限制

一、基礎知識

blkio: 這個subsystem可以為塊裝置設定輸入/輸出限制,比如物理驅動裝置(包括磁碟、固態硬碟、USB等)。
cpu: 這個subsystem使用排程程式控制task對CPU的使用。
cpuacct: 這個subsystem自動生成cgroup中task對CPU資源使用情況的報告。
cpuset: 這個subsystem可以為cgroup中的task分配獨立的CPU(此處針對多處理器系統)和記憶體。
devices 這個subsystem可以開啟或關閉cgroup中task對裝置的訪問。
freezer 這個subsystem可以掛起或恢復cgroup中的task。
memory

這個subsystem可以設定cgroup中task對記憶體使用量的限定,並且自動生成這些task對記憶體資源使用情況的報告。
perfevent 這個subsystem使用後使得cgroup中的task可以進行統一的效能測試。{![perf: Linux CPU效能探測器,詳見https://perf.wiki.kernel.org/index.php/MainPage]}
*net_cls 這個subsystem Docker沒有直接使用,它通過使用等級識別符(classid)標記網路資料包,從而允許 Linux 流量.

二、Docker資源限制

環境部署:

Redhat6.5版本
記憶體=1024M
CPU個數=2

具體部署:

  • unlimit -m 對最大記憶體不進行限制
    在這裡插入圖片描述
  • ulimit – a 顯示當前所有的 limit 資訊
    在這裡插入圖片描述

一、無限佔用記憶體

[[email protected] ~]# useradd zh   ##新建使用者zh
[[email protected] ~]# su - zh
[[email protected] ~]$ ulimit -m
unlimited
[[email protected] ~]$ :(){ :|:& };:   ##shell記憶體炸彈,無限制開啟shell
  • 無限制開啟shell
    在這裡插入圖片描述

二、設定 記憶體+交換分割槽 < = 200M

1、安裝cgroup服務
[[email protected] ~]# yum search cgroup
[[email protected] ~]# yum install -y libcgroup.x86_64
[[email protected] ~]# /etc/init.d/cgconfig start
[[email protected] ~]# cd /cgroup/memory/
[[email protected] memory]# cat memory.limit_in_bytes   ##檢視配置檔案可知,記憶體未做限制
9223372036854775807
  • 記憶體限制檔案
    在這裡插入圖片描述
2、設定資源限制引數:記憶體+交換分割槽<=200M
[[email protected] ~]# vim /etc/cgconfig.conf 
 28 group x1 {
 29         memory {
 30                 memory.limit_in_bytes = 209715200;
 31                 memory.memsw.limit_in_bytes = 209715200; ##完全限制記憶體
 32                 }
 33 }
[[email protected] ~]# /etc/init.d/cgconfig restart
[[email protected] ~]# cd /cgroup/memory/x1/
[[email protected] x1]# ls
cgroup.event_control       memory.memsw.limit_in_bytes      memory.swappiness
cgroup.procs               memory.memsw.max_usage_in_bytes  memory.usage_in_bytes
memory.failcnt             memory.memsw.usage_in_bytes      memory.use_hierarchy
memory.force_empty         memory.move_charge_at_immigrate  notify_on_release
memory.limit_in_bytes      memory.oom_control               tasks
memory.max_usage_in_bytes  memory.soft_limit_in_bytes
memory.memsw.failcnt       memory.stat
[[email protected] x1]# cat memory.limit_in_bytes 
209715200
[[email protected] x1]# cat memory.memsw.limit_in_bytes 
209715200
  • Mem used : 419
    在這裡插入圖片描述
3、測試
[[email protected] ~]# cd /dev/shm/
[[email protected] shm]# cgexec -g memory:x1 dd if=/dev/zero of=file bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.073585 s, 1.4 GB/s
[[email protected] shm]# cgexec -g memory:x1 dd if=/dev/zero of=file bs=1M count=200
Killed
  • Mem used : 619 = 419 +200
    在這裡插入圖片描述
    在這裡插入圖片描述

三、針對使用者的記憶體資源限制

[[email protected] ~]# vim /etc/cgrules.conf 
 11 zh              memory          x1/
[[email protected] ~]# /etc/init.d/cgred start
[[email protected] ~]# cd /dev/shm/
[[email protected] shm]# ls
file
[[email protected] shm]# rm -fr file      ##刪除200M的file檔案
測試:
[[email protected] shm]# su - zh
[[email protected] ~]$ cd /dev/shm/
[[email protected] shm]$ dd if=/dev/zero of=file bs=1M count=300
Killed
[[email protected] shm]$ logout

在這裡插入圖片描述

四、針對cpu的限制

對cpu.shares寫入整數值可以控制該cgroup獲得的時間片
[[email protected] ~]# vim /etc/cgconfig.conf 
 34 group x2 {         
 35          cpu {   
 36                  cpu.shares = 100;
 37              }
 38 }
[[email protected] ~]# /etc/init.d/cgconfig restart
[[email protected] ~]# cd /cgroup/cpu/x2/          ##檢視cpu的限制
[[email protected] x2]# cat cpu.shares 
100
測試:
[[email protected] ~]# cgexec -g cpu:x2 dd if=/dev/zero of=/dev/null &
[1] 6299
[[email protected] ~]# dd if=/dev/zero of=/dev/null &
[2] 6394
  • top 鍵 檢視cpu接近100%
    在這裡插入圖片描述
  • top鍵 再按 1 出現兩個cpu(只有cpu1可改,cpu0不可改)
    在這裡插入圖片描述
  • 更改cpu1
[[email protected] ~]# cd /sys/devices/system/cpu/cpu1
[[email protected] cpu1]# cat online    ##cpu1線上
1
[[email protected] cpu1]# echo 0 > online    ##使cpu1下線
[[email protected] cpu1]# top

示圖:cpu1下線,只有cpu0線上,兩個程序的cpu之和為100%
在這裡插入圖片描述

五、針對io的限制

[[email protected] ~]# cat /cgroup/blkio/blkio.throttle.read_bps_device     ##無io限制
[[email protected] ~]# vim /etc/cgconfig.conf 
 39 group x3 {
 40          blkio {
 41                  blkio.throttle.read_bps_device ="252:0 1000000";    #設定io輸入、輸出速率為1M
 42              }
 43 }
 [[email protected] ~]# /etc/init.d/cgconfig restart
測試:
[[email protected] ~]# cgexec -g blkio:x3 dd if=/dev/vda of=/dev/null &
[1] 10424
[[email protected] ~]# yum install -y iotop
[[email protected] ~]# iotop 
  • io輸入、輸出基本穩定1M左右
    在這裡插入圖片描述

六、程序凍結(程序中止,但依舊存在)

[[email protected] ~]# cat /cgroup/freezer/x4/tasks    ##無程序任務
[[email protected] ~]# vim /etc/cgconfig.conf 
group x4 {
        freezer {}
}
[[email protected] ~]# /etc/init.d/cgconfig restart
[[email protected] ~]# cgexec -g blkio:x3 dd if=/dev/vda of=/dev/null &
[1] 2313
[[email protected] ~]# cd /cgroup/freezer/x4/
[[email protected] x4]# echo 2313 > tasks
[[email protected] x4]# cat freezer.state 
THAWED                        ##程序解凍
測試:
  • 程序凍結
[[email protected] x4]# echo FROZEN > freezer.state          

示圖: ps命令檢視程序,程序存在
在這裡插入圖片描述
示圖: iotop檢視程序,程序不存在,程序凍結
在這裡插入圖片描述

  • 程序解凍
[[email protected] x4]# echo THAWED > freezer.state

示圖: ps命令檢視程序,程序存在
在這裡插入圖片描述
示圖: iotop檢視程序,程序存在,程序解凍
在這裡插入圖片描述

七、CPU繫結

所謂的cpu繫結,其實將當前程序或執行緒繫結到固定的CPU核心或者執行緒繫結到固定的CPU核心來提高系統排程程式的效率來提高程式執行的效率。
[[email protected] ~]# vim /etc/cgconfig.conf 
group x5 {
        cpuset {
                cpuset.cpus = 1;          ##2號cpu
                cpuset.mems = 0;          ##記憶體片
        }
}
[[email protected] ~]# /etc/init.d/cgconfig restart
測試:
當執行x5時,佔用cpu1;
[[email protected] ~]# cgexec -g cpuset:x5 dd if=/dev/vda of=/dev/null &
[1] 2285
[[email protected] ~]# top
  • 資源優先執行在cpu1上
    在這裡插入圖片描述
正常執行dd命令,佔用Cpu0(Maybe:Cpu1)
[[email protected] ~]# dd if=/dev/zero of=/dev/null &
[1] 2708