Control Group(CGroup)資源限制組


  控制組(CGroups)是Linux內核的一個特性,主要用來對共享資源進行隔離、限制、審計等。只有能控制分配到容 器的資源,才能避免多個容器同時運行時對宿主機系統的資源競爭。控制組可以提供對容器的內存、CPU、磁盤IO等 資源進行限制和計費管理。控制組的設計目標是為不同的應用情況提供統一的接口,從控制單一進程(比如nice工 具)到系統級虛擬化(包括OpenVZ、Linux-VServer、LXC等)

  具體來看,控制組提供:
  資源限制(Resource limiting):可以將組設置為不超過設定的內存限制。比如:內存子系統可以為進程組設定一個 內存使用上限,一旦進程組使用的內存達到限額再申請內存,就會出發Out of Memory警告。 優先級 (Prioritization):通過優先級讓一些組優先得到更多的CPU等資源。 資源審計(Accounting):用來統計系統實 際上把多少資源用到適合的目的上,可以使用cpuacct子系統記錄某個進程組使用的CPU時間。 隔離(isolation): 為組隔離命名空間,這樣一個組不會看到另一個組的進程、網絡連接和文件系統。 控制(Control):掛起、恢復和 重啟動等操作。
  cgroups: Control Groups 基於進程的限制,而非用戶,因此對於超戶運行的進程也是一樣
  cgroup將各種子系統定義為資源,命名為controller: 可配額/可度量 - Control Groups (cgroups)
  cgroups實現了對資源的配額和度量九大子系統的資源
  1. blkio 限制每個塊設備的輸入輸出控制。例如:磁盤,光盤以及usb

  2. cpu 限制使用cpu比例

  3. cpuacct 產生cgroup任務的cpu資源報告。

  4. cpuset 多核心的cpu時為cgroup任務分配單獨的cpu和內存

  5. devices 允許或拒絕對設備的訪問。

  6. freezer 暫停和恢復cgroup任務。

  7. memory 設置內存限制以及產生內存資源報告。

   8. net_cls 標記每個網絡包。

  9. ns 名稱空間子系統

  例如:對某個進程使用內存進行限制步驟:
  1. 需要在controller memory下建立cgroup,如nginx_mem控制組,並針對該控制組nginx_mem設置相應的內存 限制參數

  2. 將進程Nginx分配到 memory controller的控制組(nginx_mem),沒有使用controller則不會限制。
  Cgroup實現資源限制的方法:

  a. cgexec 手動分配   b. cgred 自動分配
  

  Cgroup部署方法

[root@localhost ~]#yum -y install libcgroup*
[root@localhost ~]#systemctl enable cgconfig 
[root@localhost ~]#systemctl start cgconfig 
[root@localhost ~]#man cgconfig.conf

   Cgroup限制步驟

  1,創建cgroup,定義相應的限制

  2,分配程序到cgroup

  案例1:限制進程使用CPU

  1,使用cpu子系統創建兩個cgroup

  配置文件添加配置

#cat /etc/cgconfig.conf
group lesscpu {    
    cpu {        
        cpu.shares=200;    
    }   
} 
group morecpu {    
    cpu {        
        cpu.shares=800;    
    }      
}

   創建兩個組lesscpu和morecpu 200 800指定分配的份額

  重啟服務

[root@localhost ~]#systemctl restart cgconfig1

 

  2.將程序分配到相應的group 實驗中,為了讓兩個進程搶CPU時間片,故意只留一個CPU在線

[root@localhost ~]#lscpu 
[root@localhost ~]#echo 0 > /sys/devices/system/cpu/cpu0/online 
[root@localhost ~]#echo 1 > /sys/devices/system/cpu/cpu1/online

   手動分配

[root@localhost ~]#cgexec -g cpu:lesscpu sha1sum /dev/zero
[root@localhost ~]#cgexec -g cpu:morecpu md5sum /dev/zero
[root@localhost ~]#top

   以上三條命令請在三個shell終端中打開,觀察各進程所占用CPU情況。
  PS:未成功,設置CPU下線不成功

  案例2:限制進程使用Memory

  添加cgroup

#cat /etc/cgconfig.conf
group lessmem {        
    memory {            
         memory.limit_in_bytes=268435465; //物理內存限制256M        
    }   
}

   重啟

[root@localhost ~]#systemctl restart cgconfig

   創建內存盤

[root@localhost ~]# mkdir /mnt/mem_test 
[root@localhost ~]#mount -t tmpfs /dev/shm /mnt/mem_test 
[root@localhost ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=200   //OK 
[root@localhost ~]# cgexec -g memory:lessmem dd if=/dev/zero of=/mnt/mem_test/file bs=1M count=500   //OK 
[root@localhost ~]#free -m

   結果為失敗
  應該寫成如下

group poormem{        
	memory{            
		memory.limit_in_bytes=268435465;     //物理內存限制256M            
		memory.memsw.limit_in_bytes=268435465;  //總內存限制,物理+SWAP        
		}       
}

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM