Docker通过Cgroup 资源配置
目錄
- 一、Cgroup資源配置方法
- 二、使用stress工具測試CPU 和內存
- 1、權重 --cpu-shares
- 2、CPU周期限制 --cpu-period、 --cpu-quota
- 3、CPU Core控制 --cpuset-spus
- 三、CPU配額控制參數的混合使用
- 四、內存限額
- 五、Block IO的限制
- 1、bps和iops的限制
一、Cgroup資源配置方法
Docker 通過 Cgroup 來控制容器使用的資源配額,包括 CPU、內存、磁盤三大方面,基本覆蓋了常見的資源配額和使用量控制。
Cgroup 是 Control Groups 的縮寫,是 Linux 內核提供的一種可以限制、記錄、隔離進程組所使用的物理資源(如CPU、內存、磁盤IO等等)的機制,被LXC、docker等很多項目用于實現進程資源控制。
Cgroup 本身是提供將進程進行分組化管理的功能和接口的基礎結構,I/O或內存的分配控制等具體的資源管理是通過該功能來實現的。
這些具體的資源管理功能稱為Cgroup子系統,有以下幾大子系統實現:
| 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/DockerfileFROM 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 stresscd /opt/stress/ docker build -t centos:stress .
1、權重 --cpu-shares
使用如下命令創建容器,命令中的- -cpu-shares參數值不能保證可以獲得1個vcpu或者多少GHz的CPU資源,它僅是一個彈性的加權值。
docker run -itd --cpu-shares 100 centos:stress說明:默認情況下,每個Docker容器的CPU份額都是1024。單獨一個容器的份額是沒有意義的。只有在同時運行多個容器時,容器的CPU加權的效果才能體現出來。
例如,兩個容器A、B的CPU份額分別為1000和500,在CPU進行時間片分配的時候,容器A比容器B多一倍的機會獲得CPU的時間片。但分配的結果取決于當時主機和其他容器的運行狀態,實際上也無法保證容器A一定能獲得CPU時間片。如果容器A的進程一直是空閑的,那么容器B是可以獲取比容器A更多的CPU時間片的。極端情況下,例如主機上只運行了一個容器,即使它的CPU份額只有50,它也可以獨占整個主機的CPU資源。
2、CPU周期限制 --cpu-period、 --cpu-quota
Docker提供了–cpu-period、–cpu-quota兩個參數控制容器可以分配到的CPU時鐘周期。
1、–cpu-period 是用來指定容器對CPU的使用要在多長時間內做一 次重新分配。 2、–cpu-quota是用來指定在這個周期內,最多可以有多少時間用來跑這個容器。 3、–cpu-quota是–cpu-period的倍數時,使用多個CPU與–cpu-stress不同的是,這種配置是指一個絕對值,容器對CPU資源的使用絕對不會超過配置的值。cpu-period 和 cpu-quota 的單位為微秒(us)。 cpu-period 的最小值為1000微秒,最大值為1秒(10^6 us),默認值為 0.1 秒(100000 us)。 cpu-quota的值默認為-1,表示不做控制。 cpu-period和cpu-quota參數一般聯合使用。例如:容器進程需要每1秒使用單個CPU的0.2秒時間,可以將 cpu-period 設置為1000000(即1秒),cpu-quota 設置為 200000 (0.2秒)。
當然,在多核情況下,如果允許容器進程完全占用兩個CPU,則可以將 cpu-period 設置為100000(即0.1秒),cpu-quota 設置為200000(0.2秒)。
3、CPU Core控制 --cpuset-spus
對多核 CPU 的服務器,Docker 還可以控制容器運行使用哪些CPU內核,即使用- -cpuset-cpus 參數。
這對具有多CPU的服務器尤其有用,可以對需要高性能計算的容器進行性能最優的配置
執行以上命令需要宿主機為雙核,表示創建的容器只能用0、1兩個內核。最終生成的cgroup的CPU內核配置如下;
通過下面指令可以看到容器中進程與 CPU 內核的綁定關系,達到綁定CPU內核的目的。
容器內部第一個進程號pid為1被綁定到指定CPU上運行 docker exec 容器ID taskset -c -p 1三、CPU配額控制參數的混合使用
通過cpuset-cpus參數指定容器A使用CPU內核0,容器B只是用CPU內核1
在主機上只有這兩個容器使用對應CPU內核的情況,它們各自占用全部的內核資源,cpu-shares 沒有明顯效果。
cpuset-cpus. cpuset-mems 參數只在多核、多內存節點上的服務器上有效,并且必須與實際的物理配置匹配,否則也無法達到資源控制的目的。
在系統具有多個CPU內核的情況下,需要通過cpuset-cpus參數為設置容器CPU內核才能方便地進行測試。
四、內存限額
與操作系統類似,容器可使用的內存包括兩部分:物理內存和Swap. Docker通過下面兩組參數來控制容器內存的使用量。-m或–memory: 設置(物理)內存的使用限額,例如100M、 1024M. –memory-swap: 設置內存+ swap的使用限額。 執行如”下命令允許該容器最多使用200M的內存和300M的swap docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M--vm 1:啟動一個內存工作線程 --vm-bytes 280M:每個線程分配280M內存默認情況下,容器可以使用主機上的所有空閑內存。
與CPU的cgroups配置類似,Docker會自動為容器在目錄/sys/fs/cgroup/memory/docker/<容器的完整長ID>中創建相應cgroup配置文件
如果讓工作線程分配的內存超過300M,分配的內存超過限額,stress線程報錯,容器退出。
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M五、Block IO的限制
默認情況下,所有容器能平等地讀寫磁盤,可以通過設置–blkio-weight參數來改變容器block 10的優先級。
–blkio-weight與–cpu-shares類似,設置的是相對權重值,默認為500。
在下面的例子中,容器A讀寫磁盤的帶寬是容器B的兩倍。
1、bps和iops的限制
bps是byte per second,每秒讀寫的數據量(吞吐量)。
iops 是io per second,每秒IO的次數。
可通過以下參數控制容器的bps和iops:
下面的示例是限制容器寫/dev/sda的速率為5MB/s.
docker run -it --device-write-bps /dev/sda:5MB centos:stressdd if=/dev/zero of=test bs=1M count=1024 oflag=direct //可以按ctrl+c中斷查看 #-------------------------輸出內容--------------------------------- ^C18+0 records in 18+0 records out 18874368 bytes (19 MB) copied, 3.60306 s, 5.2 MB/s
上圖說明:通過dd命令測試在容器中寫磁盤的速度。因為容器的文件系統是在 host /dev/sda 上的,在容器中寫文件相當于對host /dev/sda 進行寫操作。另外,oflag=direct 指定用direct lO方式寫文件,這樣- -device-write-bps才能生效。
結果表明限速5MB/s左右。作為對比測試,如果不限速,結果如下。
總結
以上是生活随笔為你收集整理的Docker通过Cgroup 资源配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Harbor构建docker私有仓库
- 下一篇: Kubernetes——基本概念与理论