包含linuxcgroup的词条

本篇文章给大家谈谈linuxcgroup,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Docker之Linux Cgroup实践

Docker通过cgroup技术实现对容器资源的限制,在我们自己的应用中通过对某些不重要的应用做cpu、内存资源上限的限制来确保任何时候重要的应用有足够的资源使用。下面是对docker容器做cpu与内存资源限制的实践记录,环境为centos7.2+docker1.12.6。

Linux Cgroup最主要的作用是为一个进程组设置资源使用的上限,这些资源包括CPU、内存、磁盘、网络等。在linux中,Cgroup给用户提供的操作接口是文件系统,其以文件和目录的方式组织在/sys/fs/cgroup路径下。更多的cgroup介绍可以阅读 、 、

等文章。

通过一个简单的例子,对一个进程的cpu使用率做限制,操作如下:

这里同样以cpu设置为例,探索docker容器是如何通过cgroup做限制的

由此可知在创建一个容器时:

这里仅对最为常用的两个参数--cpu-period、--cpu-quota做哪大设置,使用stress服务做验证

这里针对--memory,--memory-swap,--memory-swappiness三个参数做实践

实践一(不设置--memory与--memory-swap)

经过一段时间,容器并没有发生oom,stats命令中的MEM %参数的值一直是100.00%

可知容器只有在设置了memory限制之后,--oom-kill-disable才会起作用

实践二(设置--memory,不设置--memory-swap):

根据docker文档说明,这时容器可以使用到的最大的内存为2倍的memory的内存(memory=memory-swap, 2倍=memory+memory-swap)

此时,经过一段时间的检测,并没有发生oom,docker stats stress:

实践三(设置--memory与--memory-swap)

由docker文档知,memory-swap等于memory+swap的和,因此要求memory-swap = memory(Minimum memoryswap limit should be larger than memory limit)

MEM %的清配值也一直是在100.00%以内浮动,另外也可知LIMIT仅是memory的值

当前实践的机器的swap为5G,因此这里设置用完5Gswap

设置使用系统的swap超出5G

通过设置memory-swappiness参数使得容器禁用系统交换空间

上述是对容器较为常用的cpu与内存的限制做了一些实践记录,了解了docker是如何通过linux cgroup对容器的资源做的限制。当然除了cpu、内存之外的其他资源的李正竖限制我们同样可以通过实践的方式一点一点去探索,求证。

小白解说之资源控制技术cgroup

大家好,我是小白。今天给大家讲解一下Linux下的资源控制cgroup。

提到cgroup,可能有的同学一时不太清楚做什么用的,但大家应该都用过公有云虚拟机或者容器,套餐1C2G,如何限制资源使用实现的呢,答案就是cgroup啦~

一、何为cgroup

Linux cgroups 的全称是 Linux Control Groups,它是 Linux 内核的特性,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、IO 等)。

cgroups 从设计之初使命就很明确,为进程提供资源控制,它主要的功能包括:

目前 cgroups 已经成为很多技术的基础,比如 Openstack、LXC、Docker、Kubernetes、systemd等。

二、Cgroup概念

cgroup 全程control group,除了它本身的概念,还有Task(进程)、 Hierarchy(层级结构) 和 subsystem(子系统) 的概念

1. cgroups子系统

cgroups为每种可以控制的资源定义了一个子系统。典型的子系统介绍如下:

    cpu 子系统,主要限制进程的 cpu 使用率。

    cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。

    cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。

    memory 子系统,可以限制进程的 memory 使用量。

    blkio 子系统,可以限制进程的块设备 io。

    devices 子系统,可以控制进程能够访问某些设备。

    net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。

    freezer 子系统,可以挂起或者恢复 cgroups 中的进程。

    ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace。

这里面每一个子系统都需要与内核的其他模块配合来完成资源的控制,比如对 cpu 资源的限制是通过进程调度模块根据 cpu 子系统的配置来完成的;对内存资源的限制则是内存模块根据 memory 子系统的配置来完成的,而对网络数据包的控制则需要 Traffic Control 子系统来配合完成。本文不会讨论内核是如何使用每一个子系统来实现资源的限制,而是重点放在内核是如何把 cgroups 对资源进行限制的配置有效的组织起来的,和内核如何把cgroups 配置和进程进行关联的,以及内核是如何通过 cgroups 文件系统把cgroups的功能暴露给用户态的。

2. cgroups 层级结构(Hierarchy)

内核使用 cgroup 结构体来表示一个 control group 对某一个或者某几个 cgroups 子系统的资源限制。cgroup 结构体可以组织成一颗树的形式,每一棵cgroup 结构体组成的树称之为一个 cgroups 层级结构。cgroups层级结构可以 attach 一个或者几个 cgroups 子系统,当前层级结构可以对其 attach 的 cgroups 子系统进行资源的限制。每一个 cgroups 子系统只能被 attach 到一个 cpu 层级结构中。

3. cgroup概念间的关系

    系统创建hierarchy 之后,所有的进程都会加入这个hierarchy的cgroup的根节点。在这个cgroup根节点是hierarchy默认创建的。

    一个subsystem只能附加到一个hierarchy上面。

    一个进程可以作为多个cgroup的成员,但是cgroup必须在不同的hierarchy中。

    一个进程fork的子进程和父进程在同一个cgroup中也可以根据需要移到其他cgroup中。

三、容器如何使用cgroup的

1. Docker容器和cgroup

Docker 容器的内存限制放在了 /sys/fs/cgroup/memory/docker 目录下,比如:

2. Kubernetes Pod和cgroup

CRI-O 是被设计面向 Kubernetes 的,所以在一些目录名中就有浓浓的 k8s 风格。

CRI-O 容器的内存限制放在了 /sys/fs/cgroup/memory/kubepods.slice 目录下,这一层目录下,又根据 QoS 创建了三个子目录 kubepods-besteffort.slice、kubepods-burstable.slice、kubepods-guaranteed.sice 分别表示三种不同 QoS Class的内存限制。

Kubernete对资源的限制,靠的是cri-o,cri-o对资源的限制,靠的是Linux Cgroup 。

Linux Cgroup 限制资源,是限制进程,只需要在Cgroup配置目录的tasks文件中,添加进程ID,限制立即生效。

Linux Cgroup 不仅仅可以限制CPU,内存,还可以限制磁盘IO等。

[img]

使用cgroups控制进程cpu配额

Linux 下的 cgroups ,全称叫 Control Groups ,最初基御答由Google工程师提出并实现,linux从2.6开始将这个特性纳入内核。cgroups主要对进程按组( Group )进行资源配额的控制,包括CPU、内存、IO等,相比古老的 ulimit ,cgroups更为平滑和易用,成为容器技术(比如 docker )的基础。

事实上,使用cgroups是非常简单的,几行shell命令就可以。下面以CPU子系统为例,来尝试控制一个进程的CPU利用率。

首先挂载cgroup文件系统:

上面的命令挂载了一个 cpu 子系统,目录为 /cgroup/mave ,名字叫 mave 。cpu子系统用于控制进程的cpu总体占用率,是最常用的子系统。内核会根据配额的设置在调度进程上做出相应的调整。

观察 /cgroup/mave 目录:

这些文件是搏慧自动创建出来的,且都跟cpu这个子系统有关。不同的子系统会创建出不同的文件。我们重点关注:

这个文件里面可以写入一个或多个 taskid (pid), /cgroup/mave 这个组中的配额设置将影响这些task。

表示将cpu时间片分成 100000 份。

表示当前这个组中的task( /cgroup/mave/tasks 中的 taskid )将分配多少比例的cpu时间片。由于是双核cpu,这里就表示最多可以用到 200% 的CPU。

尽管根目录( /cgroup/mave )也可以设置配额,但是习惯上,我们在这个目录下创建一个目录,作为一个 控制组 ,这个控制组可以单独设置配额,而不影响其他 控制组 :

可以看到,创建的 steam 目录下也会自动创建出一堆cpu子系统相关的文件,几乎和根目录( /cgroup/mave )完全一样。现在我们再来理解一下什么是 hierarchy :

hierarchy 就是一个带有继承关系的目录层次,每一层形成一个 控制组 ,单独控制其中的task。

采集器进程在不受限制的情况下全速采集,CPU占用率达到 50% :

将拆困5000写入 cpu.cfs_quota_us ,表示希望CPU占用率控制在(5000/100000=5%)以内:

然后将进程号 30126 写入 tasks :

观察cpu占用率,瞬间降到 4% 。

可以看到,使用cgroups十分简单,效果很好。然而,进程id并不是每次都保持不变。我们需要一些自动化的机制。上文提到过 libcgroup ,这个库提供了挂载、配置和运行的程序和库。

linux cgroup机制

Cgroup是control group的缩写,是Linux内核提供的一种用于限制,记录,隔离进程组所使用物理资源(cpu,memory,io等)的机制。

cgroup提供了一系列的功能用于对Linux系统资源进行管理和限制,主要功能包括如下

1:限制进程组可以使用的资源数量,例如进程组对内存的使用上限。

2:进程组的执行优先级限制。

3:记录进程组所使用的资源数量,例如进程组所使用的cpu时间。

4:进程组隔离的能力。

在cgroup中有一些基本定义或概念

1:Task,理解为系统中需要被控制的进程。

2:Subsystem,可以被控制的资源系统,例如cpu,IO,内存等。

3:Cgroup,按搭弯照某种控制标准而划分而成的控制族。

4:hierarchy,Cgroup可以组织成树状结构,子节点继承父节点的控制标准。

在系统中创建新的hierarchy时,系统中的所有任务都属于该层级的默认cgroup(root group)的成员。

一个子系统只能附加到一个层级上。

一个层级可以附加多个子系统。

一个任务可以是cgroup的成员,但这些cgroup必须在不同的hierarchy中。

任务创建的子任务(进程),子进程自动成为父进程cgroup的成员。

关系图如下:

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

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

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

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

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

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

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

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

ns -- 名称空间子系统。

Linux系统中最多可以建12棵cgroup层级树(每棵树关联一个子系统),也可以最少建一颗cgroup层级树(关联所有12个控制子系统)

可以通过mount命令完成

1.挂载一颗和所有subsystem关联的cgroup树到/sys/fs/cgroup

mount -t cgroup

xxx /sys/fs/cgroup

2.挂载一颗和cpuset

subsystem关联的cgroup树到/sys/fs/cgroup/cpuset

mkdir

/sys/fs/cgroup/cpuset

mount -t cgroup -o

cpuset xxx /sys/fs/cgroup/cpuset

3.挂载一颗与cpu和cpuacct

subsystem关联的cgroup树到/sys/fs/cgroup/cpu,cpuacct

mkdir

/sys/fs/cgroup/cpu,cpuacct

mount -t cgroup -o

cpu,cpuacct xxx /sys/fs/cgroup/cpu,cpuacct

4.挂载一棵cgroup树,但不关联任何subsystem

mkdir

/sys/fs/cgroup/systemd

mount -t cgroup -o

none,name=systemd xxx /sys/fs/cgroup/system

通过mount可以查看到cgroup的默认挂载点

每个目录下,其中的文件描述了如何对资源进行限制。

在每个进程的/proc/$pid/cgroup文件中,描述了进程于cgroup的关系:

第一列描述cgroup的树ID(该ID可以在/proc/cgroups中一一对应);第二列描述绑定的所有子系统;第三列描述进程在cgroup中的路径。

当我们对某个任务需要进行限制时,不推荐直接在cgroup的各个子系统的root下修改配置,而是在对应的层级下建立单独的控制节点。

例如如下,在cpu目录下建立我们自己的子目录:

进入我们创建的子目录后,会看到系统已经创建好了资源控制文件,此时只需要修改这些配置文件满足要求既可以。

要控制我们的进程,只需要将进程ID添加到tasks配置文件中即可以。

关于linuxcgroup和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表