docker cgroup资源分配与TLS

2023-10-20 23:10
文章标签 docker tls cgroup 资源分配

本文主要是介绍docker cgroup资源分配与TLS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

docker cgroup资源分配

Cgroup资源配置方法

  Docker通过Cgroup来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。

  Cgroup是Control Groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如CPU、内存、磁盘I0等等)的机制,被LXC、docker等很多项目用于实现进程资源控制。Cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具的资源管理是通过该方法进行分配
  这些具体的资源管理功能称为Cgroup子系统,有以下几大子系统实现:

  • blkio:设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。
  • CPU:使用调度程序为cgroup任务提供CPU的访问。
  • cpuacct:产生cgroup任务的CPU 资源报告。
  • devices:允许或拒绝cgroup任务对设备的访问。
  • freezer:暂停和恢复cgroup任务。
  • memory:设置每个cgroup 的内存限制以及产生内存资源报告。
  • net_cls:标记每个网络包以供cgroup方便使用。
  • ns:命名空间子系统,对一个组的资源进行分配,如分配给一个组的资源为百分之50那么组内的所有成员所用资源不能超过百分之50
  • perf_event:增加了对每个group 的监测跟踪的能力,可以监测属于某个特定的group 的所有线程以及运行在特定CPU上的线程。
  • cpuset:如果是多核心的CPU,这个子系统会为cgroup任务分配单独的CPU和内存。

配置示例

使用stress工具测试CPU和内存

下面开始利stress压力测试来测试CPU和内存使用状况.
使用Dockerfile来创建一个基于centos的stress工具镜像

[root@client ~]# mkdri /opt/stress
[root@client ~]# vim /opt/stress/Dockerfile
FROM centos:7
MAINTAINER cpu fenpei
RUN yum install -y wget
#epel源拓展的软件包
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y stress
[root@client stress]# docker build -t centos:stress .

使用–cpu-shares参数来分配CPU使用权值,stress是用来创建进程进行压力测试的

[root@client stress]# docker run -itd --name cpu512 --cpu-shares 512 cnetos:stress stress -c 10

进入容器使用top命令查看进程
在这里插入图片描述

开另一个终端,再创建一个容器,使用top命令查看

[root@client stress]# docker run -itd --name cpu1024 --cpu-shares 1024 cnetos:stress stress -c 10

进入容器使用top命令查看
在这里插入图片描述

对比两则CPU的使用情况,大概为1:2的情况

  说明:默认情况下,每个docker容器的CPU份额都为1024,单独一个容器的份额是没有意义的,只有在同时运行多个容器时,容器的CPU 加权的效果才会显示出来。
  例如,两个容器A、B的CPU份额分别为1000和500,在CPU进行时间片分配的时候,容器A比容器B多一倍的机会获得CPU的时间片。但分配的结果取决于当时主机和其他容器的运行状态,实际上也无法保证容器A一定能获得CPU的时间片。比如容器A的进程一直是空闲的那么容器B时可以获取比容器A更多的CPU时间片的。极端情况下,例如主机上只运行了一个容器,即使它的CPU份额只有50,它也可以独占整个主机的CPU 资源

CPU 周期限制

docker提供了–Cpu-period、–cpu-quota两个参数控制容器可以分配到的CPU时钟周期。

  • -cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配,类似刷新。
  • -cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。
  • –cpu-shares 不同的是,这种配置是指定一个绝对值,容器对CPU 资源的使用绝对不会超过配置的值。
  • pu-period和cpu-quota 的单位为微秒(us)。cpu-period的最小值为1000微秒,最大值为1秒(10^6 us),默认值为0.1秒(10000 us)
  • pu-quota的值默认为-1,表示不做控制。cpu-period和cpu-quota参数一般联合使用。

列如﹔容器进程需要每1秒使用单个CPU的0.2秒时间,可以将cpu-period设置为10000(即1秒),cpu-quota设置为200000(0.2秒)
然,在多核情况下,如果允许容器进程完全占用两个CPU,则可以将cpu-period设置为1000(即0.1秒),cpu-quota 设置为20000 (0.2

[root@client ~]# docker run -itd --cpu-period 1000000 --cpu-quota 200000 cnetos:stress
86bc05d6eb511954fd7c5589e1832bda951d11aa404f267025729597c81591a1[root@client ~]# docker exec -it 86bc05d6eb51 bash[root@86bc05d6eb51 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us 
1000000
[root@86bc05d6eb51 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000

CPU内核控制

[root@client ~]# docker run -itd --name cpu0 --cpuset-cpus 0 cnetos:stress
3ec5c5b3e5edd92b727caa7da5805110899bfa62e3d5753060bc215be0b42bbf
[root@client ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
3ec5c5b3e5ed        cnetos:stress       "/bin/bash"         9 seconds ago       Up 8 seconds                            cpu0
[root@client ~]# docker exec -it 3ec5c5b3e5ed bash
[root@3ec5c5b3e5ed /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus 
0
绑定CPU
[root@client ~]# docker exec -it 3ec5c5b3e5ed taskset -c -p 1
pid 1's current affinity list: 0
[root@client ~]# docker exec -it 3ec5c5b3e5ed bash
[root@3ec5c5b3e5ed /]# stress -c 10
stress: info: [46] dispatching hogs: 10 cpu, 0 io, 0 vm, 0 hdd
开另一个终端查看可以看到CPU资源都分配在0和1上,注意要在没有其他容器在运行的情况下测试
[root@3ec5c5b3e5ed /]#top

CPU配额控制参数的混合使用

通过cpuset-cpus参数指定容器A使用CPU内核0,容器B只是用 CPU内核1
在主机上只有这两个容器使用对应CPU内核的情况,它们各自占角部的内核资源,cpu-shares没有明显效果。
cpuset-cpus、cpuset-mcems参数只在多核、多内存节点上的服务器上有效,并H必须与实际的物理配置匹配,否则也无法达到资源控制的目的。
在系统具有多个 CPU内核的情况下,需要通过cpuset-cpus参数为设置容器CPU内核才能方便地进行测试。

[root@client ~]#docker run -itd --name cpu3 --cpuset-cpus 0 --cpu-shares 512 cnetos:stress stress -c 5
[root@client ~]# docker exec -it 563b1cc3e813 bash
[root@563b1cc3e813 /]# top
[root@client ~]#docker run -itd --name cpu4 --cpuset-cpus 1 --cpu-shares 1024 cnetos:stress stress -c 5
[root@client ~]# docker exec -it 6b89e62ee5ea bash
[root@6b89e62ee5ea /]# top

对比结果来看,在两个容器分配不同的CPU下赋予了权值也是不起作用,只有在两个容器都是分配在共同的CPU下才会有效果

内存限额

与操作系统类似,容器可使用的内存包括两部分:内存和Swap
Docker通过下面两组参数来控制容器内存的使用量

  • -m 或 --memory:设置内存的使用限额,例如 100m、1024M
  • –memory-swap:设置内存+swap 的使用限额

执行如下命令允许该容器最多使用200M的内存和300M的swap

[root@client ~]# docker run -it -m 200M --memory-swap=300m progrium/stress --vm 1 --vm-bytes 280M

–vm 1:启动1个内存工作线程
–vm-bytes 280M:每个线程分配280M内存
默认情况下,容器可以使用主机上的所有空闲内存
与CPU的cgroup配置类似,docker会自动为容器在目录/sys/fs/cgroup/memory/docker/<容器的完整长 ID>中创建相应cgroup配置文件

[root@client ~]# docker run -it -m 200M --memory-swap=300m progrium/stress --vm 1 --vm-bytes 280M
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogvm worker 1 [6] forked
stress: dbug: [6] allocating 293601280 bytes ...
stress: dbug: [6] touching bytes in strides of 4096 bytes ...
stress: dbug: [6] freed 293601280 bytes
stress: dbug: [6] allocating 293601280 bytes ...
stress: dbug: [6] touching bytes in strides of 4096 bytes ...
stress: dbug: [6] freed 293601280 bytes

如果让工作线程分配的内存超过200M,分配的内存超过限额,stress线程报错,容器退出

[root@client ~]# docker run -it -m 200M --memory-swap=300m progrium/stress --vm 1 --vm-bytes 310M
stress: info: [1] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd
stress: dbug: [1] using backoff sleep of 3000us
stress: dbug: [1] --> hogvm worker 1 [6] forked
stress: dbug: [6] allocating 325058560 bytes ...
stress: dbug: [6] touching bytes in strides of 4096 bytes ...
stress: FAIL: [1] (416) <-- worker 6 got signal 9
stress: WARN: [1] (418) now reaping child worker processes
stress: FAIL: [1] (422) kill error: No such process
stress: FAIL: [1] (452) failed run completed in 0s

Block IO的限制

默认情况下,所有容器能平等的读写磁盘,可以通过设置–blkio-weight参数来改变 容器block IO的优先级
–blkio–weight 与–cpu–shares类似,设置的是相对权重值,默认为500
在下面的例子中,容器A读写磁盘的带宽是容器B的两倍。

[root@client ~]# docker run -it --name container_A --blkio-weight 600 cnetos:stress
[root@914d141cdf79 /]# cat /sys/fs/cgroup/blkio/blkio.weight
600[root@client ~]# docker run -it --name container_B --blkio-weight 300 cnetos:stress
[root@cafdcf11c5d5 /]# cat /sys/fs/cgroup/blkio/blkio.weight
300

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

[root@client ~]# docker run -it --name block01 --device-write-bps /dev/sda:5MB cnetos:stress
[root@fd6c48ff2e02 /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
^C103+0 records in
103+0 records out
108003328 bytes (108 MB) copied, 20.6011 s, 5.2 MB/s

通过dd命令测试在容器中写磁盘的速度。因为容器的文件系统是在 host /dev/sda上的
在容器中写文件相当于对host /dev/sda进行写操作。另外,oflag=direct指定用direct IO 方式写文件
这样 --device-write-bps 才能生效。

结果表明限速5MB/s作为对比测试,如果不限速,结果如下

[root@cafdcf11c5d5 /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 1.35386 s, 793 MB/s

这篇关于docker cgroup资源分配与TLS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/250313

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

禅道Docker安装包发布

禅道Docker安装包发布 大家好, 禅道Docker安装包发布。 一、下载地址 禅道开源版:   /dl/zentao/docker/docker_zentao.zip  备用下载地址:https://download.csdn.net/download/u013490585/16271485 数据库用户名: root,默认密码: 123456。运行时,可以设置 MYSQL_ROOT_P

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

docker-compose安装和简单使用

本文介绍docker-compose的安装和使用 新版docker已经默认安装了docker-compose 可以使用docker-compose -v 查看docker-compose版本 如果没有的话可以使用以下命令直接安装 sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-c

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储,载入镜像和删除镜像 1.4 Doecker容器操作 1.4

Windows与linux中docker的安装与使用

windos中安装使用docker 下载Docker_Desktop 安装包进入docker官网下载Docker_Desktop: https://www.docker.com/ 启用wsl 我们搜索“启用或关闭Windows功能”,打开后勾选适用于Linux的Windows 子系统 Docker_Desktop设置 出现Docker Engine stopped的解决

docker学习系列(四)制作基础的base项目镜像--jdk+tomcat

前面已经完成了docker的安装以及使用,现在我们要将自己的javaweb项目与docker结合 1.1准备jdk+tomcat软件 ​​我下载了apache-tomcat-7.0.68.tar.gz和jdk-7u79-linux-x64.tar.gz,存储于Linux机器的本地目录/usr/ect/wt/下(利用xshell上传)。利用linux命令 tar -zxvf apache-tom

docker学习系列(三)docker使用

紧接着之前的博客,这一篇主要写如何使用docker 系列1:docker简介:http://blog.csdn.net/u013469562/article/details/72864323 系列2: docker安装:http://blog.csdn.net/u013469562/article/details/72865167 一、docker镜像的获取 1.1搜索可用镜像

docker学习系列(二)docker安装

接着之前的博客http://blog.csdn.net/u013469562/article/details/72864323,今天写一下docker的安装和使用 1.1docker的安装前置需求 首先docker目前的版本已经到了v17.03 本文采用centos6.6版本安装docker,其他操作系统可以参考其他博客,首先docker对于centos的需求如下 C

docker学习系列(一)初识docker

在第一版本上线之后公司,我们决定将之前使用的开源api文档项目转移到本公司的服务器之上,之前用的是showdoc,showdoc利用的是php技术,作为java程序员表示需要快速部署php环境以及apach容器都需要时间,所以采用第二种方法,即利用docker进行快速部署(虽然学习成本也不比php少)。 一、docker简介 docker的官网是https://www.docker.com,