Docker的資源控制:
對容器使用宿主機的資源進行限制。
CPU 內存 磁盤I/O(讀寫性能)
docker使用linux自帶的功能cgroup
control groups是linux內核系統提供的一種可以限制,記錄,隔離進程組所使用的物理資源的一種機制。
docker借助這個機制,來實現資源的控制。
cgroup 本身是提供將進程進行分組化管理的功能和接口的基礎結構。分配控制的機制來實現資源控制。
host:容器和宿主機共用一個網絡命名空間
container:容器和容器之間共用一個網絡命名空間。
其他的資源依然是隔離的。
隔離是基礎
1、CPU資源控制:
Linux通過CFS(Completely Fail Scheduler 完全公平調度器),來調度各個進程對CPU的使用。CFS的調度周期為100ms。
我們也可以自定義容器的調度周期,以及在這個周期時間內,各個容器能夠使用CPU的調度時間。
(注:只能在容器創建時進行限制)
--cpu-period 設置容器調度cpu的周期
--cpu-quota 設置在每個周期內,容器可以使用cpu的時間。
可以配合使用
CFS周期的有效范圍:1ms-1s? ? ? ? --cpu-period? ? 1000-1000000毫秒
容器使用cpu的配額時間必須要大于1ms,--cpu-quota的值,必須是>=1000
配額:
cat cpu.cfs_quota_us
-1
如果配置是-1,那么容器在使用宿主機cpu的時間不做任何限制。
cat cpu.cfs_period_us
100000
CFS調度周期的長度,單位微秒,在每個周期內,容器可以使用指定比例的cpu時間,默認情況下都是100ms(毫秒)。
CFS調度器,100毫秒就是定義了一個周期,在這個周期內,調度任務(容器)的基本時間單位。
100毫秒一次調度容器請求cpu的資源。然后內核把cpu的資源分配給容器。
cpu.cfs_quota_us:調度請求之后,根據配額,內核分配給容器使用cpu的時間。
就是100毫秒調度請求一次,每次只能使用這么多
docker stats test1/id:查看容器的運行占用宿主機資源的情況
docker top test1/id:查看容器內PID和宿主機pid的映射關系
設置容器占用cpu的權重比:需要多個容器才能生效。
docker run -itd --name test3 --cpu-shares 512 centos:7 /bin/bash
docker run -itd --name test4?--cpu-shares 1024?centos:7 /bin/bash
--cpu-shares 指定容器占用cpu的份額。默認權重1024,設置的值只能是1024的倍數。
--cpu-shares 是給每個容器使用cpu設置了相對的權重,權重高的,可以使用cpu的資源更多,但是,如果只有一個容器在運行,即使設置了權重,但是沒有其他更高的權重的容器來占用資源,權重低的容器依然不受限。
#分別進入容器,進行壓力測試
yum install -y epel-release
yum install -y stress
#stress 是一個用于模擬系統負載的工具,它可以測試系統在高負載條件下的穩定性。
stress -c 4?? ??? ??? ??? ?#產生四個進程,每個進程都反復不停的計算隨機數的平方根
#查看容器運行狀態(動態更新)
docker stats
CONTAINER ID ? NAME ? ? ? ? ? ? CPU % ? ? MEM USAGE / LIMIT ? ? MEM % ? ? NET I/O ? ? ? ? ?BLOCK I/O ? ? ? ? PIDS
c3ee18e65852 ? c2 ? ? ? ? ? ? ? 66.50% ? ?5.5MiB / 976.3MiB ? ? 0.56% ? ? 20.4MB / 265kB ? 115MB / 14.2MB ? ?4
bb02d3b345d8 ? c1 ? ? ? ? ? ? ? 32.68% ? ?2.625MiB / 976.3MiB ? 0.27% ? ? 20.4MB / 325kB ? 191MB / 12.7MB ? ?4
設置容器綁定cpu,容器只能使用指定的cpu內核。
docker run -itd --name test5 --cpuset-cpus 1,3
容器占用cpu的時間
容器占用cpu的權重比(多個容器時,才有效,一個容器時,依然不受限)
容器占用cpu的內核數,綁定指定cpu內核給容器使用。
2、內存:限制容器對內存的使用
創建3個容器,分別對這三個容器進行資源限制
centos1? 占用cpu的時間? 10000(10ms),占用cpu的權重? 256? ?占用內存是? 1G?只能使用cpu1
centos2? 占用cpu的時間? ?20000(20ms),占用cpu的權重 512? 占用內存? 2G?只能使用cpu2
centos3??占用cpu的時間? ?30000(30ms),占用cpu的權重 1024? 占用內存512m 只能使用cpu3
3、限制使用SWAP:想要限制容器使用swap,必須和限制內存一塊使用。
先限制內存,再限制swap 兩個相減
如果限制了內存是512,swap是1G,那么容器實際上能夠使用的swap空間,是1G-512m=512M
如果不設置:-m 512m? 實際使用swap的空間是 -m 的兩倍? 512M*2=1G
如果設置 -memory -swap的值,和內存限制一樣,容器就不能使用swap(等于0)
-m 512m -memory-swap=-1,內存首先還是512M,但是容器使用swap空間不再限制。
磁盤I/O配額(了解):
讀
寫
限制容器在磁盤上的讀速度:
docker run -itd --name test9 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
dd if=/dev/zero of=123.txt bs=2M count=5 oflag=direct
oflg=direct
在使用dd 獲取空字符集是從文件系統的緩存當中輸入,速度是比較快的,加了之后就:禁用文件系統緩存,直接把數據寫入磁盤,可以更真實的測試設備的性能,模擬直接寫入物理設備的情況。
限制容器讀取的次數
docker run -itd --name test10 --device-read-iops /dev/sda:100 centos:7 /bin/bash
限制讀取操作,每秒是100次
限制容器寫入的次數(同樣了解即可)
docker run -itd --name test11?--device-write-iops /dev/sda:50 centos:7 /bin/bash
限制寫入的操作,每秒是50次
清理docker占用的磁盤空間
docker system prune -a
刪除已經停止的容器
刪除所有未被使用的網橋設備(docker0、docker1)
刪除所有未被使用的鏡像
刪除創建容器時的緩存,以及無用的數據卷。
總結:
怎么對容器使用cpu進行限制:
1、容器占用cpu的時間
2、容器占用cpu的權重
3、容器綁定cpu
容器對宿主機的內存使用限制
-m?
swap:必須和限制內存一塊使用
-m 512m --memory-swap=1g
(1g-512=512)
-m 512m?--memory-swap=512m
相等就是0
-m 512m
不寫就是兩倍(512m*2=1024m)
-m 512m --memory-swap=-1
-1就是不限制
磁盤I/O:
清理docker占用的磁盤空間:
docker system prune -a
刪除已經停止的容器
刪除所有未被使用的網橋設備(docker0、docker1)
刪除所有未被使用的鏡像
刪除創建容器時的緩存,以及無用的數據卷。