Linux cgroup 有两个子系统支持CPU隔离。
一个是cpu子系统,另一个是cpuset子系统。

cpu子系统根据进程设置的调度属性,选择对应的CPU资源调度方法

.1. 完全公平调度 Completely Fair Scheduler (CFS)
原理详见
https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txt
CFS用于处理以下几种进程调度策略
SCHED_OTHER
SCHED_BATCH
SCHED_IDLE

.2. 实时调度 Real-Time scheduler (RT)
原理详见
https://www.kernel.org/doc/Documentation/scheduler/sched-rt-group.txt
RT用于处理以下几种进程调度策略
SCHED_FIFO
SCHED_RR

CFS调度方法

CFS调度针对属性为SCHED_OTHER, SCHED_BATCH, SCHED_IDLE的进程。
限制手段分为两方面,
.1. 限制资源组的CPU使用硬上限,
.2. 以及资源组的CPU使用权重。
CFS调度资源组内的任务在CPU空闲时超权重使用CPU资源,但是不能超过硬上限。
例子

groupA : cpu.shares=250
groupB : cpu.shares=750

CFS保证了groupA的进程能使用25%的CPU资源,groupB的进程能使用75%的CPU资源。
如果CPU较空闲,groupA的进程能使用超过25%的CPU资源。
如果又加了个groupC进来,并且配置了cpu.shares = 250,那么CPU资源将在三个GROUP之间重分配。

  groupA : groupB : groupC = 25:75:25

注意 cpu.shares 务必 >= 2

cpu.shares只限制了使用下限,如果同时还需要设置CPU使用上限,可以通过以下两个参数来设置。

cpu.cfs_period_us = 统计CPU使用时间的周期
cpu.cfs_quota_us = 周期内允许占用的CPU时间(指单核的时间, 多核则需要在设置时累加)

如果分组中的任务在周期cpu.cfs_period_us内使用的CPU时间超过了cpu.cfs_quota_us,则进入抑制状态,并且需要等下一个周期才能继续使用CPU。

例子,周期为1秒,允许使用4秒CPU时间。(假设CPU>=4核心,表示这个组在一个使用周期(1s)内可以跑满4核资源)

cpu.cfs_period_us = 1000000
cpu.cfs_quota_us = 4000000

RT(real-time)调度方法

RT调度针对属性为SCHED_FIFO, SCHED_RR的进程。
与cfs的quota和period类似,限制了CPU使用的上限。但是rt调度只限制real-time tasks的CPU使用。

The RT scheduler works in a similar way to the ceiling enforcement control of the CFS (for more information, refer to Section 3.2.1, “CFS Tunable Parameters”) but limits CPU access to real-time tasks only.

cpu.rt_period_us = 统计CPU使用时间的周期
cpu.rt_runtime_us = 周期内允许任务使用单个CPU核的时间,如果系统中有多个核,则可以使用核倍数的时间 (计算方法与cfs不一样,需要注意) 
例子

As mentioned above, the access times are multiplied by the number of logical CPUs.
For example, setting cpu.rt_runtime_us to 200000 and cpu.rt_period_us to 1000000 translates to the task being able to
access a single CPU for 0.4 seconds out of every 1 second on systems with two CPUs (0.2 x 2),
or 0.8 seconds on systems with four CPUs (0.2 x 4).

分组统计信息

既然有抑制状态和CPU时间片的概念,那就有对应的统计信息
用来报告该分组内的CPU调度周期,抑制次数,抑制时长等信息。(注意它的统计不包括子分组的,另外有一个cpuacct的子系统统计信息包含了子分组的,另一篇文档会讲到)

cpu.stat
reports CPU time statistics using the following values: 已经过去多少个片段了
nr_periods — number of period intervals (as specified in cpu.cfs_period_us) that have elapsed. 抑制了多少次
nr_throttled — number of times tasks in a cgroup have been throttled
(that is, not allowed to run because they have exhausted all of the available time as specified by their quota). 所有任务加起来总共抑制了多长时间
throttled_time — the total time duration (in nanoseconds) for which tasks in a cgroup have been throttled.

从统计信息的抑制时间和抑制次数,可以判断是否需要给分组增加CPU的上限。

例子

.1. 
限制组cgroupA的任务最多可以使用8核资源
限制组cgroupB的任务最多可以使用16核资源

加载CPU子系统,创建子资源分区

mkdir -p /cgroup/cpu
mount -t cgroup -o cpu cpu /cgroup/cpu
cd /cgroup/cpu
mkdir cgroupA
mkdir cgroupB

配置资源配比(以100为基数,核数乘以100即得到cpu.shares)

cd cgroupA
echo 800 > cpu.shares
echo 1000000 > cpu.cfs_period_us
echo 8000000 > cpu.cfs_quota_us cd ../cgroupB
echo 1600 > cpu.shares
echo 1000000 > cpu.cfs_period_us
echo 16000000 > cpu.cfs_quota_us

运行任务

cgexec -g cpu:cgroupA pg_ctl start -D /home/digoal/pgdata1921
cgexec -g cpu:cgroupB pg_ctl start -D /home/digoal/pgdata1922

小结

.1. 限下限
cpu.shares
.2. 限上限
cpu.cfs_period_us
cpu.cfs_quota_us
.3. 限实时任务上限
cpu.rt_period_us
cpu.rt_runtime_us

cpuacct 子系统

cpuacct 子系统是用来统计CPU使用情况的子系统,功能定位不是隔离资源,而是统计资源的使用情况。
cpuacct子系统的统计数据包含子分区的。

【转载】Linux cgroup资源隔离各个击破之 - cpu隔离1的更多相关文章

  1. 混部之殇-论云原生资源隔离技术之CPU隔离(一)

    作者 蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. 导语 混部,通常指在离线混部(也有离在线混部之说 ...

  2. 【转载】Linux cgroup资源隔离各个击破之 - io隔离

    Linux Cgroup blkio子系统的用法.   blkio子系统支持的两种IO隔离策略 .1. (Completely Fair Queuing 完全公平队列)cfq io调度策略,支持按权重 ...

  3. [转载] linux cgroup

    原文: http://coolshell.cn/articles/17049.html 感谢左耳朵耗子的精彩文章. 前面,我们介绍了Linux Namespace,但是Namespace解决的问题主要 ...

  4. 深入理解 Linux Cgroup 系列(二):玩转 CPU

    原文链接:深入理解 Linux Cgroup 系列(二):玩转 CPU 上篇文章主要介绍了 cgroup 的一些基本概念,包括其在 CentOS 系统中的默认设置和控制工具,并以 CPU 为例阐述 c ...

  5. Docker基础技术:Linux CGroup

    前面,我们介绍了Linux Namespace,但是Namespace解决的问题主要是环境隔离的问题,这只是虚拟化中最最基础的一步,我们还需要解决对计算机资源使用上的隔离.也就是说,虽然你通过Name ...

  6. Linux CGroup

    catalog . 引言 . Cgroup安装配置 . Cgroup使用方式 . CGroup的子系统 1. 引言 我们已经讨论了Linux下命名空间(Namespace)的基本知识,详情请参阅另一篇 ...

  7. 深入理解 Linux Cgroup 系列(一):基本概念

    原文链接:深入理解 Linux Cgroup 系列(一):基本概念 Cgroup 是 Linux kernel 的一项功能:它是在一个系统中运行的层级制进程组,你可对其进行资源分配(如 CPU 时间. ...

  8. LINUX CGROUP总结

    简介: Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU.内存.磁盘输入输出等).这个项目最早是由Go ...

  9. Linux Cgroup 入门教程:cpuset

    这是 Cgroup 系列的第四篇,往期回顾: Linux Cgroup 入门教程:基本概念 Linux Cgroup 入门教程:CPU Linux Cgroup 入门教程:内存 通过上篇文章的学习,我 ...

随机推荐

  1. Tomcat在Linux服务器上的BIO、NIO、APR模式设置

    一.BIO.NIO.AIO 先了解四个概念: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时, ...

  2. webpack 3.X学习之多页面打包

    简介 我们开发不可能只写一个页面,每次都要写很多页面,这时为了开发效率,我们使用前端自动化工具webpack,那么webpack是如何打包页面的呢?又是如何打包多页面的呢? 单页面打包 我们知道要打包 ...

  3. akka-stream与actor系统集成以及如何处理随之而来的背压问题

    这几天上海快下了五天的雨☔️☔️☔️☔️,淅淅沥沥,郁郁沉沉.     一共存在四个api: Source.actorRef,返回actorRef,该actorRef接收到的消息,将被下游消费者所消费 ...

  4. Docker了解

    Docker了解1.Docker能做什么:Docker能够解决虚拟机能够解决的问题,同时也能够解决虚拟机由于请求资源过高无法解决的问题. *隔离应用依赖 *创建应用镜像并进行复制 *创建容易分发的即启 ...

  5. Python 项目实践三(Web应用程序)第二篇

    接着上节的继续学习,使用Django创建网页的过程通常分三个阶段:定义URL.编写视图和编写模板.首先,你必须定义URL模式,每个URL都被映射到特定的视图--视图函数获取并处理网页所需的数据.视图函 ...

  6. CGO 类型(CGO Types) 一

    CGO Types C作为一种混合编程语言已经很久了,无论那些广泛使用的包是用何种语言实现的,都导出了和C兼容的API.Go程序调用C程序,可以借助两种工具实现,一种是cgo,另一种是SWIG工具.C ...

  7. 【简单理解】gulp和webpack的区别

    Gulp和Webpack的基本区别: gulp可以进行js,html,css,img的压缩打包,是自动化构建工具,可以将多个js文件或是css压缩成一个文件,并且可以压缩为一行,以此来减少文件体积,加 ...

  8. 使用 JSON.parse 反序列化 ISO 格式的日期字符串, 将返回Date格式对象

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. [编织消息框架][netty源码分析]14 PoolChunk 的 PoolSubpage

    final class PoolSubpage<T> implements PoolSubpageMetric { //该page分配的chunk final PoolChunk<T ...

  10. Webpack 2 视频教程 012 - 理解Webpack 中的 CSS 作用域与 CSS Modules

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...