Cgroup

一、Cgroup基本信息

​ docker中对资源进行控制的方式是使用Cgroup,开控制资源,K8S中也有limit来控制资源

​ docker通过Cgroup来控制勇气使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖常见的资源配额和使用量控制

​ Cgroup是Control group的简写,是linux内核提供的一种显示所使用物力资源的机制,包括CPU、内存、I/O,基本覆盖了常见的资源配额和使用量控制

​ Cgroup是一种资源控制手段,也是容器隔离的6个名称空间的一种实现手段

​ Cgroup的主要作用还是linux内核提供的一种限制、记录、隔离进程组所使用的的物理资源(如CPU、内存、磁盘I/O等)的机制,被Lxc,docker等很多项目用于实现进程资源控制。Cgroup本身是提供将进程实行分组化,管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理是通过该功能来实现的。这些具体的资源功能成为Cgroup子系统,子系统如下:

​ blkio:设置限制每个块设备的输入输出的控制,例如:磁盘、光盘等

​ CPU:使用调度程序为Cgroup人物提供CPU的访问

​ cpuacct:产生Cgroup任务的CPU资源报告

​ CPUset:如果是多核心的CPU,这个子系统会为Cgroup任务分配一个单独的CPU和内存。

​ devices:允许或拒绝cgroup 任务对设备的访问

​ freezer:暂停和恢复cgroup任务

​ memory:设置每个cgroup 的内存限制以及产生内存资源报告

​ net_cls:标记每个网络包以供cgroup方便使用

​ ns:―命名空间子系统

​ perf_event:增加了对每个group的监测跟踪的能力,可以监测属于某个特定的 group的所有线程以及运行在特定CPU上的线程

二、CPU使用率控制

1、CPU使用率基本信息

CPU的使用率衡量单位是以秒为单位,每秒的参数值是100000。

​ CPU是以每一秒为一个周期,控制其使用率则是将一个周期以逻辑的方式进行切片,分割成数个时间片,每个时间片可以进行分配任务,来处理不同的线程

​ 容器中,可以选择在运行的时候,该容器最大可以使用多少的时间片,例如你想该容器使用5%的CPU性能,则是可以直接进行配置,直接以每秒100000为单位进行换算即可,5%即为5000的参数值。具体怎么配置,下面我再介绍。

​ 再设置该数值之后,CPU中的每个周期,都会分配出5%的周期时间0.05秒的时间来运转这个进程,因为每个容器都是一个进程来负责运行。

​ CPU在同一个时刻中,只能被一个进程进行占用,所以需要对CPU的使用时间进行限制,来达到“雨露均沾”,维持服务器上的项目能够正常运行。

2、CPU使用率控制的方式

CPU在分配时间片的时候,是根据上面的参数值来进行分配的,例如有两个容器A、B,参数值分别是10000和1000,在cpu每个周期分配时间片的时候,容器A参数值10000,容器B是1000。

​ 假如这台服务器在只有这两进程工作的时候,CPU在一个周期内分恒数个时间片,容器A获取时间片的几率是容器B的十倍(理论值,实际场合中,考虑各个因素,可能有浮动),比如容器A在不工作的时候,只有容器B工作的时候,CPU的整个周期都是属于容器B的。所以设置的参数值只是在同时运转多个进程的时候,CPU根据参数值来决定每个周期分配多少时间片出去。

但是一些场合也是不适合进行设置资源限制,例如在一个容器中,只运行这一个程序,而这个程序非常的吃资源,例如ps、游戏等等这些大型程序。本来就读取麻烦,如果再进行限制其cpu等资源。更加的延缓了对该设备的处理动作所以还是在一个容器中,处理大量小型文件的时候并且这些文件并不对传输速率有需求的时候进行限制才是合理的

3、利用stress压力测试工具来进行测试

手动安装一个stress的压力测试镜像文件,然后再创建容器查看

FROM centos:7
RUN yum -y install wget && \
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo && \
    yum -y install stress && \
    yum clean all

写好之后编译成镜像

docker build -t stress:1 .
......

docker images
REPOSITORY                TAG       IMAGE ID       CREATED          SIZE
stress                    1         05dd238d656b   52 seconds ago   229MB

使用这个镜像创建两个容器来进行测试:

A:

docker run -itd --name cpu500 --cpu-shares 500 stress:1 stress -c 10

B:

docker run -itd --name cpu1000 --cpu-shares 1000 stress:1 stress -c 10

对比:

CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O   PIDS
18b2013f0db2   cpu1000   266.98%   340KiB / 3.702GiB   0.01%     648B / 0B   0B / 0B     11
87280cb5e0af   cpu500    131.64%   336KiB / 3.702GiB   0.01%     648B / 0B   0B / 0B     11

这个是我截取的一段的占用对比,可以看到cpu1000的占用率是cpu500的二倍,

这是相对的,如果还有别的,或者cpu1000此时不在运行,则是不会这么分配

4、CPU周期

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

–CPU-period是限制CPU周期

–CPU-quota是限制CPU单位的时间内,容器会被分配到多少时间比。

​ 可以指定CPU一个周期内有多少时间用来运转指定的容器。–CPU-period和–CPU-quota的单位都是微秒,CPU-period的最小值是为1000微秒,最大值是1秒。默认值是0.1秒(数值是10000)CPU-quota默认值是-1,代表的意思是不做控制,cpu-period和cpu-quota参数一般联合使用

–CPU-shares是一个时间片分配权重,相对的随机时间片,容器对CPU资源的使用绝对不会超过配置的值

假设:一个容器,在每秒需要使用单个CPU的0.2秒的时间,可以将CPU-period的权重值设置为100000(即为1秒),CPU-quota设置为20000(即为0.2秒)。

docker run -itd --cpu-period 100000 --cpu-quota 20000 stress:1
容器ID
#设置完成之后,会有一个容器ID的信息,等下查看需要用到,复制下

查看该容器的两个时间权重值

cat /sys/fs/cgroup/cpu/docker/容器ID/cpu.cfs_quota_us
20000

cat /sys/fs/cgroup/cpu/docker/容器ID/cpu.cfs_period_us
100000

文件路径:/sys/fs/cgroup/ cpu/ docker

#系统自带的资源控制目录

sys #系统

fs #系统文件

5、限制CPU内核的使用

限制CPU内核的使用,可以通过配置,使得某些程序独享CPU内核,以提高其处理速度

对多核CPU的服务器来说,Docker还可以控制容器运行时使用那些CPU的内核,即使用–cpu-cpus参数。这对于具有多CPU的服务器尤为重要,可以对需要高性能计算的容器进行性能最优的配置。

docker run -itd --cpuset-cpus 0-1 stress:1
容器ID

cat /sys/fs/cgroup/cpuset/docker/容器ID/cpuset.cpus
0-1

三、内存限额

在容器中对内存限额,与操作系统类似

容器可以使用的内存包括两部分:物理内存和Swap

docker通过下面两组参数来控制容器内存的使用量

-m或者–memory:设置内存的使用限额,例如:100M、200M

–memory-swap:设置内存+swap的使用限额

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

docker run -it -m 200M --memory-swap=300M centos:stress --vm 1 --vm-bytes 280M

其中:–vm 1 :代表的是启动一个内存工作线程

​ --vm-bytes 280M:表示的是,每个线程最多分配到280内存

在默认情况下,容器可以使用主机上所有空闲状态的内存,与cpu的cgroup类似,docker会自动为容器在目录中创建响应的cgroup配置文件

如果线程分配的内存,超过内存的限额,stress线程会报错,容器退出运行

例如:执行下面命令可以运行该容器最多使用200M的内存和300M的swap

docker run -itd -m 200m --memory-swap=300m stress:1 --vm 1 --vm-bytes 280m
#如果需要让工作线程分配的内存超过300M,分配的内存超额,stress线程报错,容器退出
docker run -itd -m 200m --memory-swap=300m progrium/stress --vm 1 --vm-bytes 310m

创建完成之后,会自动在目录/sys/fs/cgroup/memory/docker/中创建相对应的cgroup配置文件

小结:

cgroup对于内存的限制,主要体现在以下两个部分:

  1. 内存使用上限(硬限制)

  2. 内存+swap使用上限(硬限制)

    1. 类比于k8s中的资源限制手段,也是使用cgroups的技术,体现为limit

      respones:

      ​ request:分配的初始内存的大小,初始即为100M

      ​ cpu:100m

      ​ memory:100m

      ​ limits:分配的内存最大使用量,最多使用200M

      ​ cpu:200m

      ​ memory:200m

四、Block I/O的限制

默认情况下,所有的容器能平等的读写磁盘,可以通过设置-blkio-weight参数来设置容器的block I/O的优先级,-blkio-weight与–cpu-shares类似,是一种设置相对权重值的方式,默认值为500

例如:将容器A的读写性能是容器B的两倍:

docker run -itd --name testA --blkio-weight 600 stress:1
容器ID

docker run -itd --name testB --blkio-weight 300 stress:1
容器ID

创建完成之后,查看两个容器的相关配置信息

A:
cat /sys/fs/cgroup/blkio/docker/容器ID/blkio.weight
600
B:
cat /sys/fs/cgroup/blkio/docker/容器ID/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下数据的速率为3MB/s

docker run -it --device-write-bps /dev/sda:3MB stress:1

dd if=/dev/zero of=test1 bs=100M count=1 oflag=direct
1+0 records in
1+0 records out
104857600 bytes (105 MB) copied, 33.3938 s, 3.1 MB/s
#可见,平均速度为每秒3.1MB左右。退出容器,再进行测试
dd if=/dev/zero of=test1 bs=100M count=1 oflag=direct
记录了1+0 的读入
记录了1+0 的写出
104857600字节(105 MB)已复制,0.261808 秒,401 MB/秒
#没有被限制速度为每秒400左右的传输速率
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值