Cgroups使用

2023-11-04

Cgroups使用

一.                      Cgroups介绍

linux内核提供了cgroups控制组(controlgroups)的功能,最初由google的工程师提出,后来被整合进Linux内核。Cgroups也是LXC(LinuxContainer容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性)为实现虚拟化所使用的资源管理手段。

默认cgroups配置文件在/etc/cgconfig.conf中,具体的挂载目录请参见配置文件。

重新启动:/etc/init.d/cgconfigrestart

安装包:yuminstall libcgroup libcgroup-tools

二.                      Cgroups基本概念

1.     控制组(controlgroup)。

控制组就是一组按照某种标准划分的进程。Cgroups中的资源控制都是以控制组为单位实现。一个进程可以加入到某个控制组,也从一个进程组迁移到另一个控制组。一个进程组的进程可以使用cgroups以控制组为单位分配的资源,同时受到cgroups以控制组为单位设定的限制。

2.     层级(hierarchy)。

控制组可以组织成hierarchical的形式,既一颗控制组树。控制组树上的子节点控制组是父节点控制组的孩子,继承父控制组的特定的属性。

3.     子系统(subsytem)。

一个子系统就是一个资源控制器,比如cpu子系统就是控制cpu时间分配的一个控制器。子系统必须附加(attach)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。可用子系统:

·        blkio--这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB等等)。

·        cpu--这个子系统使用调度程序提供对CPU的cgroup任务访问。

·        cpuacct--这个子系统自动生成cgroup中任务所使用的CPU报告。

·        cpuset--这个子系统为cgroup中的任务分配独立CPU(在多核系统)和内存节点。

·        devices--这个子系统可允许或者拒绝cgroup中的任务访问设备。

·        freezer--这个子系统挂起或者恢复cgroup中的任务。

·        memory--这个子系统设定cgroup中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。

·        net_cls--这个子系统使用等级识别符(classid)标记网络数据包,可允许Linux流量控制程序(tc)识别从具体cgroup中生成的数据包。

·        ns--名称空间子系统。

三.                      几个常用示例

1.     CPU使用时间(使用率)限制

mkdir /cgroup/cpu/limit#创建CPU控制组limit,或cgcreate -g cpu:/limit

echo 50000> /cgroup/cpu/limit/cpu.cfs_quota_us #将cpu.cfs_quota_us设置为50000,相当于cpu.cfs_period_us值100000的50%,或cgset-r cpu.cfs_quota_us=50000 limit

echo $pid> /cgroup/cpu/limit/tasks #将需要限制CPU使用率的的进程ID写到tasks中,或cgclassify -g cpu:limit $pid

echo ‘’ >/cgroup/cpu/limit/tasks #取消限制

rmdir/cgroup/cpu/limit #删除CPU控制组limit,或cgdelete cpu:/limit

2.     CPU资源绑定

mkdir/cgroup/cpuset/limit #创建CPU设置控制组limit,或cgcreate -g cpuset:/limit

echo ‘0-2,16’/cgroup/cpuset/limit/cpuset.cpus #将所绑定的CPU核ID写入到cpuset.cpus中,或cgset -r cpuset.cpus=‘0-2,16’ limit

echo $pid> /cgroup/cpuset/limit/ tasks #将需要绑定CPU核心的进程ID写入到tasks中,或cgclassify -g cpuset:limit $pid

3.     内存资源限制

mkdir/cgroup/memory/limit #创建内存控制组limit

echo 104857600> /cgroup/memory/limit/memory.limit_in_bytes #分配100M内存给这个控制组

echo $pid> /cgroup/memory/limit/tasks #将需要限制内存使用的进程ID写到tasks中,一旦进程内存超过配置的值,将发生OOM killer(Out-Of-Memory killer)

4.     IO资源限制

mkdir /cgroup/blkio/limit#创建IO控制组limit

echo '252:2   1048576' > /cgroup/blkio/limit/blkio.throttle.read_bps_device #限制设置252:2读速度为1M/s,252:2为对应的主设备号和副设备号,可能通过ls -l /dev/vda2 查看,后面的数字为限制带宽

echo $pid> /cgroup/blkio/limit/tasks #将需要限制IO的进程ID写入到tasks中

四.                      常用cgroups参数

通过上面,可以看到调整某个组里面的参数,并且将进程ID加入到该组中,就可以对进程进行资源控制,以下是可能用到的相关子系统的参数:

1.     blkio

1.1.  blkio.weight

指定cgroup默认可用访问块I/O的相对比例(加权),范围在100到1000。这个值可由具体设备的blkio.weight_device参数覆盖。例如:如果将cgroup访问块设备的默认加权设定为500,请运行:

echo 500 > blkio.weight

1.2.  blkio.weight_device

指定对cgroup中可用的具体设备I/O访问的相对比例(加权),范围是100到1000。这个值可由为设备指定的blkio.weight参数覆盖。例如:如果为访问/dev/sda的cgroup分配加权500,请运行:

echo "8:0 500" > blkio.weight_device

1.3.  blkio.throttle.read_bps_device

此参数用于设定设备执行“读”操作字节的上限。“读”的操作率以每秒的字节数来限定。bytes_per_second是“读”操作可被执行的上限率。例如,让/dev/sda设备运行“读”操作的最大速率是10MBps,请运行:

echo "8:0 10485760" >/cgroup/blkio/test/blkio.throttle.read_bps_device

1.4.  blkio.throttle.write_bps_devicev

此参数用于设定设备执行“写”操作次数的上限。“写”的操作率用“字节/秒”来表示。bytes_per_second是“写”操作可被执行的上限率。例如,让/dev/sda设备执行“写”操作的最大比率为10MBps,请运行:

echo "8:0 10485760"> /cgroup/blkio/test/blkio.throttle.write_bps_device

1.5.  blkio.throttle.read_iops_device

此参数用于设定设备执行“读”操作次数的上限。“读”的操作率以每秒的操作次数来表示。operations_per_second是“读”可被执行的上限率。例如:如要设定/dev/sda设备执行“读”的最大比率为10次/秒,请运行:

echo "8:0 10"> /cgroup/blkio/test/blkio.throttle.read_iops_device

1.6.  blkio.throttle.write_iops_device

此参数用于设定设备执行“写”操作次数的上限。“写”的操作率以每秒的操作次数来表示。operations_per_second是“写”操作可被执行的上限率。例如:如要让/dev/sda设备执行“写”操作的最大比率为10次/秒,请运行:

echo "8:0 10">/cgroup/blkio/test/blkio.throttle.write_iops_device

 

2.     cpu

2.1.  cpu.shares

包含用来指定在cgroup中的任务可用的相对共享CPU时间的整数值。例如:在两个cgroup中都将cpu.shares设定为1的任务将有相同的CPU时间,但在cgroup中将cpu.shares设定为2的任务可使用的CPU时间是在cgroup中将cpu.shares设定为1的任务可使用的CPU时间的两倍。

2.2.  cpu.cfs_period_us

此参数可以设定重新分配cgroup可用CPU资源的时间间隔,单位为微秒(μs,这里以“us”表示)。如果一个cgroup中的任务在每1秒钟内有0.2秒的时间可存取一个单独的CPU,则请将cpu.rt_runtime_us设定为2000000,并将cpu.rt_period_us设定为1000000。cpu.cfs_quota_us参数的上限为1秒,下限为1000微秒。

2.3.  cpu.cfs_quota_us

此参数可以设定在某一阶段(由cpu.cfs_period_us规定)某个cgroup中所有任务可运行的时间总量,单位为微秒(μs,这里以"us"代表)。一旦cgroup中任务用完按配额分得的时间,它们就会被在此阶段的时间提醒限制流量,并在进入下阶段前禁止运行。如果cgroup中任务在每1秒内有0.2秒,可对单独CPU进行存取,请将cpu.cfs_quota_us设定为200000,cpu.cfs_period_us设定为1000000。请注意,配额和时间段参数都根据CPU来操作。例如,如要让一个进程完全利用两个CPU,请将cpu.cfs_quota_us设定为200000,cpu.cfs_period_us设定为100000。如将cpu.cfs_quota_us的值设定为-1,这表示cgroup不需要遵循任何CPU时间限制。这也是每个cgroup的默认值(rootcgroup除外)。

 

3.     cpuset

3.1.  cpuset.cpus(强制)

设定该cgroup任务可以访问的CPU。这是一个逗号分隔列表,格式为ASCII,小横线("-")代表范围。例如:

0-2,16 表示CPU0、1、2和16。

3.2.  cpuset.mems(强制)

设定该cgroup中任务可以访问的内存节点。这是一个逗号分隔列表,格式为ASCII,小横线("-")代表范围。例如:

0-2,16 表示内存节点0、1、2和16。

 

4.     memory 

4.1.  memory.limit_in_bytes

设定用户内存(包括文件缓存)的最大用量。如果没有指定单位,则该数值将被解读为字节。但是可以使用后缀代表更大的单位——k或者K代表千字节,m或者M代表兆字节,g或者G代表千兆字节。您不能使用memory.limit_in_bytes限制rootcgroup;您只能对层级中较低的群组应用这些值。在memory.limit_in_bytes中写入-1可以移除全部已有限制。

4.2.  memory.memsw.limit_in_bytes

设定内存与swap用量之和的最大值。如果没有指定单位,则该值将被解读为字节。但是可以使用后缀代表更大的单位——k或者K代表千字节,m或者M代表兆字节,g或者G代表千兆字节。您不能使用memory.memsw.limit_in_bytes来限制rootcgroup;您只能对层级中较低的群组应用这些值。在memory.memsw.limit_in_bytes中写入-1可以删除已有限制。

4.3.  memory.force_empty

当设定为0时,该cgroup中任务所用的所有页面内存都将被清空。这个接口只可在cgroup没有任务时使用。如果无法清空内存,请在可能的情况下将其移动到父cgroup中。移除cgroup前请使用memory.force_empty参数以免将废弃的页面缓存移动到它的父cgroup中。

4.4.  memory.swappiness

将kernel倾向设定为换出该cgroup中任务所使用的进程内存,而不是从页高速缓冲中再生页面。这与/proc/sys/vm/swappiness为整体系统设定的倾向、计算方法相同。默认值为60。低于60会降低kernel换出进程内存的倾向;高于0会增加kernel换出进程内存的倾向。高于100时,kernel将开始换出作为该cgroup中进程地址空间一部分的页面。请注意:值0不会阻止进程内存被换出;系统内存不足时,换出仍可能发生,因为全局虚拟内存管理逻辑不读取该cgroup值。要完全锁定页面,请使用mlock()而不是cgroup。您不能更改以下群组的swappiness:

rootcgroup,它使用/proc/sys/vm/swappiness设定的swappiness;

有子群组的cgroup。

4.5.  memory.oom_control

包含标签(0或者1),它可以为cgroup启用或者禁用“内存不足”(OutofMemory,OOM)终止程序。如果启用(0),尝试消耗超过其允许内存的任务会被OOM终止程序立即终止。默认情况下,所有使用memory子系统的cgroup都会启用OOM终止程序。要禁用它,请在memory.oom_control文件中写入1:

echo 1 > /cgroup/memory/lab1/memory.oom_control

禁用OOM杀手程序后,尝试使用超过其允许内存的任务会被暂停,直到有额外内存可用。memory.oom_control文件也在under_oom条目下报告当前cgroup的OOM状态。如果该cgroup缺少内存,则会暂停它里面的任务。under_oom条目报告值为1。memory.oom_control文件可以使用API通知来报告OOM情况的出现。

 

5.     net_cls

net_cls子系统使用等级识别符(classid)标记网络数据包,这让Linux流量管控器(tc)可以识别从特定cgroup中生成的数据包。可配置流量管控器,让其为不同cgroup中的数据包设定不同的优先级。


5.1.  net_cls.classid

net_cls.classid包含表示流量控制handle的单一数值。从net_cls.classid文件中读取的classid值是十进制格式,但写入该文件的值则为十六进制格式。例如:0x100001表示控制点通常写为iproute2所用的10:1格式。在net_cls.classid文件中,将以数字1048577表示。这些控制点的格式为:0xAAAABBBB,其中AAAA是十六进制主设备号,BBBB是十六进制副设备号。您可以忽略前面的零;0x10001与0x00010001一样,代表1:1。以下是在net_cls.classid文件中设定10:1控制点的示例:

echo 0x100001 > /cgroup/net_cls/red/net_cls.classid

 

6.     net_prio

网络优先权(net_prio)子系统可以为各个cgroup中的应用程序动态配置每个网络接口的流量优先级。网络优先级是一个分配给网络流量的数值,可在系统内部和网络设备间使用。网络优先级用来区分发送、排队以net_prio.prioidx只读文件。它包含一个特有整数值,kernel使用该整数值作为这个cgroup的内部代表。net_prio.ifpriomap包含优先级图谱,这些优先级被分配给源于此群组进程的流量以及通过不同接口离开系统的流量。

echo "eth0 5"> /cgroup/net_prio/iscsi/net_prio.ifpriomap

上述指令将强制设定任何源于iscsinet_priocgroup进程的流量和eth0网络接口传出的流量的优先级为5。父cgroup也有可写入的net_prio.ifpriomap文件,可以设定系统默认优先级。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cgroups使用 的相关文章

  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • 通过 Visual Studio 2017 使用远程调试时 Linux 控制台输出在哪里?

    我的Visual Studio 2017 VS2017 成功连接Linux系统 代码如下 include
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • 如何在linux中以编程方式获取dir的大小?

    我想通过 C 程序获取 linux 中特定目录的确切大小 我尝试使用 statfs path struct statfs 但它没有给出确切的大小 我也尝试过 stat 但它返回任何目录的大小为 4096 请建议我如何获取 dir 的确切大小
  • C 语言的符号表

    我目前正在开发一种执行模式匹配的静态分析工具 我在用Flex https github com westes flex生成词法分析器 我编写了代码来管理符号表 我不太有经验C 所以我决定将符号表实现为线性链表 include
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 如果 free() 知道我的数组的长度,为什么我不能在自己的代码中请求它?

    我知道将动态分配的数组的长度传递给操作它们的函数是一个常见的约定 void initializeAndFree int anArray size t length int main size t arrayLength 0 scanf d
  • 从 Xlib 转换为 xcb

    我目前正在将我的一个应用程序从 Xlib 移植到 libxcb 但在查找有关我有时使用的 XInput2 扩展的信息时遇到了一些麻烦 libxcb 中有 XInput2 实现吗 如果是的话 在哪里可以找到文档 目前我在使用此功能时遇到问题
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • 如何在 Linux 中使用 C 语言使用共享内存

    我的一个项目有点问题 我一直在试图找到一个有据可查的使用共享内存的例子fork 但没有成功 基本上情况是 当用户启动程序时 我需要在共享内存中存储两个值 当前路径这是一个char and a 文件名这也是char 根据命令参数 启动一个新进
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • 使用 python 脚本更改 shell 中的工作目录

    我想实现一个用户态命令 它将采用其参数之一 路径 并将目录更改为该目录 程序完成后 我希望 shell 位于该目录中 所以我想实施cd命令 但需要外部程序 可以在 python 脚本中完成还是我必须编写 bash 包装器 Example t
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • PhantomJS 网页内存消耗?

    是否有一种编程方式 因为我想在运行时自动执行 方式来查看网页在通过 PhantomJs 运行时使用了多少内存 我也在使用 casperjs 如果这有帮助的话 我已经搜索了很多但没有找到任何方法 PhantomJs 使用 QtWebKit 因
  • 如何使用Android获取Linux内核的版本?

    如何在 Android 应用程序中获取 Linux 内核的版本 不是 100 确定 但我认为调用 uname r 需要 root 访问权限 无论如何 有一种不太肮脏的方法可以做到这一点 那就是 System getProperty os v
  • MATLAB 列含义的内存分析

    我正在使用 MATLAB 配置文件来使用命令观察内存 profile memory on profile clear my code profile report and i got this table 1 我想问一下什么意思 已分配内存
  • 结构中的内存布局差异

    我在 C 中有以下结构 struct A int a double b float c 该结构与添加了函数的结构之间的内存布局是否存在差异 struct B int a double b float c void foo B foo do
  • 如何获取可用系统内存的大小?

    C NET 中是否可以获取系统可用内存的大小 如果是的话怎么办 Use Microsoft VisualBasic Devices ComputerInfo TotalPhysicalMemory http msdn microsoft c

随机推荐

  • 2013年4月10日星期三 (DEMO7——6使用blitter)

    本来打算晚上进行封装 不过由于上午进行HDR 只剩下RENDERBLOOM 了 有些疲倦 不妨先进行封装 闲话少说 现在是14 18 开始进行了 这1节还是开头强调了硬件局限性 目前当然没有这个问题了 只考虑封装方法吧 大概浏览了一下这一节
  • 0.0.0.0 网关的含义

    简介 使用 route 命令查看linux的路由时候常遇到 gateway为0 0 0 0 的情况 注意不是目标网段 让人很困惑 仔细看看这些网卡往往时候一些虚拟出来的网卡 比如docker0 0 0 0 0 或者 表示不需要路由 目标地址
  • Addressables学习笔记3: 实际操作实现资源热更新

    本篇基本上是官方演示的东西 介绍一下如何快速使用Addressables实现资源热更 为了能够热更资源 你需要有一个资源服务器使你能下载资源 一 资源准备 首先打开Unity编辑器菜单 gt Window gt Asset Manageme
  • 通用工具类

    package com struts2 jquery utils import java io File import java io IOException import java io OutputStream import java
  • 驱动级鼠标模拟实现_S71500PLC 连接 V90 伺服系统实现位置闭环控制

    S7 1500 运动控制功能支持旋转轴 定位轴 同步轴和外部编码器等工艺对象 并拥有轴控制面板以及全面的在线和诊断功能有助于轻松完成驱动装置的调试和优化工作 S7 1500 支持多种连接方式 可以使用 PROFIBUS DP 和 PROFI
  • Android缓存机制&一个缓存框架推荐

    1 先推荐一个轻量级缓存框架 ACache ASimpleCache ACache介绍 ACache类似于SharedPreferences 但是比 SharedPreferences功能更加强大 SharedPreferences只能保存
  • yagmail群发邮件

    直接给代码 导入yagmail第三方库 import yagmail yagmail SMTP user 邮箱名 host SMTP服务器域名 yag yagmail SMTP user 284036658 qq com host smtp
  • 零信任提升组织的数字安全性

    组织越来越多地实施零信任策略以增强其数字安全状况 根据 信息安全杂志 的统计 有15 的组织表示他们在2019年底之前实施了零信任策略 另有59 的参与者表示 他们打算在未来12个月内实施 要了解为什么如此众多的组织涌向零信任 首先要深入了
  • 性能测试工具---JMeter的安装与使用详解(第一篇)

    目录 一 主流性能测试工具 1 1 LoaderRunner 1 2 JMeter 二 JMeter环境搭建 2 1下载安装JDK 2 2 下载安装JMeter 2 3 JMeter文件目录介绍 2 3 1 bin目录 2 3 2 docs
  • python 写文件 换行_python中写入txt文件需要换行,以及\r 和\n

    在Python中 用open 函数打开一个txt文件 写入一行数据之后需要一个换行 如果直接用 f write n 只会在后面打印一个字符串 n 而不是换行 需要用 f write r n 注意点 1 python文件写入的时候 当写入一段
  • 【SpringBoot学习】05-自定义LocaleResolver国际化区域语言

    首先配置好i18n文件 以及所对应的语言 在properties中配置 因为默认为 message spring messages basename i18n xxxx 页面内容替换 配置点击 配置一个 LocaleResolver 自定义
  • 十种常用机器学习算法入门

    弱人工智能近几年取得了重大突破 悄然间 已经成为每个人生活中必不可少的一部分 以我们的智能手机为例 看看到底温藏着多少人工智能的神奇魔术 下图是一部典型的智能手机上安装的一些常见应用程序 可能很多人都猜不到 人工智能技术已经是手机上很多应用
  • 【Linux】动静态库

    文章目录 1 动静态库的原理 2 动态库和静态库基础 3 动静态库的实现 3 1设计一个静态库 3 2设计一个动态库 4 动静态库的使用 4 1静态库的使用 4 2动态库的使用 4 3动态库的多进程共享原理 1 动静态库的原理 源文件和头文
  • KAFKA基础操作命令

    1 查看所有的话题 topic kafka topics sh zookeeper 10 10 6 98 2181 kafka list 2 删除 topic kafka topics sh zookeeper 10 10 6 99 218
  • 华为虚拟桌面发放流程【FusionAccess】——详解

    华为FusionAccess作为一个桌面云接入管理系统 以服务器虚拟化为基础 共享CPU 内存 网络连接 存储器等底层物理硬件资源 使用户桌面以虚拟机的形式独立运行 虚拟机彼此隔离 提供给用户使用 那么虚拟机是如何一步步为用户所用呢 众所周
  • Leetcode 347. 前 K 个高频元素(堆实现)

    前 K 个高频元素 堆实现 给定一个非空的整数数组 返回其中出现频率前 k 高的元素 示例 1 输入 nums 1 1 1 2 2 3 k 2 输出 1 2 示例 2 输入 nums 1 k 1 输出 1 class Solution pu
  • 初学者使用R语言读取excel/csv/txt的注意事项

    本文首发于 医学和生信笔记 完美观看体验请至公众号查看本文 文章目录 把数据读入R语言 Excel csv txt 其他 写出文件 从R语言另存为其他格式 本文面向R语言初学者 尤其是生物医药领域的初学者 大佬勿喷 在之前的推文中 我们用两
  • java设置断点,在Java中设置断点

    How does setting breakpoints in Java work Is it just based on the source file name and line number Does the class or met
  • 编写自动化软件+python

    前言 本文分为代码篇和实操篇 代码篇以 不高兴就喝水 的代码为原版和其他改版做对比 帮助学习了解 实操部分也分为原版的实操和改版的实操 学前准备 pyautogui库用法 https blog csdn net qingfengxd1 ar
  • Cgroups使用

    Cgroups使用 一 Cgroups介绍 linux内核提供了cgroups控制组 controlgroups 的功能 最初由google的工程师提出 后来被整合进Linux内核 Cgroups也是LXC LinuxContainer容器