Cgroup 资源配置方法

  • 一、进程和线程
    • 1.进程
    • 2.线程
    • 3.进程与线程的关系
    • 4.总结
  • 二、Cgroup 资源配置方法
    • 2.1 Cgroup概述
    • 2.2 使用 stress 工具测试 CPU 和内存
    • 2.3 CPU 周期限制
    • 2.4 CPU Core 控制
    • 2.5 CPU 配额控制参数的混合使用
    • 2.6 内存限额
    • 2.7 Block IO 的限制
    • 2.8 bps 和 iops 的限制

一、进程和线程

1.进程

  • 开发写的代码我们称为程序,那么将开发的代码运行起来。我们称为进程。

  • 明白点: 当我们运行一个程序,那么我们将运行的程序叫进程。

  • 进程是申请一块内存空间,将数据放到内存空间中去, 是申请数据的过程是最小的资源管理单元

  • 进程是线程的容器

程序与进程的区别

  • 程序是数据和指令的集合, 是一个静态的概念, 就是一堆代码, 可以长时间的保存在系统中
  • 进程是程序运行的过程, 是一个动态的概念, 进程存在着生命周期, 也就是说进程会随着程序的终止而销毁, 不会永久存在系统中

进程之间交互

  • 进程之间通过 TCP/IP 端口实现

2.线程

什么是线程

  • 线程是操作系统能够进行运算调度的最小单位
  • 它被包含在进程之中,是进程中的实际运作单位
  • 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
  • 是进程的一条流水线, 只用来执行程序,而不涉及到申请资源, 是程序的实际执行者最小的执行单元

线程之间交互

  • 多个线程共享同一块内存,通过共享的内存空间来进行交互

3.进程与线程的关系

进程是线程的容器

例子:

  • 我们打开一个聊天软件,这就是开启了一个进程;当我们在软件里面打开一些功能,比如空间, 扫一扫, 设置…,这些操作就是线程;所以可以说 “进程” 包含 “线程”, “线程” 是 “进程” 的子集

工厂流水线例子:

4.总结

  • 进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位。
  • 线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。
  • 进程要分配一大部分的内存,而线程只需要分配一部分栈就可以了.
  • 一个程序至少有一个进程,一个进程至少有一个线程.
  • 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行.

二、Cgroup 资源配置方法

2.1 Cgroup概述

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

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

这些具体的资源 管理功能称为 Cgroup 子系统,有以下几大子系统实现:

子系统 功能
blkio 设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及 usb 等等
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上的线程

2.2 使用 stress 工具测试 CPU 和内存

使用 Dockerfile 来创建一个基于 Centos 的 stress 工具镜像。

[root@localhost ~]# mkdir /opt/stress
[root@localhost ~]# vim /opt/stress/Dockerfile
FROM centos:7
MAINTAINER mxx
RUN yum install -y wget
RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
RUN yum install -y stress
[root@localhost ~]# cd /opt/stress/
[root@localhost stress]# docker build -t centos:stress .

使用如下命令创建容器,命令中的–cpu-shares 参数值不能保证可以获得 1 个 vcpu 或 者多少 GHz 的 CPU 资源,它仅是一个弹性的加权值。

[root@localhost stress]# docker run -itd --cpu-shares 100 centos:stress

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

Cgroups 只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的CPU份额来确定有多少CPU资源分配给它,资源分配 结果取决于同时运行的其他容器的CPU分配和容器中进程运行情况。
可以通过 cpu share 可以设置容器使用 CPU 的优先级,比如启动了两个容器及运行查看 CPU 使用百分比。

//容器产生10个子函数进程,在此操作前,先把上面开启的容器关掉,避免相互影响
[root@localhost stress]# docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10
//进入容器使用top查看cpu使用情况
[root@localhost stress]# docker exec -it f4953c0d7e76 bash//退出此容器,再开启一个容器做比较
[root@localhost stress]# docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10[root@localhost stress]# docker exec -it 5590c57d27b0 bash  //进容器使用top对比两个容器的%CPU,比例是1:2

2.3 CPU 周期限制

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

    • –cpu-period 是用来指定容器对 CPU 的使用要在多长时间内做一次重新分配。
    • –cpu-quota 是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。
      与 --cpu-shares 不同的是,这种配置是指定一个绝对值,容器对 CPU 资源的使用绝对不会超过配置的值。

      • cpu-period 和 cpu-quota 的单位为微秒(μs)。cpu-period 的最小值为 1000 微秒, 最大值为 1 秒(10^6 μs),默认值为 0.1 秒(100000 μs)。
      • cpu-quota 的值默认为 -1, 表示不做控制。cpu-period 和 cpu-quota 参数一般联合使用。

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

[root@localhost stress]# docker run -itd --cpu-period 100000 --cpu-quota 200000 centos:stress[root@localhost stress]# docker exec -it 98d2aaa50019 bash[root@98d2aaa50019 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000[root@98d2aaa50019 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000

2.4 CPU Core 控制

  • 对多核 CPU 的服务器,Docker 还可以控制容器运行使用哪些 CPU 内核,即使用–cpuset-cpus 参数。
    这对具有多 CPU 的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。
[root@localhost stress]# docker run -tid --name cpu1 --cpuset-cpus 0-1 centos:stress
  • 执行以上命令需要宿主机为双核,表示创建的容器只能用 0、1两个内核。最终生成 的 cgroup 的 CPU 内核配置如下:
[root@localhost stress]# docker exec -it 631eea630b21 bash[root@631eea630b21 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-1
  • 通过下面指令可以看到容器中进程与 CPU 内核的绑定关系,达到绑定 CPU 内核的目的。
//容器内部第一个进程号pid为1被绑定到指定CPU上运行
[root@localhost stress]# docker exec 631eea630b21 taskset -c -p 1
pid 1's current affinity list: 0,1

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

  • 通过 cpuset-cpus 参数指定容器 A 使用 CPU 内核 0,容器 B 只是用 CPU 内核 1。
    在主机上只有这两个容器使用对应 CPU 内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。

  • cpuset-cpus、cpuset-mems 参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的。

  • 在系统具有多个 CPU 内核的情况下,需要通过 cpuset-cpus 参数为设置容器 CPU 内核才能方便地进行测试。

//宿主系统修改为4核心CPU
[root@localhost stress]# docker run -tid --name cpu3 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1[root@localhost stress]# docker exec -it 84598dfadd34 bash
[root@localhost stress]# top
[root@localhost stress]# exit[root@localhost stress]# docker run -tid --name cpu4 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1[root@localhost stress]# top   //记住按1查看每个核心的占用
Tasks: 172 total,   2 running, 170 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7994072 total,  6394056 free,   450124 used,  1149892 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used.  7174064 avail Mem [root@localhost stress]# docker exec -it 0eed2c8a20df bash
注意:
--cpuset-cpus 1:指定CPU1

总结:上面的 centos:stress 镜像安装了 stress 工具,用来测试 CPU 和内存的负载。通过 在两个容器上分别执行 stress -c 1 命令,
将会给系统一个随机负载,产生 1 个进程。这 个进程都反复不停的计算由 rand() 产生随机数的平方根,直到资源耗尽。
观察到宿主机上的 CPU 使用率,第三个内核的使用率接近 100%, 并且一批进程的 CPU 使用率明显存在 2:1 的使用比例的对比。

2.6 内存限额

  • 与操作系统类似,容器可使用的内存包括两部分:物理内存和 Swap。

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

    • -m 或 --memory:设置内存的使用限额,例如 100M、1024M。
    • –memory-swap:设置 内存+swap 的总使用限额。 执行如下命令允许该容器最多使用 200M 的内存和 300M 的 swap。
[root@localhost stress]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M注意:
--vm 1:启动 1 个内存工作线程。
--vm-bytes 280M:每个线程分配 280M 内存。
默认情况下,容器可以使用主机上的所有空闲内存。

与 CPU 的 cgroups 配置类似, Docker 会自动为容器在目录 /sys/fs/cgroup/memory/docker/<容器的完整长 ID>中创建相应 cgroup 配置文件

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

[root@localhost stress]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310Mstress: 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

2.7 Block IO 的限制

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

在下面 的例子中,容器 A 读写磁盘的带宽是容器 B 的两倍。

[root@localhost docker]# docker run -it --name container_A --blkio-weight 600 centos:stress
[root@bbb0a299c8fd /]# cat /sys/fs/cgroup/blkio/blkio.weight
600[root@localhost docker]# docker run -it --name container_B --blkio-weight 300 centos:stress
[root@9f5062a35cec /]# cat /sys/fs/cgroup/blkio/blkio.weight
300

2.8 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 的速率为 5 MB/s。

[root@localhost docker]# docker run -it --device-write-bps /dev/sda:5MB centos:stress[root@96a5d7c68b96 /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct   //可以按ctrl+c中断查看
906+0 records in
906+0 records out
950009856 bytes (950 MB) copied, 181.202 s, 5.2 MB/s


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

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

[root@localhost docker]# docker run -it centos:stress[root@10531445df8d /]# 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, 0.928611 s, 1.2 GB/s

Cgroup 资源配置方法相关推荐

  1. Docker通过Cgroup 资源配置

    目录 一.Cgroup资源配置方法 二.使用stress工具测试CPU 和内存 1.权重 --cpu-shares 2.CPU周期限制 --cpu-period. --cpu-quota 3.CPU ...

  2. Docker Cgroup资源配置(CPU、内存、磁盘)

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

  3. cgroup资源配置

    一.cgroup介绍 二.利用stress 压力测试工具来测试 三.CPU控制 1.仅用率控制(权重) 2.周期限制 方法一:在命令行里直接设置 方法二:创建容器后,关闭容器在文件里直接修改 方法三: ...

  4. Cgroup 资源配置

    目录 一.Cgroup定义 二.使用stress压力测试工具测试cpu和内存状态 1.创建一个dockerfile文件 2.创建镜像 3.创建容器 ①创建容器 ②.创建容器并产生10个子函数进程 三. ...

  5. docker资源分配 Cgroup和安全通信 TLS

    1:docker资源分配 Cgroup [CPU 内存 I/O(单位时间内的吞吐量 单位时间内的读写速度)] 为什么要做资源分配 ? 容器----虚拟机 区别 虚拟机在创建的时候已经做了资源分配,(虚 ...

  6. Docker_Cgroup

    文章目录 一.Cgroup 1.概述 2.cgroup 作用 3.Cgroup资源控制的作用 4..cgroup中需要了解的四个概念 5.Cgroup 资源配置方法 二.使用stress工具测试CPU ...

  7. docker资源限制与compose

    目录 一.私有仓库建立 二.Cgroup 资源配置方法 三.CPU使用率控制 使用 stress 工具测试 CPU 和内存 四. CPU 周期限制 查询容器的资源限制参数 (1)在指定容器目录中 (2 ...

  8. linux管理子进程c,Linux 进程管理 CGroup

    Cgroups控制cup,内存,io资源示例 http://www.cnblogs.com/yanghuahui/p/3751826.html Docker组成LXC+AUFS  LXC=cgroup ...

  9. cgroups(7)— Linux中文手册页

    CGROUPS(7)Linux程序员手册CGROUPS(7) NAME         顶部 cgroups-Linux控制组 说明         顶部 控制组(通常称为cgroup)是Linux内 ...

  10. Kubernetes部署(六):k8s项目交付----(3)集群监控

    一.介绍Prometheus Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统.自2012年成为社区开源项目,拥有非常活跃的开发人员和用户社区.为强调开源及独立维护, ...

最新文章

  1. vue里面_Vue中如何使用自定义插件(plugin)
  2. JAVA多线程和并发面试问题
  3. 怎么把geany变成英文_细数Word中英文排版6大坑,我不相信你一个也没有遇到过...
  4. Docker学习总结(27)——Dockerfile详解
  5. 你的名字比我生命更重要
  6. 分别用switch语句和if语句实现键盘录入月份,输出对应的季节
  7. Oracle数据库的安装
  8. 如何开发类似QFIL下载工具
  9. 联想服务器linux系统raid驱动,SUSE Linux服务器企业版加载阵列卡驱动程序步骤
  10. MPEG-TS封装格式
  11. 沈家桢博士:缘起性空与人生
  12. VScode 安装中文插件,不生效的解决办法
  13. 唯品会财报:一面骄阳,一面寒霜
  14. OpenCV-Python之画椭圆
  15. 将数组转换成集合Arrays.asList,不可进行add和remove操作的原因
  16. 仿制微信/QQ在线聊天网站
  17. css 背景效果_软件技术:我写CSS的常用套路(附demo的效果实现与源码)
  18. Windows下驱动安装对话框不自动弹出怎么办
  19. 【Python】36氪(36kr)数据抓取 scrapy
  20. 关闭Windows Ctrl+Alt+Delete来解锁睡眠

热门文章

  1. 网格交易法——震荡行情的必杀技交易策略
  2. 磁盘串口和并口的区别
  3. 词法分析器java语言_Java语言词法分析器
  4. xshell安卓版下载_xshell5手机安卓版下载|Xshell5最新版下载_v5.0.1199_9ht安卓下载
  5. hack_lu_2018_heap_heaven
  6. 创建 VSTO 外接程序的windows安装包
  7. Altium Designed导出Gerber,Gerber文件所对应的层
  8. 微信群控二次开发SDK
  9. [MIT 6.S081] Lab 4: traps
  10. 计算机图表公式,通达信的DRAWICON49个图标公式