文章目錄
- 一.Cgroup
- 1.概述
- 2.cgroup 作用
- 3.Cgroup資源控制的作用
- 4..cgroup中需要了解的四個概念
- 5.Cgroup 資源配置方法
- 二.使用stress工具測驗CPU 和記憶體
- 1.設定CPU權重
- 2.cpu周期限制
- 3.CPU Core控制
- 4.CPU配額控制引數的混合使用
一.Cgroup
1.概述
Cgroups 是 control groups 的縮寫,是 Linux 內核提供的一種可以限制、記錄、隔離行程組(process groups)所使用的物理資源(如:cpu,memory,IO等等)的機制,最初由 google 的工程師提出,后來被整合進 Linux 內核,Cgroups 也是 LXC 為實作虛擬化所使用的資源管理手段,可以說沒有cgroups就沒有LXC,
Docker通過Cgroup來控制容器使用的資源配額,包括CPU、記憶體、磁盤三大方面,基本覆寫了常見的資源配額和使用量控制
Cgroup是Control Groups的縮寫,是Linux內核提供的一種可以限制、記錄、隔離行程組所使用的物理資源(如CPU、記憶體、磁盤IO等等)的機制
2.cgroup 作用
(1)限制行程組可以使用的資源數量(Resource limiting ),比如:memory子系統可以為行程組設定一個memory使用上限,一旦行程組使用的記憶體達到限額再申請記憶體,就會出發OOM(out of memory),
(2)行程組的優先級控制(Prioritization ),比如:可以使用cpu子系統為某個行程組分配特定cpu share,
(3)記錄行程組使用的資源數量(Accounting ),比如:可以使用cpuacct子系統記錄某個行程組使用的cpu時間
(4)行程組隔離(Isolation),比如:使用ns子系統可以使不同的行程組使用不同的namespace,以達到隔離的目的,不同的行程組有各自的行程、網路、檔案系統掛載空間,
(5)行程組控制(Control),比如:使用freezer子系統可以將行程組掛起和恢復,
3.Cgroup資源控制的作用
一般來說,容器默認是沒有資源限制的,會最大程度使用宿主機的資源,在Linux主機上,如果內核檢測到沒有足夠的記憶體來執行重要的系統功能,它會拋出一個OOME(Out Of Memory Exception),一旦發生OOME,Linux就會開始查殺行程以釋放記憶體,任何行程都有可能會被殺死,包括docker daemon和其他重要的應用程式,如果錯誤的行程被殺死,這可會降低整個系統的使用效果,針對此情況,Docker提供了一種資源控制的方式,可以對容器的CPU、記憶體和IO進行限制,
4…cgroup中需要了解的四個概念
(1)Subsystems: 稱之為子系統,一個子系統就是一個資源控制器,比如 cpu子系統就是控制cpu時間分配的一個控制器,
(2)Hierarchies: 可以稱之為層次體系也可以稱之為繼承體系,指的是Control Groups是按照層次體系的關系進行組織的,
(3)Control Groups: 一組按照某種標準劃分的行程,行程可以從一個Control Groups遷移到另外一個Control Groups中,同時Control Groups中的行程也會受到這個組的資源限制,
(4)Tasks: 在cgroups中,Tasks就是系統的一個行程,
5.Cgroup 資源配置方法
被 LXC、docker 等很多專案用于實作行程資源控制,Cgroup 本身是提供將行程進行分組化管理的功能和介面的基礎結構,I/O 或記憶體的分配控制等具體的資源管理是通過該功能來實作的,
這些具體的資源 管理功能稱為 Cgroup 子系統,有以下幾大子系統實作:
- blkio:設定限制每個塊設備的輸入輸出控制,例如:磁盤,光碟以及 usb 等等,
- CPU:使用調度程式為 cgroup 任務提供 CPU 的訪問,
- cpuacct:產生 cgroup 任務的 CPU 資源報告,
- cpuset:如果是多核心的 CPU,這個子系統會為 cgroup 任務分配單獨的 CPU 和 記憶體,
- devices:允許或拒絕 cgroup 任務對設備的訪問,
- freezer:暫停和恢復 cgroup 任務,
- memory:設定每個 cgroup 的記憶體限制以及產生記憶體資源報告,
- net_cls:標記每個網路包以供 cgroup 方便使用,ns:命名空間子系統,
- perf_event:增加了對每個 group 的監測跟蹤的能力,可以監測驗于某個特定的 group 的所有執行緒以及運行在特定CPU上的執行緒,
二.使用stress工具測驗CPU 和記憶體
- 使用Dockerfile來創建一個基于Centos的stress工具鏡像
mkdir /opt/stress
vim /opt/stress/Dockerfile
FROM centos:7
MAINTAINER li
RUN yum install -y wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y stress
cd /opt/stress/
docker build -t centos:stress


1.設定CPU權重
使用如下命令創建容器,命令中的- -cpu-shares引數值不能保證可以獲得1個vcpu或者多少GHz的CPU資源,它僅是一個彈性的加權值,
docker run -itd --cpu-shares 100 centos:stress
Cgroups只在容器分配的資源緊缺時,即在需要對容器使用的資源進行限制時,才會生效,因此,無法單純根據某個容器的CPU份額來確定有多少CPU資源分配給它,資源分配結果取決于同時運行的其他容器的CPU分配和容器中行程運行情況,
可以通過cpu share可以設定容器使用CPU的優先級,比如啟動了兩個容器及運行查看CPU使用百分比,
//先創建兩個容器
//容器產生10個子函式行程,設定cpu優先級為512
docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10
//容器產生10個子函式行程,設定cpu優先級為1024
docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
docker ps -a
//進入容器使用top查看cpu使用情況
docker exec -it 68061cd212c9 bash
top
exit
//進容器使用top對比兩個容器的%CPU,比例是1:2
docker exec -it 5b81d3426014 bash
top
exit



2.cpu周期限制
- Docker提供了–cpu-period、–cpu-quota兩個引數控制容器可以分配到的CPU時鐘周期,
--cpu-period 是用來指定容器對CPU的使用要在多長時間內做一次重新分配
--cpu-quota 是用來指定在這個周期內,最多可以有多少時間用來跑這個容器
與 --cpu-shares 不同的是,這種配置是指定一個絕對值,容器對 CPU 資源的使用絕對不會超過配置的值,
cpu-period 和 cpu-quota 的單位為微秒(us), cpu-period 的最小值為1000微秒,最大值為1秒(10^6 us),默認值為 0.1 秒(100000 us),
cpu-quota的值默認為-1,表示不做控制,
cpu-period和cpu-quota引數一般聯合使用,
docker run -tid --cpu-period 100000 --cpu-quota 200000 centos:stress
docker exec -it 8847d6961493 bash
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000

3.CPU Core控制
對多核 CPU 的服務器,Docker 還可以控制容器運行使用哪些CPU內核,即使用- -cpuset-cpus 引數,
這對具有多CPU的服務器尤其有用,可以對需要高性能計算的容器進行性能最優的配置
docker run -tid --name cpu1 --cpuset-cpus 0-1 centos:stress
執行以上命令需要宿主機為雙核,表示創建的容器只能用0、1兩個內核,最終生成的cgroup的CPU內核配置如下;
docker exec -it fb2d24b040c1 bash
cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-1
若虛擬機不是四核,關閉虛擬機修改處理器的核數

adow_50,text_Q1NETiBA5bm05bCRNw==,size_20,color_FFFFFF,t_70,g_se,x_16)
通過下面指令可以看到容器中行程與 CPU 內核的系結關系,達到系結CPU內核的目的


//容器內部第一個行程號pid為1被系結到指定CPU上運行
docker exec fb2d24b040c1 taskset -c -p 1

4.CPU配額控制引數的混合使用
- 通過cpuset-cpus引數指定容器A使用CPU內核0,容器B只是用CPU內核1,
在主機上只有這兩個容器使用對應CPU內核的情況,它們各自占用全部的內核資源,cpu-shares沒有明顯效果,
- cpuset-cpus、cpuset-mems引數只在多核、多記憶體節點上的服務器上有效,并且必須與實際的物理配置匹配,否則也無法達到資源控制的目的,
- 在系統具有多個CPU內核的情況下,需要通過cpuset-cpus 引數為設定容器CPU內核才能方便地進行測驗
//測驗前需要將宿主系統修改為4核心CPU
//創建兩個容器,分別指定不同的cpu
docker run -tid --name cpu2 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1
docker run -tid --name cpu3 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1
top //記住按1查看每個核心的占用


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298758.html
標籤:其他
