Linux Cgroups进程资源限制管理 之 资源子系统限制/控制、Docker资源隔离与限制原理解读

这篇具有很好参考价值的文章主要介绍了Linux Cgroups进程资源限制管理 之 资源子系统限制/控制、Docker资源隔离与限制原理解读。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

特性起源

Linux cgroups(控制组)最初由Google工程师Paul Menage在2006年提出,并在Linux内核的2.6.24版本中首次引入。自那时以来,cgroups一直是Linux内核的一部分,并在容器化技术等领域中发挥着至关重要的作用。随着时间的推移,cgroups功能不断得到改进和扩展,以满足对资源管理和隔离性能的不断增长的需求。

特性功能

Linux cgroups(控制组)是一种内核功能,用于限制、控制和监视一个或多个进程的资源,如CPU、内存、磁盘I/O等。Cgroups允许系统管理员将一组进程放入一个或多个cgroups中,并为每个cgroup分配资源限制。这样可以更好地管理系统资源,确保不同进程之间的资源隔离和分配。

Cgroups可以在Linux系统中用于多种用途,例如容器技术(比如Docker、Kubernetes)中就广泛应用了cgroups来对容器的资源进行限制和管理。Cgroups也可以用于其他需要对系统资源进行精细控制的场景。


资源子系统

Cgroups通过sys文件系统提供接口,即它是以文件和目录的方式组织在操作系统的/sys/fs/cgroup路径下。在Ubuntu 18.04.6 LTS机器里,使用mount -t cgroup展示:

$ mount -t cgroup
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
...

输出结果就是文件系统目录,如果没有看到就需要你自己去挂载Cgroups,可以参考sudo apt install cgroupfs-mount或者找寻其他方式。

在 /sys/fs/cgroup 下面有很多如 cpu、 memory、pids 这样的子目录,也叫子系统。
Cgroup通过配置文件限制进程可占用资源,通过查看 /sys/fs/cgroup目录,可以查看所支持的配置。

子系统资源限制/配置

在子系统对应的资源配置路径下,你可以看到该类资源具体可以被限制的方法。比如,对 CPU 子系统来说,我们可以看到如下几个配置文件,这个指令是:

$ ls /sys/fs/cgroup/cpu
cgroup.clone_children  cpuacct.stat   cpuacct.usage_all     cpuacct.usage_percpu_sys   cpuacct.usage_sys   cpu.cfs_period_us  cpu.shares  notify_on_release
cgroup.procs           cpuacct.usage  cpuacct.usage_percpu  cpuacct.usage_percpu_user  cpuacct.usage_user  cpu.cfs_quota_us   cpu.stat    tasks

如果之前有了解CPU资源限制,可以注意到在它的输出里有 cfs_period 和 cfs_quota 这两个熟悉的关键词。这两个参数需要组合使用,可以用来限制进程在长度为 cfs_period 的一段时间内,只能被分配到总量为 cfs_quota 的 CPU 时间。

怎么使用配置文件?

在对应的子系统下面创建一个目录,进入cd /sys/fs/cgroup/cpu 目录下:

$ mkdir ./container
$ ls container/
cgroup.clone_children  cpuacct.stat   cpuacct.usage_all     cpuacct.usage_percpu_sys   cpuacct.usage_sys   cpu.cfs_period_us  cpu.shares  notify_on_release
cgroup.procs           cpuacct.usage  cpuacct.usage_percpu  cpuacct.usage_percpu_user  cpuacct.usage_user  cpu.cfs_quota_us   cpu.stat    tasks

这个目录就称为一个“控制组”。你会发现,操作系统会在你新创建的 container 目录下,自动生成该子系统对应的资源限制文件。

现在,在后台执行如下脚本full_cpu.sh或者直接执行,这段代码会启动一个进程,并跑满剩余的CPU到100%

$ cat full_cpu.sh | bash
#! /bin/bash
while : ;do : ; done &

$ top -p 29194
%Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                          
29194 root      20   0   12892    232      0 R 93.4  0.0   0:16.26 bash full_cpu.sh

输出里可以看到目前%Cpu(s):100.0 us,已经被跑满了

此时,我们可以通过查看 container 目录下的文件,看到 container 控制组里的 CPU quota 还没有任何限制(即:-1),CPU period 则是默认的 100 ms(100000 us)

$ cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
 -1
$ cat /sys/fs/cgroup/cpu/container/cpu.cfs_period_us
 100000

接下来,我们可以通过修改这些文件的内容来设置限制。比如,向 container 组里的 cfs_quota 文件写入 20 ms(20000 us):

$ echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us

结合前面的介绍,这意味着在每 100 ms 的时间里,被该控制组限制的进程只能使用 20 ms 的 CPU 时间,也就是说这个进程只能使用到 20% 的 CPU 带宽。
接下来,我们把被限制的进程的 PID 写入 container 组里的 tasks 文件,上面的设置就会对该进程生效了:

$ echo 29194 > /sys/fs/cgroup/cpu/container/tasks 
$ top -p 29194
%Cpu(s): 25.9 us,  5.8 sy,  0.0 ni, 67.6 id,  0.3 wa,  0.0 hi,  0.3 si,  0.0 st

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                          
29194 root      20   0   12892    232      0 R 19.9  0.0  13:30.51 bash full_cpu.sh

可以看到,该进程的 CPU 使用率立刻降/限制到了 20% 左右。
(提示:测试完毕,记得kill “29194”,tasks文件中进程也会随即清空)

除 CPU 子系统外,Cgroups 的每一个子系统都有其独有的资源限制能力,比如:
blkio,为​​​块​​​设​​​备​​​设​​​定​​​I/O 限​​​制,一般用于磁盘等设备;
cpuset,为进程分配单独的 CPU 核和对应的内存节点;
memory,为进程设定内存使用的限制;
cpu:用于限制进程使用CPU的资源,如可用的CPU时间片和CPU份额;
cpuacct:用于追踪进程使用的CPU资源,可以记录CPU的使用情况;
devices:可以限制进程对设备的访问;
freezer:可以暂停和恢复cgroup中的进程;
net_cls:可以标记网络数据包,允许数据包根据cgroup进行分类处理。
这些Cgroups子系统都提供不同的资源控制和限制机制,使得管理员可以更加灵活地管理系统中进程的资源使用。

Docker控制组资源限制

Linux Cgroups 的设计还是比较易用的。简单粗暴地理解它就是一个子系统目录加上一组资源限制文件的组合。而对于 Docker 等 Linux 容器项目来说,它们只需要在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录),然后在启动容器进程之后,把这个进程的 PID 填写到对应控制组的 tasks 文件中就可以了。
(现在,操作系统上有跑docker项目的可以看下对应子系统下是否有一个docker的控制组)

而至于在这些控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指定了,比如这样一条命令:

$ docker run -it --cpu-period=100000 --cpu-quota=20000 centos:7 /bin/bash

在启动这个容器后,我们可以通过docker inspect <容器ID>查看完整ID,在 Cgroups 文件系统 的 CPU 子系统中,“docker”这个控制组里的资源限制文件的内容来确认:

$ cat /sys/fs/cgroup/cpu/docker/da3b6f68*/cpu.cfs_period_us
 100000
$ cat /sys/fs/cgroup/cpu/docker/da3b6f68*/cpu.cfs_quota_us
 20000

这就意味着这个 Docker 容器,只能使用到 20% 的 CPU 带宽。
(提示:停止run容器即关闭,rm容器则销毁,同时清理Cgroup子系统的控制组)文章来源地址https://www.toymoban.com/news/detail-833150.html

到了这里,关于Linux Cgroups进程资源限制管理 之 资源子系统限制/控制、Docker资源隔离与限制原理解读的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 4、电源管理入门之子系统reset

    1. 简介 2. consumer-驱动软件 3. provider-reset驱动 3.1 整体介绍 3.2 reset复位API说明 之前的文章电源管理入门-1关机重启详解介绍了整机SoC的重启也可以说是reset,那么子系统的reset,例如某个驱动(网卡、USB等)或者某个子系统(NPU、ISP等运行在独立的M核或者R核上的AI系统),这些

    2024年02月22日
    浏览(49)
  • Linux reset子系统

    文章代码分析基于linux-5.19.13,架构基于aarch64(ARM64)。 复杂IC内部有很多具有独立功能的硬件模块,例如CPU cores、GPU cores、USB控制器、MMC控制器、等等,出于功耗、稳定性等方面的考虑,有些IC在内部为这些硬件模块设计了复位信号(reset signals),软件可通过寄存器(一般

    2024年02月16日
    浏览(42)
  • Linux Input子系统

    按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做  input 子系统 的 框架 来处理输入事件。本质属于字符设备。 1. input子系统结构如下:  input 子系统分为 input 驱动层、input 核心层、input 事件处理层,最终给用户空间提供可访问的设备节点

    2024年02月10日
    浏览(45)
  • Linux内核(十四)Input 子系统详解 I —— 子系统介绍以及相关结构体解析

    input子系统就是管理输入的子系统 ,和Linux其他子系统一样,都是Linux内核针对某一类设备而创建的框架。 鼠标、键盘、触摸屏等都属于输入设备,Linux将这些设备的共同特性抽象出来,这就形成了input子系统的框架。 Linux内核只需要通过input框架向用户层上报输入事件 (如:

    2024年02月05日
    浏览(47)
  • Windows系统开启Linux子系统(Ubuntu)

    Linux是一种开源的操作系统,它拥有强大的功能和稳定的性能,广受开发者和用户的喜爱。但是,如果我们的电脑是Windows系统,要使用Linux系统,我们通常需要安装虚拟机,这样会占用很多的资源和空间,而且也不够方便。 其实,对于大多数用户来说,只需要开启Windows系统自

    2024年04月15日
    浏览(57)
  • 【Linux】Pinctrl子系统简介

    我们工作开发中非常常用的就是GPIO,在Linux开发中,是有必要去熟悉并理解的。在Linux内核中也有提供相应的子系统pinctrl子系统, 本文从大的面上去了解它 。 参考学习:Linux笔记老师课程(Pinctrl子系统) https://live.csdn.net/v/219059?spm=1001.2014.3001.5501 https://xuesong.blog.csdn.net/arti

    2024年02月07日
    浏览(49)
  • Linux IIO 子系统简介

    IIO 子系统系统框架 而在IIO子系统内部,则主要包括如下四部分的内容: iio buffer用于处理需要进行连续采集的数据,当一个IIO device的各通道数据支持连续采集时,则调用iio buffer模块提供的接口,创建iio buffer用于存储连续存储的数据,同时该模块提供字符设备文件的注册,因

    2024年02月16日
    浏览(36)
  • [Linux] Windows安装Linux子系统教程

    目录 前言 一、准备工作 1.1 检查过程 二、安装过程 2.1 开启支持的服务 2.1.1开启开发者模式  2.1.2 启用windows linux子系统  2.2 安装linux子系统 2.2.1 安装ubuntu 2.2.2 设置名字 我们想在windows系统中想用linux系统,用的最多的就是虚拟机了吧,今天介绍一种不用装虚拟机在windows也能

    2024年02月09日
    浏览(49)
  • Linux驱动开发:SPI子系统

    MISO:主设备数据输入,从设备数据输出。 MOSI:主设备数据输出,从设备数据输入。 SCLK:时钟信号,由主设备产生。 CS:    从设备片选信号,由主设备控制。 CPOL(时钟极性) :   0:时钟起始位低电平      1:时钟起始为高电平   CPHA(时钟相位) :0:第一个时钟周期采样   1

    2024年02月06日
    浏览(54)
  • Linux驱动开发:gpio子系统

    目录 1、GPIO配置流程 2、GPIO子系统API 2.1 of_find_node_by_path 2.2 of_get_named_gpio 2.3 gpio_request 与 gpiod_get 与 gpiod_get_index 2.4 gpio_direction_input 与 gpiod_direction_input 2.5 gpio_direction_output 与 gpiod_direction_output 2.6 gpio_get_value 与 gpiod_get_value 2.7 gpio_set_value 与 gpiod_set_value 2.8  gpiod_get_from

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包