日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Docker通过Cgroup 资源配置

發布時間:2024/2/28 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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子系統,有以下幾大子系統實現:

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/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資源。

先創建兩個容器 容器產生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 stats

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秒)。

docker run -tid --cpu-period 100000 --cpu-quota 200000 centos:stress docker exec -it 602299e4f013 bash cat /sys/fs/cgroup/cpu/cpu.cfs_period_us 100000 cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us 200000

3、CPU Core控制 --cpuset-spus

對多核 CPU 的服務器,Docker 還可以控制容器運行使用哪些CPU內核,即使用- -cpuset-cpus 參數。
這對具有多CPU的服務器尤其有用,可以對需要高性能計算的容器進行性能最優的配置

docker run -tid --name cpu1 --cpuset-cpus 0-1 centos:stress

執行以上命令需要宿主機為雙核,表示創建的容器只能用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內核才能方便地進行測試。

docker stop `docker ps -qa` docker run -itd --name cpu3 --cpuset-cpus 0 --cpu-shares 512 centos:stress stress -c 1docker run -itd --name cpu4 --cpuset-cpus 1 --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 --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M

五、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.weightdocker 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,每秒IO的次數。
可通過以下參數控制容器的bps和iops:

--device-read-bps,限制讀某個設備的bps。 --device-write-bps,限制寫某個設備的bps。 --device-read-iops,限制讀某個設備的iops。 --device-write-iops,限制寫某個設備的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 run -it centos:stress dd if=/dev/zero of=test bs=1M count=1024 oflag=direct

總結

以上是生活随笔為你收集整理的Docker通过Cgroup 资源配置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。