文章目錄
- 一、Cgroup
- 二、使用stress工具測驗
- 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等等)的機制
這些具體的資源管理功能稱為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工具測驗
下面開始利用stress壓力測驗工具來測驗CPU和記憶體使用狀況,使用stress工具測驗CPU和記憶體
#使用Dockerfile來創建一個stress鏡像
cd /opt
mkdir stress
vim Dockerfile
FROM centos:7
MAINTAINER LIC
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
====>:wq
systemctl restart docker
docker build -t centos:stress .



1、權重 --cpu-shares
使用如下命令創建容器,命令中的-cpu-shares引數值不能保證可以獲得1個cpu或者多少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資源,
例:開兩個容器,都讓它們產生10個子函式行程,進入容器,top命令對比cpu使用百分比
docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10
docker run -itd --name cpu1024 --cpu-share 1024 centos:stress stress -c 10
docker ps
docker exec -it 容器id bash
top


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的單位為微秒(μs),cpu-period的最小值為1000微秒,最大值為1秒(10^6μs) ,默認值為0.1秒(100000μs) ,
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秒),
docker run -tid --cpu-period 100000 --cpu-quota 200000 centos:stress
docker ps
docker exec -it 容器id bash
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us

3、CPU Core控制 --cpuset-spus
對多核CPU的服務器,Docker還可以控制容器運行哪些CPU內核,即使用–cpuset-cpus引數,這對具有多CPU的服務器尤其有用,可以對需要高性能計算的容器進行性能最優的配置,
docker run -itd --name cpu1 --cpuset-cpus 0-1 centos:stress
執行以上命令需要宿主機為雙核,表示創建的容器只能用0和1兩個內核,進入容器后可以用以下命令進行檢測
cat /sys/fs/cgroup/cpuset/cpuset.cpus

以下命令可以查看容器行程與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內核才能方便地進行測驗,
docker stop `docker ps -qa`
docker run -itd --name cpu3 --cpuset-cpus 0 --cpu-shares 512 centos:stress stress -c 1
docker run -itd --name cpu4 --cpuset-cpus 2 --cpu-shares 1024 centos:stress stress -c 1


四、記憶體限額
與作業系統類似,容器可使用的記憶體包括兩部分:物理記憶體和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 --momory-swap=300M progrium/stress --vm 1 --vm-bytes 300M

五、Block IO的限制
默認情況下,所有容器能平等地讀寫磁盤,可以通過設定–blkio-weight引數來改變容器block 10的優先級,
–blkio-weight與–cpu-shares類似,設定的是相對權重值,默認為500,
在下面的例子中,容器A讀寫磁盤的帶寬是容器B的兩倍,
docker run -it --name container_A --blkio-weight 600 centos:stress
cat /sys/fs/cgroup/blkio/blkio.weight
docker run -it --name container_B --blkio-weight 300 centos:stress
cat /sys/fs/cgroup/blikio.weight

1、bps和iops的限制
bps是byte per second,每秒讀寫的資料量,
iops是io per second,每秒讀寫的次數,
可通過以下引數控制容器的bps和iops:
–device-read-bps, 限制讀某個設備的bps
–device-write-bps, 限制寫某個設備的bps
–device-read-iops, 限制讀某個設備的iops
–device-write-iops, 限制寫某個設備的iops
例:限制容器寫/dev/sda的速率為5 MB/s,
docker run -it --device-write-bps /dev/sda:5MB centos:stress
dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
//可以按ctrl+ c中斷查看

docker run -it centos:stress
dd if=/dev/zero of=test bs=1M count=1024 oflag=direct

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