1.docker限制cpu使用

1.1 使用CFS调度

默认情况下,容器可以无限制地使用主机的cpu资源,可以通过设置参数来进行限制。一般都采用Linux默认的CFS调度法,当然也可以使用实时调度。CFS调度可以使用如下参数来进行限制:

  1. --cpus=<value>:限制容器可以使用多少cpu,可以设置为小数,例如可以设置--cpus=1.5。该选项代表使用cpu的百分比,而不是具体的个数。例如主机一共有四个cpu,设--cpus=2,不代表有两个cpu被100%占用,另外两个完全空闲,可能四个cpu各被占用50%。docker1.13版本开始支持该选项,之前的版本配合使用--cpu-period和--cpu-quota选项,设置--cpus=1.5相当于设置--cpu-period=100000和--cpu-quota=150000。
  2. --cpu-period=<value>:指定cpu CFS的周期,通常和--cpu-quota一起使用,单位是us。默认值是100毫秒,但是大多用户一般不会改变这个值,使用--cpus=<value>更加方便。
  3. --cpu-quota=<value>:指定容器在一个cpu CFS调度周期中可以使用cpu的时间,单位是us。通常和--cpu-period一起使用,一般使用--cpus=<value>更加方便。
  4. --cpuset-cpus=<value>:限制容器可以使用指定的cpu,如果有多个cpu,可以以逗号分隔或者使用连字符进行指定,比如1,3代表使用第1和第3个cpu,0-3代表使用编号为0,1,2,3的cpu。
  5. --cpu-shares=<value>:容器使用cpu的权重,默认值是1024,不设置或者将其设置为0都将使用默认值,数值越大权重越大。这是一个软限制,只有cpu资源不足时才生效。当cpu资源充足时,各个容器可以在不超过资源限制的条件下使用cpu资源;当cpu资源不足,并有多个容器竞争cpu资源时,系统会根据每个容器的权值和所有容器权值的比例来给容器分配 cpu使用时间,如果容器A设置为--cpu-shares=2048,容器B设置为--cpu-shares=1024,容器A会被分配大约66%的cpu时间,容器B被分配大约33%的cpu时间。

1.2 使用实时调度

对于某些不能使用CFS调度的任务,可以将容器配置成实时调度模式。首先要保证主机内核配置正确,然后才能配置docker守护进程和容器。通过运行zcat /proc/config.gz | grep CONFIG_RT_GROUP_SCHED命令或者检查是否存在/sys/fs/cgroup/cpu.rt_runtime_us文件来确定内核是否允许实时调度;然后在运行docker守护进程的时候,使用--cpu-rt-runtime=<value>参数来设置在一个运行周期内,分配给实时调度任务的时间,例如默认周期为1s,如果设置--cpu-rt-runtime=950000,可以确保使用实时调度配置的容器每1s内可以运行0.95s,留下0.05s给非实时任务,也可以使用systemd来进行永久有效的设置,可以参考https://docs.docker.com/config/daemon/systemd/。在运行容器时,可以使用如下参数进行限制:

  1. --cap-add=sys_nice:赋予容器CAP_SYS_NICE的能力,允许容器增加进程友好值、设置实时调度策略、设置cpu亲和性和其他操作。
  2. --cpu-rt-runtime=<value>:在docker守护进程的实时调度程序周期内,容器可以以实时优先级运行的最长时间,单位为us,必须设置了--cap-add=sys_nice参数才能使用。
  3. --ulimit rtprio=<value>:允许容器设置的最大实时优先级,必须设置了--cap-add=sys_nice参数才能使用。

例子:

docker run -it \

--cpu-rt-runtime=950000 \

--ulimit rtprio=99 \

--cap-add=sys_nice \

debian:jessie

2.docker限制内存使用

  1. -m= <value>或--memory=<value>:内存限制,最小值为6m。
  2. --memory-swap =<value>:内存+交换分区的总限制,只有设置了-m之后,这个参数才有意义。如果--memory=300m,--memory-swap=1g,那么容器可以使用300m的内存和700m的交换分区;如果设置的数值和--memory一样,那么容器无法使用交换分区;如果该值没有设置,容器最多可以使用和--memory一样大的交换分区;如果该值设置为0,那么相当于没有设置;如果设置为-1,可以使用的交换分区大小无限制。此外,可以用docker stats containerID来查看某个容器的运行状态。
  3. --memory-swappiness=<value>:默认情况下,容器的内核可以交换出一定比例的匿名页,此参数用来设置可用的比例。数值在0-100之间,0代表关闭匿名页交换,100表示所有匿名页都可以交换。如果没有设置该值,该值默认从父进程继承而来。
  4. --memory-reservation=<value>:是一种软性限制,确保容器不会长时间占用超过--memory-reservation限制的内存大小,但是不保证时时刻刻都不超过该限制值。当该值比--memory小时,在主机内存资源紧张时,会强迫容器的内存占用不超过该值;没有设置时,该值和--memory的值相同;将其设置为0或者大于--memory时,相当于没有设置。
  5. --kernel-memory=<value>:容器可以使用的最大内核内存值,最小值为4m。
  6. --oom-kill-disable:默认情况下,OOM错误发生时,主机会杀死容器进程来获取更多内存。使用该选项,可以避免容器进程被杀死,但是应该在设置了-m/--memory参数之后才使用该选项,不然不限制容器内存使用,却禁止主机杀死容器进程,当出现OOM错误时,系统会杀死主机进程来获取内存。

docker限制cpu、内存使用相关推荐

  1. 如何给docker容器分配内存和cpu

    如何给docker容器分配内存和cpu?默认情况下,容器使用的资源是不受限制的.也就是可以使用主机内核调度器所允许的最大资源.但是在容器的使用过程中,经常需要对容器可以使用的主机资源进行限制,下面我们 ...

  2. docker容器 cpu memory 资源限制

    目录 背景 cgroup简介 内存限制 内存限制相关的参数 用户内存限制 Memory reservation OOM killer 核心内存 Swappiness CPU 限制 概述 CPU 限制相 ...

  3. CentOS7 查询版本/CPU/内存/硬盘容量等命令

    1.系统 1.1版本 uname -a 能确认是64位还是32位,其它的信息不多 [root@ecs-681b ~]# uname -a Linux ecs-681b 3.10.0-1062.9.1. ...

  4. 修改docker内java内存_在docker中使用java的内存情况

    Java和Docker不是天然的朋友. Docker可以设置内存和CPU限制,而Java不能自动检测到.使用Java的Xmx标识(繁琐/重复)或新的实验性JVM标识,我们可以解决这个问题. 虚拟化中的 ...

  5. 如何获取服务器的CPU,内存进行限流

    文章目录 如何获取服务器的CPU,内存进行限流 如何获取服务器的CPU,内存进行限流 需要包名 "github.com/shirou/gopsutil/v3/cpu""g ...

  6. KVM - 调整cpu内存、网卡

    1.查看母机里面的子机情况 [root@bogon ~]# virsh list --all Id    Name                           State ---------- ...

  7. 高cpu_实用脚本:检查高 CPU / 内存消耗进程 | Linux 中国

    本教程中包含两个脚本,它们可以帮助你确定 Linux 上高 CPU/内存消耗进程的运行时间. • 来源:linux.cn • 作者:Magesh Maruthamuthu • 译者:geekpi • ...

  8. 处理器仿存带宽_linux服务器CPU内存硬盘读写带宽等性能测试方法

    如何对一个VPS主机进行CPU内存,硬盘IO读写,带宽速度等项目测试,像UnixBench和压力测试则可以综合反映一个VPS的性能水平,方便大家对照参考. VPS性能测试:CPU内存,硬盘IO读写,带 ...

  9. 一个用了统计CPU 内存 硬盘 使用率的shell脚本

    一个用了统计CPU 内存 硬盘 使用率的shell脚本 一个统计 CPU 内存 硬盘 使用率的shell脚本,供大家学习参考 代码如下: #!/bin/bash #This script is use ...

  10. Intel CPU内存屏障

    CPU内存屏障用于保障有序性. volatile禁止指令重排序,可以保证有序. CPU内存屏障,Intel设计得比较简单,总共只有3条指令: ①sfence:也就是save fence,写屏障指令.在 ...

最新文章

  1. python3实现mysql导出excel
  2. Dash:程序员的好帮手(转载)
  3. ARM的批量加载/存储指令
  4. 前端入门--解决问题的一些方法
  5. ubuntu下svn命令
  6. linux 进程 控制终端,linux系统编程之进程(五):终端、作业控制与守护进程
  7. 怎么进行数据平滑滤波_气相色谱数据处理方法 EWG1990仪器学习网
  8. RF和GBDT和Xgboost的异同总结,加上lightgbm
  9. 【模拟】Codeforces 711A Bus to Udayland
  10. matlab gui教程 计算器,matlab gui编写的计算器程序
  11. CircularFifoQueue队列API
  12. 使用说明 思迅收银系统_思迅天店标准版收银系统条码秤+计价秤操作指南
  13. 网线制作相关基础知识
  14. 华为手机如何更新鸿蒙系统_华为鸿蒙系统怎么升级?升级鸿蒙系统步骤
  15. 华为防火墙笔记-网络地址转化NAT
  16. Sloth组件之NetRisc.Configuration
  17. 交通仿真 | SUMO第一步
  18. RHCE(八)ansible基础配置学习
  19. 如何用Python记录微信撤回的消息
  20. 雪花飘落代码java_个人网站html5雪花飘落代码JS特效下载

热门文章

  1. 计算机安全意识小故事,安全故事精选5篇
  2. 分布式监控平台CAT原理
  3. Android-高德api使用常见错误
  4. android youtube webview,在Android WebView中播放Youtube HTML5嵌入式视频
  5. html目录链接怎么做,word目录超链接怎么做
  6. Ubuntu中安装和使用vim
  7. MySQL5.7 配置优化
  8. 保存到千牛服务器的文件在哪里,压缩包里的文件保存后在哪里?
  9. OA系统行业解析:中小型企业OA选型常见问题
  10. 按照斗地主的规则,完成洗牌发牌的动作