Loading
0

docker资源限制及应用

内存节点,则–cpuset-mems 的配置基本上不会有明显效果
注:
现在的机器上都是有多个 CPU 和多个内存块的。以前我们都是将内存块看成是一大块内存,
所有 CPU 到这个共享内存的访问消息是一样的。但是随着处理器的增加,共享内存可能会
导致内存访问冲突越来越厉害,且如果内存访问达到瓶颈的时候,性能就不能随之增加。
NUMA(Non-Uniform MemoryAccess)就是这样的环境下引入的一个模型。比如一台机
器是有2个处理器,有4个内存块。我们将1个处理器和两个内存块合起来,称为一个NUMA
未经允许不得转载传播--陈英宏
博客地址:hongge.blog.51cto.com
node,这样这个机器就会有两个 NUMAnode。在物理分布上,NUMA node 的处理器和内
存块的物理距离更小,因此访问也更快。比如这台机器会分左右两个处理器(cpu1, cpu2),
在每个处理器两边放两个内存块(memory1.1, memory1.2, memory2.1,memory2.2),这样
NUMA node1 的 cpu1 访问 memory1.1 和 memory1.2 就比访问memory2.1 和 memory2.2
更快。所以使用 NUMA 的模式如果能尽量保证本 node 内的 CPU 只访问本 node 内的内存
块,那这样的效率就是最高的。
使用示例:

表示创建的容器只能用 0、1、2 这三个内核。最终生成的 cgroup 的 cpu 内核配置如下:

cpuset.cpus:在这个文件中填写 cgroup 可使用的 CPU 编号,如 0-2,16 代表 0、1、2 和 16
这 4 个 CPU。
cpuset.mems:与 CPU 类似,表示 cgroup 可使用的 memorynode,格式同上
通过 docker exec 容器 ID> taskset -c -p 1(容器内部第一个进程编号一般为 1),可以看到容器
中进程与 CPU 内核的绑定关系,可以认为达到了绑定 CPU 内核的目的。
总结:
CPU 配额控制参数的混合使用
当上面这些参数中时,cpu-shares 控制只发生在容器竞争同一个内核的时间片时,如果通过
cpuset-cpus 指定容器 A 使用内核 0,容器 B 只是用内核 1,在主机上只有这两个容器使用对
应内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。
cpu-period、cpu-quota 这两个参数一般联合使用,在单核情况或者通过 cpuset-cpus 强制容
器使用一个 cpu 内核的情况下,即使 cpu-quota 超过 cpu-period,也不会使容器使用更多的
CPU 资源。
cpuset-cpus、cpuset-mems 只在多核、多内存节点上的服务器上有效,并且必须与实际的物
理配置匹配,否则也无法达到资源控制的目的。
在系统具有多个 CPU 内核的情况下,需要通过 cpuset-cpus 为容器 CPU 内核才能比较方便地
进行测试。
内存配额控制
和 CPU 控制一样,docker 也提供了若干参数来控制容器的内存使用配额,可以控制容器的
swap 大小、可用内存大小等各种内存方面的控制。主要有以下参数:
Docker 提供参数-m,--memory=""限制容器的内存使用量,如果不设置-m,则默认容器内存
是不设限的,容器可以使用主机上的所有空闲内存
内存配额控制使用示例
设置容器的内存上限,参考命令如下所示
#docker run -dit --memory 128m 镜像
默认情况下,除了–memory 指定的内存大小以外,docker 还为容器分配了同样大小的 swap
分区,也就是说,上面的命令创建出的容器实际上最多可以使用 256MB 内存,而不是 128MB内存。如果需要自定义swap 分区大小,则可以通过联合使用–memory–swap 参数来实现控
制。

可以发现,使用 256MB 进行压力测试时,由于超过了内存上限(128MB 内存+128MB swap),
进程被 OOM(out of memory)杀死。
使用 250MB 进行压力测试时,进程可以正常运行。

通过 docker stats 可以查看到容器的内存已经满负载了。
#docker stats test2

对上面的命令创建的容器,可以查看到在 cgroups 的配置文件中,查看到容器的内存大小为
128MB (128×1024×1024=134217728B),内 存 和 swap 加 起 来 大 小 为 256MB
(256×1024×1024=268435456B)。
#cat/sys/fs/cgroup/memory/system.slice/docker-容器的完整ID>/memory.limit_in_bytes
134217728
#cat /sys/fs/cgroup/memory/system.slice/docker- 容 器 的 完 整
ID>/memory.memsw.limit_in_bytes
268435456

磁盘 IO  配额控制
主要包括以下参数:
--device-read-bps:限制此设备上的读速度(bytesper second),单位可以是 kb、mb 或者 gb。
--device-read-iops:通过每秒读 IO 次数来限制指定设备的读速度。
--device-write-bps :限制此设备上的写速度(bytesper second),单位可以是 kb、mb 或者 gb。

分页阅读: 1 2 3 4
【声明】:8090安全小组门户(https://www.8090-sec.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们:邮箱hack@ddos.kim,我们会在最短的时间内进行处理。