Docker Cgroup資源配置方法
Cgroup是Linux內核提供的一種可以限制、記錄、隔離進程組所使用的物理資源的機制
Docker通過Cgroup來控制容器使用的資源配額,包括 cpu、內存、磁盤三大方面,基本覆蓋了常見的資源配額和使用量控制
Cgroup子系統
- blkio:設置限制每個塊設備的輸入輸出控制
- 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創建一個stress工具鏡像
[root@localhost ~]# mkdir /opt/stress
[root@localhost ~]# cd /opt/stress/
[root@localhost stress]# vim Dockerfile
FROM centos:7
MAINTAINER lzp "lzp@kgc"
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
[root@localhost stress]# docker build -t centos:stress .
創建容器
[root@localhost stress]# docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10
[root@localhost stress]# docker exec -it b6f7b6a43716 bash
[root@b6f7b6a43716 /]# top
[root@localhost stress]# docker run -itd --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
[root@localhost stress]# docker exec -it d5aabd524580 bash
[root@d5aabd524580 /]# top
啓動兩個容器及運行查看cpu使用百分比
使用top命令查看比例,對兩個容器進行比較
在默認情況下,每個Docker容器的cpu份額都是1024,單獨一個容器的份額是沒有意義的。只有在同時運行多個容器時,容器的cpu加權的效果才能體現出來。
CPU週期限制
兩個參數控制容器CPU時鐘週期
- --cpu-period:是用來指定容器對cpu的使用要在多長時間內做一次重新分配
- --cpu-quota:是用來指定在這個週期內,最多可以有多長時間用來跑這個容器
與--cpu-shares不同的是。這種配置是指定一個絕對值,容器對cpu資源的使用絕對不會超過配置的值
cpu-period和cpu-quota的單位爲微秒(us),cpu-period的最小值爲1000微秒,最大值爲1秒,默認值爲0.1秒。cpu-quota的默認值爲-1 ,表示不做控制。cpu-period和cpu-quota 參數一般聯合使用
在多核情況下,允許容器進程需要完全佔用兩個CPU,則可以將cpu-period設置爲100000(即0.1秒),cpu-quota設置爲200000(0.2秒)
[root@localhost stress]# docker run -itd --name cpu01 --cpu-period=100000 --cpu-quota=200000 centos:stress
[root@localhost stress]# docker ps -a
[root@localhost stress]# docker exec -it dbf79db9c053 bash
[root@dbf79db9c053 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
[root@dbf79db9c053 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000
CPU Core控制
對多核cpu的服務器,Docker還可以控制容器運行使用那些cpu內核,即使用--cpuset-cpus參數
這對具有多cpu的服務器尤其有用,可以對需要高性能計算的容器進行性能最優的配置
[root@localhost stress]# docker run -itd --name cpu02 --cpuset-cpus=0-2 centos:stress
//以上命令需要宿主機爲雙核,表示創建的容器只能使用0、1、2三個內核,最終生成的cgroup的cpu內核配置如下
[root@localhost stress]# docker ps -a
[root@localhost stress]# docker exec -it 4416c771538e bash
[root@4416c771538e /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-2