網站首頁 編程語言 正文
前言
1.docker 使用cgroup控制資源,K8S 里面也有limit(使用上限)
2.docker通過cgroup來控制容器使用的資源配額,包括CPU、內存、磁盤三大方面,基本覆蓋了常見的資源配額和使用量控制。
3.Cgroup 是 Control group 的簡寫,是 Linux 內核提供的一種限制所使用物理資源的機制,包括 CPU、內存 和 IO 這三大方面,基本覆蓋了常見的資源配額和使用量控制
4.cgroup是一種資源控制手段,也是容器隔離的6個名稱空間的一種實現手段
一、對CPU使用率的控制
1、 使用stress工具測試CPU和內存使用情況
mkdir /opt/stress
vim /opt/stress/Dockerfile
——————————————————————————————————————————————————————————————————————————————
FROM centos:7
RUN yum -y install wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #epel源,可以使用擴展軟件包(stress)
RUN yum -y install stress #可以指定產生線程,使用循環語句,測試用'
——————————————————————————————————————————————————————————————————————————————
cd /opt/stress/
systemctl restart docker.service #建議重啟docker,不然下面的操作可能會失敗,卡在wget
docker build -t centos:stress . #生成鏡像
...
...
Successfully built 7e69cc4d1b07
Successfully tagged centos:stress
docker images
#以下可以使用該鏡像為基礎產生的容器進行測試:'
2、設置CPU資源占用比(設置多個容器時才有效)
Docker通過--cpu-shares指定CPU份額,默認值為1024,值為1024的倍數。
資源分配結果取決于同時運行的其他容器的CPU分配和容器中進程運行情況。
cgroups只在容器分配的資源緊缺時,即在需要對容器使用的資源進行限制時,才會生效。因此,無法單純根據某個容器的CPU份額來確定有多少CPU資源分配給它。
示例:創建兩個容器為cpu512和cpu1024, 若只有這兩個容器,設置容器的權重,使得cpu512和cpu1024的CPU資源占比為1/3和2/3。
docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10 #-c 10表示產生10個子線程,測試用
docker run -itd --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
#查看容器的資源使用狀態(動態更新)
docker stats
資源是用cadvisor收集的
3、限制 CPU 使用周期速率
cat /sys/fs/cgroup/cpu/docker/[容器ID]/cpu.cfs_quota_us
#-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 -itd --name test01 --cpu-period 100000 --cpu-quota 200000 centos:stress
#也可以直接去修改文件vim /sys/fs/cgroup/cpu/docker/[容器ID]/cpu.cfs_quota_us
#法一:進入指定容器查看
docker exec -it test01 bash
cd /sys/fs/cgroup/cpu
cat cpu.cfs_period_us
cat cpu.cfs_quota_us
#法二:docker inspect 容器ID
docker inspect 6ccc4ddcb6ad
4、限制 CPU 內核使用
- 可以通過配置,使得某些程序獨享 CPU 內核,以提高其處理速度
- 對多核CPU的服務器,Docker還可以控制容器**運行使用哪些CPU內核**,即使用–cpuset-cpus參數。這對具有多CPU的服務器尤其有用,可以對需要高性能計算的容器進行性能最優的配置
docker run -itd --name cpu1 --cpuset-cpus 0-1 centos:stress
#執行以上命令需要宿主機為雙核,表示創建的容器只能用0、1兩個內核。最終生成的 cgroup的 CPU內核配置如下
cat /sys/fs/cgroup/cpuset/docker/[容器ID]/cpuset.cpus
docker exec -it cpu1 /bin/bash -c "stress -c 10"
二、對內存限額
docker run -itd -m 200M --memory-swap 300M --name test01 centos:stress
docker stats
三、對-Block IO的限制
- 默認情況下,所有容器能平等地讀寫磁盤,可以通過設置–blkio-weight參數來改變容器 block IO的優先級。
- –blkio-weight 與–cpu-shares類似,設置的是相對權重值,默認為500。
在下面的例子中,容器A讀寫磁盤的帶寬是容器B的兩倍。
#容器A
docker run -it --name container_A --blkio-weight 600 centos:stress
cat /sys/fs/cgroup/blkio/blkio.weight
#容器B
docker run -it --name container_B --blkio-weight 300 centos:stress
cat /sys/fs/cgroup/blkio/blkio.weight
四、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:stress
dd if=/dev/zero of=test bs=1M count=100 oflag=direct
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 20.0018 s, 5.2 MB/s
#通過dd命令測試在容器中寫磁盤的速度。因為容器的文件系統是在 host /dev/sda 上的。
#在容器中寫文件相當子對host /dev/sda進行寫操作。另外,oflag=direct指定用direct IO 方式寫文件,這樣--device-write-bps才能生效。
#結果表明限速 5MB/s左右。作為對比測試,如果不限速,結果如下。
docker run -it centos:stress
dd if=/dev/zero of=test bs=1M count=100 oflag=direct
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0470107 s, 2.2 GB/s
五、總結
Cgroups如何工作的?
CPU —>VCPU–>以進程的方式體現在workstation環境(docker環境中) —》docker表現形式是容器,–>Vcpu以進程的方式控制容器–》容器中的應用需要的是服務進程支持–》宿主機內核中cpu可以被cgroup管理(通過分配資源手段)–》linux內核中的cgroup可以直接控制VCPU的資源分配,而VCPU在workstation中是以進程的方式管理docker容器的,所以,也可以認為Cgroups在直接/間接管理docker容器中的應用。
cgroup對cpu限制小結
Cgroups 控制的是內核資源—》間接控制vw中vcpu的資源—》控制著vwM中進程資源—》docker容器的資源—》docker容器內應用的資源
控制的主體包括:CPU、內存、I/O
主要介紹的是CPU資源的控制而CPU資源控制的方式主要有:
①cpu-shares權重指的是多個容器使用同一個CPU的情況下,被分配到CPU資源的機會占比
②cpu-period周期指的是,CPU在給于當前管理、控制的容器分配資源時,CPU的分配周期,默認是1s,此項配置,可以在運行時直接指定
③cpuset-cpus指定容器,僅能使用指定的CPU,按照CPU的下標來表示
cgroup對內存的限制小結
Cgroups 對于內存的限制,主要體現在以下兩個部分:
①內存使用上限(硬限制)
②內存+swap使用上限(硬限制)
類比于K8s中的資源限制手段,也是使用的cgroups的技術,體現為limit
respones:
request: #分配的初始資源
cpu:100m
memory:100m
limits:
cpu:300m
memory:200m
?資源限制的主要類型
- CPU權重shares、 quota、 cpuset
- 磁盤BPS、 TPS限制, 指定使用哪個磁盤、磁盤分區
- 內存 -m - swap 內存、交換分區
大部分做的是上限的限制
資源限制的幾種方式
build構建鏡像時,可以指定該鏡像的資源限制
run將鏡像跑為容器的時候,可以指定容器的資源限制
容器啟動之后可以在宿主機對應容器的目錄下,修改資源限制,然后重載
/sys/ fs/cgroup/* (cpu、b1k、 mem) /docker/容 器ID/ ——>修改對應的資源限制文件參數就可以
資源限制的狀態查詢
docker inspect 鏡像ID/容器ID
直接查看宿主機對應容器ID資源限制的文件
cgroup資源docker 原理之一, namespaces 6個名稱空間
像時,可以指定該鏡像的資源限制
run將鏡像跑為容器的時候,可以指定容器的資源限制
容器啟動之后可以在宿主機對應容器的目錄下,修改資源限制,然后重載
/sys/ fs/cgroup/* (cpu、b1k、 mem) /docker/容 器ID/ ——>修改對應的資源限制文件參數就可以
原文鏈接:https://blog.csdn.net/m0_59579177/article/details/125914510
相關推薦
- 2023-07-02 python中編寫config文件并及時更新的方法_python
- 2022-03-17 docker安裝rocketMQ和安裝過程中出現問題的解決_docker
- 2022-09-01 Android使用Intent傳遞組件大數據_Android
- 2022-09-14 iOS開發UI之弧形文字_IOS
- 2022-05-07 Python列表的淺拷貝與深拷貝_python
- 2022-08-13 Spring Boot 攔截器
- 2022-10-02 iOS開發實現搜索框(UISearchController)_IOS
- 2023-01-17 使用matplotlib繪制熱圖(heatmap)全過程_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支