Docker容器CPU资源限制
1、--cpus =< 数值 >
允许容器最多使用多少颗逻辑CPU的算力
本次示例采用的myweb:1.0镜像基础镜像为python:3.12-slim
[root@R-docker ~]# docker run -d --cpus=2 -m 500m --name zhangyh-1 myweb:1.0
容器名 镜像
[root@R-docker ~]#mkdir /cpu
[root@R-docker cpu]#cd /cpu
[root@R-docker cpu]#vim use_cpu.py
#输入以下内容
i = 1
while True:
i = i + 1
print(i)
[root@R-docker cpu]#docker cp . zhangyh-1:/
[root@R-docker ~]#docker exec -it zhangyh-1 bash
root@12d1f62854d9:/app# cd /
root@12d1f62854d9:/# python use_cpu.py
另起一个会话,输入docker stats 实时查看所有容器资源占用(统计标准:一逻辑核心=100%)
可以看到cpu使用率在一百二左右浮动,说明我们设定的--cpus=2 指的是最多允许使用两个逻辑核心算力,不是要求强制程序占满cpu,上限200%(可能到两百零几)
2、--cpuset-cpus="< 核心编号 >"
强制容器内所有进程、线程只能运行在指定CPU核心上
docker run -d --name zhangyh-3 --cpus 1 --cpuset-cpus 0 myweb:1.0
如果是示例中的use_cpu文件,它是单进程单线程,最多只能跑满100%,想要达到200%需要至少2个CPU密集进程
可替换为
from multiprocessing import Process
def loop():
i = 1
while True:
i += 1
if __name__ == '__main__':
# 启动2个进程,尝试打满2个核心
for _ in range(2):
p = Process(target=loop)
p.start()
可以使用top命令,再按1 展示每一颗独立逻辑 CPU 核心的单独负载
3、--cpu-shares=< 权重 >
默认值:1024
只在服务器CPU资源争抢、满载时生效;服务器空闲时,容器依旧可以占满全部CPU
容器 A:--cpu-shares=1024
容器 B:--cpu-shares=512
服务器 CPU 打满争抢资源时:
A : B 分配时间比例 ≈ 2 : 1
空闲状态下:两个容器都可以占用全部 CPU 算力
4、--cpuset-mems(很少使用)
配合--cpuset-cpus,限定进程使用对应NUMA节点内存
