docker对cpu使用及在kubernetes中的应用
docker对CPU的使用
docker对于CPU的可配置的主要几个参数如下:
--cpu-shares CPU shares (relative weight)
--cpu-period Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota Limit CPU CFS (Completely Fair Scheduler) quota
--cpuset-cpus CPUs in which to allow execution (0-3, 0,1)
这些参数主要是通过配置在容器对应cgroup中,由cgroup进行实际的CPU管控。其对应的路径可以从cgroup中查看到
cpuset-cpus
[root@node-156 ~]# cat /sys/fs/cgroup/cpuset/docker/12c35c978d926902c3e5f1235b89a07e69d484402ff8890f06d0944cc17f8a71/cpuset.cpus
0-31
cpuset
主要用于指定容器运行的CPU编号,也就是我们所谓的绑核。
cpushare
[root@node-156 ~]# cat /sys/fs/cgroup/cpu/docker/12c35c978d926902c3e5f1235b89a07e69d484402ff8890f06d0944cc17f8a71/cpu.shares
1024
cpushare
主要用于cfs中调度的权重。一般来说,在条件相同的情况下,cpushare值越高的,将会分得更多的时间片。
两个容器的CPU时间片比重并不是严格权重的比值,因为两个容器可能对CPU时间片的需求不同。
cpu-period和cpu-quota
[root@node-156 ~]# cat /sys/fs/cgroup/cpu/docker/12c35c978d926902c3e5f1235b89a07e69d484402ff8890f06d0944cc17f8a71/cpu.cfs_quota_us
-1
[root@node-156 ~]# cat /sys/fs/cgroup/cpu/docker/12c35c978d926902c3e5f1235b89a07e69d484402ff8890f06d0944cc17f8a71/cpu.cfs_period_us
100000
cfs_quota_us
和cfs_period_us
两个值是联合使用的,两者的比值,即cfs_quota_us
/cfs_period_us
代表了该容器实际可用的做多的CPU核数。
比如cfs_quota_us
=50000,cfs_period_us
=100000,那么二者的比值是0.5,也就是说该容器可以使用0.5个cpu。这样的管控粒度更细,在cgroup使用systemd时最低可以到0.01核。
cfs_quota_us
如果为-1
,则表示容器使用CPU不受限制。
绑核方式的益处和弊端
我们先前主要使用的是cpuset
,也就是通过绑核的方式。这一方式严格的保证了容器可以使用的CPU的真正的核数。并通过调度使得其他容器不绑定这几个CPU,使得容器可以独享这些cpu。这也就意味着容器的最多使用的CPU个数和最小消耗的CPU的数目都是这些核数。
这样的方式安全性高,保证容器的效率,但是弊端也很多:
- 不够灵活
- 资源利用率低,因为容器可能声明使用了多个CPU,但是实际利用率很低
- 在NUMA架构下,未考虑CPU亲和性的话,可能会导致性能下降
kubernetes中的CPU使用
kubernetes对容器可以设置两个值:
spec.containers[].resources.limits.cpu
spec.containers[].resources.requests.cpu
limits主要用以声明使用的最大的CPU核数。通过设置cfs_quota_us
和cfs_period_us
。比如limits.cpu=3,则cfs_quota_us
=300000。
cfs_period_us
值一般都使用默认的100000
request则主要用以声明最小的CPU核数。一方面则体现在设置cpushare
上。比如request.cpu=3,则cpushare
=1024*3=3072。
另一方面是提供调度时候使用。
当创建一个Pod时,Kubernetes调度程序将为Pod选择一个节点。每个节点具有每种资源类型的最大容量:可为Pods提供的CPU和内存量。调度程序确保对于每种资源类型,调度的容器的资源请求的总和小于节点的容量。尽管节点上的实际内存或CPU资源使用量非常低,但如果容量检查失败,则调度程序仍然拒绝在节点上放置Pod。
而计算节点CPU的已经分配的量就是通过计算所有容器的request的和得到的。
可以参考Managing Compute Resources for Containers
kubernetes对CPU使用的益处
- 更加灵活,更细粒度的控制。CPU的限制不仅仅在CPU核这个级别,甚至可以到0.01核。
- CPU复用。绑核之后容器既无法使用其他的CPU,容器自己本身绑定的CPU也无法被其他容器使用。最小最大资源使用量都是这几个核。而kubernetes的方式可以实现所有的CPU成为一个CPU池,提供给CPU使用。
- 可控和可靠的“超卖”
- best-effort任务支持。可以充分利用闲置的CPU资源,使得best-effort任务得到最大限度的资源支持。同时当资源紧张时,又可以优先杀死best-effort,保证Guaranteed的容器的资源使用。可以参考Resource Quality of Service in Kubernetes。
可能的问题
linux对NUMA下的CPU调度是有一些优化的。可以参考Linux 的 NUMA 技术。
numa架构下,可能还会一些其他问题需要关注,比如NUMA架构的CPU中提的,可能会有些影响。
docker对cpu使用及在kubernetes中的应用的更多相关文章
- kubernetes中的Pause容器如何理解?
前几篇文章都是讲的Kubernetes集群和相关组件的部署,但是部署只是入门的第一步,得理解其中的一些知识才行.今天给大家分享下Kubernets的pause容器的作用. Pause容器 全称infr ...
- 关于 Kubernetes 中的 Volume 与 GlusterFS 分布式存储
容器中持久化的文件生命周期是短暂的,如果容器中程序崩溃宕机,kubelet 就会重新启动,容器中的文件将会丢失,所以对于有状态的应用容器中持久化存储是至关重要的一个环节:另外很多时候一个 Pod 中可 ...
- Kubernetes 中的核心组件与基本对象概述
Kubernetes 是 Google 基于 Borg 开源的容器编排调度,用于管理容器集群自动化部署.扩容以及运维的开源平台.作为云原生计算基金会 CNCF(Cloud Native Computi ...
- Kubernetes 中的pv和pvc
原文地址:http://www.cnblogs.com/leidaxia/p/6485646.html 持久卷 PersistentVolumes 本文描述了 Kubernetes 中的 Persis ...
- Kubernetes中的Volume介绍
Kubernetes中支持的所有磁盘挂载卷简介发表于 2018年1月26日 Weihai Feb 10,2016 7400 字 | 阅读需要 15 分钟 容器磁盘上的文件的生命周期是短暂的,这就使得在 ...
- 概念验证:在Kubernetes中部署ABAP
对于将SAP ABAP应用服务器组件容器化和在Kubernetes中部署它们,我们在SPA LinuxLab中做了概念验证(PoC),本文将介绍一些我们的发现和经验.本文会也会指出这项工作的一些潜在的 ...
- Kubernetes中 Pod 是怎样被驱逐的?
前言 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 IO).可压缩资源不可能导致 Pod 被驱 ...
- Kubernetes中资源清单与Pod的生命周期(二)
一.资源清单 1,定义: 在k8s中一般使用yaml格式的文件来创建符合我们预期的资源,这样的yaml被称为资源清单. 使用资源清单创建Pod: kubectl apply -f nginx.yaml ...
- 傲视Kubernetes(三):Kubernetes中的Pod
从本文开始,将正式开始Kubernetes的核心内容学习.首先要了解的是Pod,总共大约分为六篇左右,本篇是第一篇,相信学完之后,我们会对Pod有一个整体的理解. 本文内容: 1.什么是Pod 2.P ...
随机推荐
- 新人报道~cnblogs
我的名字:杨先生 我的英文名:Allen 和你们一样,是一名程序猿,专业技能 C#.前端小块.
- 【一通百通】c/php的printf用法
1.先说说PHP printf()函数: printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); %d 十进制有符号整数 ...
- SQL case when 的使用总结
在网上看到一篇关于case when语句的博客,写得很好,我这里是摘录的,还有我的一些体会,原博客地址:SQL Case when 的使用方法. Case具有两种格式.简单Case函数和Case搜索函 ...
- 字符串的模式匹配(Java实现)
字符串的模式匹配 字串的定位操作通常称做模式匹配,是各种串处理系统中最重要的操作之一.本文主要介绍两种常用的实现算法: 1.暴力匹配 2.KMP算法 1.暴力匹配 时间复杂度为O(n*m):n为主串长 ...
- C语言 动态数组实现
一.概述 C语言是不能直接定义动态数组的,数组必须在初始化时确定长度. 如果要在程序运行时才确定数组的长度,就需要在运行的时候,自己去向系统申请一块内存用动态内存分配实现动态数组. 二.动态内存分配函 ...
- 【webpack学习笔记(一)】流行的前端模块化工具webpack初探
从开发文件到生产文件 有一天我突然意识到一个问题,在使用react框架搭建应用时,我使用到了sass/less,JSX模版以及ES6的语法在编辑器下进行开发,使用这些写法是可以提高开发的效率.可是 ...
- new表达式如何创建对象
new表达式如何创建对象 前言 刚学java时曾一度认为,构造器中this指向是当前类型的对象,当我们调用new表达式时,由父类的构造器生成对象的一部分并初始化,然后再由子类的构造器补充成完整的对象并 ...
- Gym 101257G 24 (概率+二分)
题意: 有一道分值为sa的题,n个人比赛写这道题,按照递减的顺序给出每个人的当前分数,和每个人写不出这道题的概率,让你输出有反超现象出现的期望 思路:由于之前把题目翻译错了导致很久没有相通,后来看了别 ...
- 关于sql、mysql语句的模糊查询分类与详解,包括基本用法和mapper.xml文件里插入写法
欢迎猿类加qq:2318645572,共同学习进步 实际例子: ssm框架:service业务层->dao层->mappers.xml->junit/test测试 1:service ...
- android-studio-bundle-141.2178183首次执行Hello World的时候出现ADB not responding. If you'd like to retry, then please manually kill "adb.e的错误
这是由于有其他程序在占用adb.exe要使用的端口5037,打开命令提示符cmd,输入指令netstat -aon|findstr 5037查看在使用此端口的程序,如 8036即为占用该端口号的PID ...