Docker容器CPU资源限制

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节点内存