1. 程式人生 > >Docker關於cpu,記憶體,硬碟的管理

Docker關於cpu,記憶體,硬碟的管理

docker所建立的容器使用cgroup來分配資源

[[email protected] ~]# cd /
[[email protected] /]# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
#預設是看不到cgroup這個目錄的。

yum install -y libcgroup
/etc/init.d/cgconfig start  #開啟之後會出現cgroup這個目錄
[[email protected]
/]# ls bin cgroup etc lib lost+found mnt proc sbin srv tmp var boot dev home lib64 media opt root selinux sys usr

cpu的控制

vim /etc/cgconfig.conf 
group x1 {
        cpu {
                cpu.shares = 100;         #表示子控制優先順序為100
        }
}
[[email protected] cgroup]# /etc/init.d/cgconfig resart
#在cpu.shares檔案中,可以對程序排程程式所處理的程序組設定CPU時間分配的比重

 

cat cpu.shares
100

 由圖片可以看見父控制的cpu時間分配值為1024,子控制的cpu時間分配值為100

給server4新增兩個cpu:

使用 lscpu 可以用來檢視cpu個數

測試兩個cu的使用情況:
 

[[email protected] ~]# dd if=/dev/zero of=/dev/null &

 只有一個cpu正在被使用

[[email protected] ~]# dd if=/dev/zero of=/dev/null &

 

此時可以看見兩個cpu同時工作,各自處理一條請求。

 此時主機總共兩顆cpu,其中cpu0為原本的cpu,cpu1為新新增的cpu,新新增的cpu依次命名,其中,新增的cpu是可以停用的

 可以看見新新增cpu預設是開啟的。
此時執行兩條命令:dd if=/dev/zero of=/dev/null &
可以看見:

兩條命令分別執行在一個cpu上。

停用cpu1,再次top檢視:

可以發現兩條命令在同一個cpu上執行。

檢視子控制組x1對cpu0的控制:

關掉cpu1,可以看見使用子控制來管理執行在cpu上的服務時,cpu時間分配值小的佔用cpu更少

凍結程序:
有些程序對cpu的消耗特別大,但是又不能kill掉,避免對其他程序的影響,應該凍結。

vim /etc/cgconfig.conf 
group x1 {
        freezer {
                }
}
[[email protected] cgroup]# /etc/init.d/cgconfig resart

 

凍結程序:

 可以看見程序凍結後,不再消耗cpu資源。
使用命令:ps ax 可以看見程序被凍結:

對記憶體的控制

分離出200M記憶體進行控制演示:

vim /etc/cgconfig
group x1 {
        cpu {
                cpu.shares = 100;
        }

        memory {
                memory.limit_in_bytes = 209715200;  #指定控制的記憶體大小為200M,如果只有此引數,在使用控制的記憶體超過200M時,會使用swap分割槽來頂替
                memory.memsw.limit_in_bytes = 209715200;  #限制所控制的記憶體和swap分割槽全部加起來為200M
        }
}
[[email protected] ~]# /etc/init.d/cgconfig restart

 [[email protected] ~]# cd /dev/shm/ #一定要在此目錄下執行以下命令

 

可以看出未使用子控制系統x1時,可以隨意的耗費記憶體。

 

 使用x1控制時,可以看出最多耗費的記憶體不能超過200M。

利用記憶體控制對應用的訪問:

        cpu {
                cpu.shares = 100;
        }

        memory {
                memory.limit_in_bytes = 20480000;
                memory.memsw.limit_in_bytes = 20480000;
        }
}
[[email protected] ~]$ vim /etc/cgrules.conf 
ly:memapp2                      memory          x1/
ly:memapp1                      memory          x1/



[[email protected] ~]$ /etc/init.d/cgconfig restart
[[email protected] ~]$ /etc/init.d/cgred restart

#本地測試
[[email protected] shm]# cgexec -g memory:x1 /home/ly/memapp2

Process ID is: 1147

Grabbing 8192 pages of memory
Killed
[[email protected] shm]# cgexec -g memory:x1 /home/ly/memapp1

Process ID is: 1148

Grabbing 4096 pages of memory

Success!

#切換到使用者
[[email protected] shm]# su - ly
[[email protected] ~]$ ./memapp1 

Process ID is: 1169

Grabbing 4096 pages of memory

Success!

Press any key to exit

[[email protected] ~]$ ./memapp2

Process ID is: 1170

Grabbing 8192 pages of memory
Killed