限制容器对CPU的使用

默认设置下,所有容器可以平等地使用 host CPU 资源并且没有限制。

  • Docker 可以通过 -c 或 --cpu-shares 设置容器使用 CPU 的权重。如果不指定,默认值为 1024。
  • 与内存限额不同,通过 -c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。
  • 某个容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例。

通过 cpu share 可以设置容器使用 CPU 的优先级

在 host 中启动了两个容器:

 docker run --name "container_A" -c  ubuntu
docker run --name "container_B" -c ubuntu
  • container_A 的 cpu share 1024,是 container_B 的两倍。
  • 当两个容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。

需要特别注意的是,这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。如果 container_A 处于空闲状态,这时,为了充分利用 CPU 资源,container_B 也可以分配到全部可用的 CPU。

使用 progrium/stress测试一下:

启动 container_A,cpu share 为 1024:

 root@ubuntu:~# docker run  --name container_A -it -c  progrium/stress --cpu
stress: info: [] dispatching hogs: cpu, io, vm, hdd
stress: dbug: [] using backoff sleep of 6000us
stress: dbug: [] --> hogcpu worker [] forked
stress: dbug: [] using backoff sleep of 3000us
stress: dbug: [] --> hogcpu worker [] forked

--cpu 用来设置工作线程的数量。因为当前 host 只有 2 颗 CPU,所以一个工作线程就能将 CPU 压满。如果 host 有多颗 CPU,则需要相应增加 --cpu 的数量。

启动 container_B,cpu share 为 512:

 root@ubuntu:~# docker run  --name container_B -it -c  progrium/stress --cpu
stress: info: [] dispatching hogs: cpu, io, vm, hdd
stress: dbug: [] using backoff sleep of 6000us
stress: dbug: [] --> hogcpu worker [] forked
stress: dbug: [] using backoff sleep of 3000us
stress: dbug: [] --> hogcpu worker [] forked

在 host 中执行 top,查看容器对 CPU 的使用情况:

 root@ubuntu:~# top
top - :: up days, :, users, load average: 3.76, 1.94, 0.81
Tasks: total, running, sleeping, stopped, zombie
%Cpu(s):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 : total, free, used, buff/cache
KiB Swap: total, free, used. avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root R 66.8 0.0 :22.19 stress #container_A root R 66.4 0.0 :22.23 stress
root R 33.2 0.0 :44.54 stress #container_B
root R 32.9 0.0 :44.49 stress
root S 0.0 0.1 :13.31 systemd
root S 0.0 0.0 :00.01 kthreadd
root S 0.0 0.0 :00.16 ksoftirqd/
root - S 0.0 0.0 :00.00 kworker/:0H

container_A 消耗的 CPU 是 container_B 的两倍。

现在暂停 container_A:

 root@ubuntu:~# docker pause container_A
container_A
root@ubuntu:~#

top 显示 container_B 在 container_A 空闲的情况下能够用满整颗 CPU:

 root@ubuntu:~# top
top - :: up days, :, users, load average: 2.86, 2.86, 1.52
Tasks: total, running, sleeping, stopped, zombie
%Cpu(s): 99.8 us, 0.2 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : total, free, used, buff/cache
KiB Swap: total, free, used. avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root R 100.0 0.0 :46.35 stress
root R 100.0 0.0 :46.33 stress
root S 0.0 0.1 :13.31 systemd
root S 0.0 0.0 :00.01 kthreadd

------------------------引用来自---------------------------

https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587664&idx=1&sn=3f3185b9e5d55c8d0b9859340eecd860&chksm=8d3080c9ba4709df0b0bd72cb4fc8e9bf47bf2086823f44c0a6a758adc6cc7a0fafc399c911a&scene=21#wechat_redirect

第 4 章 容器 - 028 - 限制容器对CPU的使用的更多相关文章

  1. JAVA同步容器和并发容器

    同步容器类 同步容器类的创建 在早期的JDK中,有两种现成的实现,Vector和Hashtable,可以直接new对象获取: 在JDK1.2中,引入了同步封装类,可以由Collections.sync ...

  2. 父容器根据子容器高度自适应:设置父容器 height:100%;overflow:hidden;

    父容器根据子容器高度自适应:设置父容器  height:100%;overflow:hidden;

  3. C++学习基础四——顺序容器和关联容器

    —顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue ...

  4. Java并发——同步容器与并发容器

    同步容器类 早期版本的JDK提供的同步容器类为Vector和Hashtable,JDK1.2 提供了Collections.synchronizedXxx等工程方法,将普通的容器继续包装.对每个共有方 ...

  5. C++顺序性容器、关联性容器与容器适配器

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...

  6. 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

    经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...

  7. IOC容器在web容器中初始化——(一)两种配置方式

    参考文章http://blog.csdn.net/liuganggao/article/details/44083817,http://blog.csdn.net/u013185616/article ...

  8. spring容器和springmvc容器,以及web容器的关系

    说到spring和springmvc,其实有很多人分不清他们有什么区别,认为它俩是一样的,如果你问他项目里用的什么MVC技术,他会说我们用的spring和mybatis,或者spring和hibern ...

  9. 结合源码浅谈Spring容器与其子容器Spring MVC 冲突问题

    容器是整个Spring 框架的核心思想,用来管理Bean的整个生命周期. 一个项目中引入Spring和SpringMVC这两个框架,Spring是父容器,SpringMVC是其子容器,子容器可以看见父 ...

随机推荐

  1. linux下部署git服务器

    我这里用的是redhat7.4, 直接开始吧. 环境 服务端: Redhat7.4 + git(version 1.8.3.1) IP:192.168.137.168 客户端: win7 + git ...

  2. 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器

    一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...

  3. Windows 动态链接库DLL使用

    转载:https://blog.csdn.net/heyabo/article/details/8721611 转载:https://www.cnblogs.com/jin521/p/5598529. ...

  4. 【Python045-魔法方法:属性访问】

    一.属性的几种访问方式 1.类.属性名 >>> class C: def __init__(self): self.x = 'X-man' >>> c = C() ...

  5. vue学习【第五篇】:Vue组件

    什么是组件 - 每一个组件都是一个vue实例 - 每个组件均具有自身的模板template,根组件的模板就是挂载点 - 每个组件模板只能拥有一个根标签 - 子组件的数据具有作用域,以达到组件的复用 根 ...

  6. vscode Git:failed to execute git

    在vscoad中选择全部提交时候提示 Git:failed to execute git在git日志中会看到这么一行错误信息 empty ident name (for <XXXXXX.com& ...

  7. 使用kubeadm 安装 kubernetes 1.12.0

    目录 简介: 架构说明: 系统配置: 1.1 关闭防火墙 1.2 禁用SELinux 1.3 关闭系统Swap 1.4 安装docker 使用kubeadm部署Kubernetes: 2.1 安装ku ...

  8. 好用的js模板

    组织form下的 json对象 $.fn.serializeObject = function() { var o = {"unique_id":new Date().getTim ...

  9. MongoDB集群配置笔记二(实战)

    单台mongodb配置文件: dbpath=/opt/mongodb/data logpath=/opt/mongodb/logs/mongodb.log logappend=true fork=tr ...

  10. MTP 写字机器

    目标 无意中看到下面视频,我打算也实现一个类似机器 视频.视频2.视频3 来源于油管Creativity Buzz的创意,顺便了解到有家AxiDraw公司在生产这种机器,淘宝上也有售卖. 想法 观看视 ...