docker-简单说说cgroup

前面我们简单说了下namespace, 现在我们来接着简单说说cgroup。通过docker-简单说说namespace文章我们知道: namespace 是为了隔离进程组之间的资源,那cgroup就是为了对进程组的监控和限制资源。Cgroup 可以限制进程组使用的资源数量和分配(包括CPU、内存、网络带宽、磁盘I/O等),并将它们隔离到一个或多个分层的分组中,以实现对进程、任务或用户组的资源限制。这使得 Cgroup 成为用于容器隔离的关键技术,并可以帮助保护系统免受不安全或恶意代码的破坏

什么是cgroup?

cgroup(control groups)是Linux下的一种将进程按组进行管理的机制,在用户层看来,cgroup技术就是把系统中的所有进程组织成一颗一颗独立的树,每棵树都包含系统的所有进程,树的每个节点是一个进程组,而每颗树又和一个或者多个subsystem关联,树的作用是将进程分组,而subsystem的作用就是对这些组进行操作。

主要功能

它主要提供了如下功能:

  • Resource limitation: 限制资源使用,比如内存使用上限以及文件系统的缓存限制。
  • Prioritization: 优先级控制,比如:CPU利用和磁盘IO吞吐。
  • Accounting: 一些审计或一些统计,主要目的是为了计费。
  • Control: 挂起进程,恢复执行进程。

核心概念

1- subsystem

cgroup中的subsystem就是一个资源调度控制器(Resource Controller)。subsystem被关联到一颗cgroup 树上,就会在树上节点做具体操作(用来调度或者限制进程的资源)。比如CPU子系统可以控制CPU时间分配,内存子系统可以限制cgroup内存使用量

2- hierarchy

hierarchy由一系列cgroup以一个树状结构排列而成,树的每个节点就是一个进程组,每个hierarchy通过绑定对应的subsystem进行资源调度。hierarchy中的cgroup节点可以包含零或多个子节点,子节点继承父节点的属性。

3- task

在Cgroup中,task就是系统的一个进程

操作

本文使用环境centos3.10.0 , cgroup v1

如何查看当前系统支持哪些subsystem

[root@linjian ~]# cat /proc/cgroups
#subsys_name    hierarchy       num_cgroups     enabled
cpuset  6       9       1
cpu     5       81      1
cpuacct 5       81      1
memory  8       79      1
devices 11      78      1
freezer 10      9       1
net_cls 3       9       1
blkio   2       78      1
perf_event      7       9       1
hugetlb 4       9       1
pids    9       78      1
net_prio        3       9       1

subsys_name: subsystem的名字

hierarchy: subsystem关联的cgroup树的id,如果多个subsystem关联到同一颗cgroup树,那么他们的hierarchy数据一样。

当以下情况,hierarchy 字段将为0:

  • 当前subsystem没有和任何cgroup树绑定
  • 当前subsystem已经和cgroup v2的树绑定
  • 当前subsystem没有被内核开启

num_cgroups:subsystem关联cgroup树中进程组的个数(树上节点的个数)。

enabled:1:开启,0:关闭

查看cgroup是否开启

[root@linjian ~]# uname -r
3.10.0-1160.24.1.el7.x86_64
[root@linjian ~]# cat /boot/config-3.10.0-1160.24.1.el7.x86_64 | grep CGROUP
CONFIG_CGROUPS=y # y 已经开启了
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NETFILTER_XT_MATCH_CGROUP=m
CONFIG_NET_CLS_CGROUP=y
CONFIG_NETPRIO_CGROUP=y

查看cgroup 使用版本

stat -fc %T /sys/fs/cgroup/ 如果v2,输出为 cgroup2fs ;v1 输出 tmpfs

[root@linjian ~]# stat -fc %T /sys/fs/cgroup/
tmpfs

查看当前进程属于哪些cgroup

[root@linjian ~]# cat /proc/$$/cgroup
11:devices:/user.slice
10:freezer:/
9:pids:/user.slice
8:memory:/user.slice
7:perf_event:/
6:cpuset:/
5:cpuacct,cpu:/user.slice
4:hugetlb:/
3:net_prio,net_cls:/
2:blkio:/user.slice
1:name=systemd:/user.slice/user-0.slice/session-1422.scope

冒号隔开

第一个:cgroup树的ID与/proc/cgroups文件中的ID一一对应。

第二个:和cgroup树绑定的所有subsystem(多个subsystem用逗号隔开)。如果name=systemd,表示没有和任何subsystem绑定。

第三个:进程在cgroup树中的路径(挂载点的相对路径),即进程所属的cgroup。

查看目前Linux支持的subsystem(12种)

[root@linjian ~]# ls -lh /sys/fs/cgroup
total 0
drwxr-xr-x 5 root root  0 Dec 26 23:00 blkio
lrwxrwxrwx 1 root root 11 Dec 26 23:00 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Dec 26 23:00 cpuacct -> cpu,cpuacct
drwxr-xr-x 8 root root  0 Jan  2 10:01 cpu,cpuacct
drwxr-xr-x 3 root root  0 Dec 26 23:00 cpuset
drwxr-xr-x 5 root root  0 Dec 26 15:02 devices
drwxr-xr-x 3 root root  0 Dec 26 23:00 freezer
drwxr-xr-x 3 root root  0 Dec 26 23:00 hugetlb
drwxr-xr-x 6 root root  0 Jan  2 10:01 memory
lrwxrwxrwx 1 root root 16 Dec 26 23:00 net_cls -> net_cls,net_prio
drwxr-xr-x 3 root root  0 Dec 26 23:00 net_cls,net_prio
lrwxrwxrwx 1 root root 16 Dec 26 23:00 net_prio -> net_cls,net_prio
drwxr-xr-x 3 root root  0 Dec 26 23:00 perf_event
drwxr-xr-x 5 root root  0 Dec 26 23:00 pids
drwxr-xr-x 5 root root  0 Dec 26 23:00 systemd
  • cpu :限制cgroup的CPU使用率。
  • cpuacct :统计cgroup的CPU的使用率。
  • cpuset:绑定cgroup到指定CPUs和NUMA节点。
  • memory :统计和限制cgroup的内存的使用率,包括process memory, kernel memory, 和swap。
  • devices :限制cgroup创建(mknod)和访问设备的权限。
  • freezer :suspend和restore一个cgroup中的所有进程。
  • net_cls :将一个cgroup中进程创建的所有网络包加上一个classid标记,用于tc和iptables。 只对发出去的网络包生效,对收到的网络包不起作用。
  • blkio :限制cgroup访问块设备的IO速度。
  • perf_event :对cgroup进行性能监控
  • net_prio :针对每个网络接口设置cgroup的访问优先级。
  • hugetlb :限制cgroup的huge pages的使用量。
  • pids :限制一个cgroup及其子孙cgroup中的总进程数。

cgroup操作

挂载cgroup

[root@linjian home]# mkdir cgroupTest
[root@linjian home]# cd cgroupTest/
[root@linjian cgroupTest]# ls
[root@linjian cgroupTest]# mkdir demo01
# 创建一颗新的cgroup树,然后挂载到demo01目录
[root@linjian cgroupTest]# mount -t cgroup -o none,name=demo01 demo01 ./demo01
[root@linjian cgroupTest]# cd demo01/
[root@linjian demo01]# ls -lha
total 4.0K
drwxr-xr-x 2 root root    0 Jan  3 20:47 .
drwxr-xr-x 3 root root 4.0K Jan  3 20:44 ..
-rw-r--r-- 1 root root    0 Jan  3 20:47 cgroup.clone_children
--w--w--w- 1 root root    0 Jan  3 20:47 cgroup.event_control
-rw-r--r-- 1 root root    0 Jan  3 20:47 cgroup.procs
-r--r--r-- 1 root root    0 Jan  3 20:47 cgroup.sane_behavior
-rw-r--r-- 1 root root    0 Jan  3 20:47 notify_on_release
-rw-r--r-- 1 root root    0 Jan  3 20:47 release_agent
-rw-r--r-- 1 root root    0 Jan  3 20:47 tasks
[root@linjian demo01]# wc -l cgroup.procs
131 cgroup.procs

创建/删除cgroup

[root@linjian demo01]# mkdir cgroupT01    // 创建子cgroup
[root@linjian demo01]# cd cgroupT01/
[root@linjian cgroupT01]# ls
cgroup.clone_children  cgroup.event_control  cgroup.procs  notify_on_release  tasks
[root@linjian cgroupT01]# wc -l cgroup.procs
0 cgroup.procs
[root@linjian cgroupT01]# cd ..
[root@linjian demo01]# rmdir cgroupT01  // 删除
[root@linjian demo01]# ls
cgroup.clone_children  cgroup.event_control  cgroup.procs  cgroup.sane_behavior  notify_on_release  release_agent  tasks

限制进程数

客户端1

[root@linjian ~]# mount|grep pids
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
[root@linjian ~]# cd /sys/fs/cgroup/pids/
[root@linjian pids]# mkdir limitTest
[root@linjian pids]# cd limitTest/
[root@linjian limitTest]# ls 
cgroup.clone_children  cgroup.event_control  cgroup.procs  notify_on_release  pids.current  pids.max  tasks
[root@linjian limitTest]# cat pids.max
max
[root@linjian limitTest]# cat pids.current 
0
[root@linjian limitTest]# echo 1 > pids.max
[root@linjian limitTest]# echo $$ > cgroup.procs

pids.current: 表示当前cgroup及其所有子孙cgroup中现有的总的进程数量

pids.max: 当前cgroup及其所有子孙cgroup中所允许创建的总的最大进程数量

客户端2

[root@linjian ~]# cd /sys/fs/cgroup/pids/
[root@linjian pids]# mkdir limitTest
[root@linjian pids]# cd limitTest/
[root@linjian limitTest]# ls 
cgroup.clone_children  cgroup.event_control  cgroup.procs  notify_on_release  pids.current  pids.max  tasks
[root@linjian limitTest]# cat pids.max
max
[root@linjian limitTest]# cat pids.current 
0

客户端1

# 创建新进程失败
[root@linjian limitTest]# ls
-bash: fork: retry: No child processes
-bash: fork: retry: No child processes
-bash: fork: retry: No child processes

限制内存使用

[root@linjian ~]# mount|grep memory
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
[root@linjian ~]# cd /sys/fs/cgroup/memory
# 创建子group
[root@linjian memory]# mkdir limitTest  
[root@linjian memory]# cd limitTest/
[root@linjian limitTest]# ls
cgroup.clone_children  memory.kmem.limit_in_bytes          memory.kmem.tcp.usage_in_bytes  memory.memsw.max_usage_in_bytes  memory.soft_limit_in_bytes  tasks
cgroup.event_control   memory.kmem.max_usage_in_bytes      memory.kmem.usage_in_bytes      memory.memsw.usage_in_bytes      memory.stat
cgroup.procs           memory.kmem.slabinfo                memory.limit_in_bytes           memory.move_charge_at_immigrate  memory.swappiness
memory.failcnt         memory.kmem.tcp.failcnt             memory.max_usage_in_bytes       memory.numa_stat                 memory.usage_in_bytes
memory.force_empty     memory.kmem.tcp.limit_in_bytes      memory.memsw.failcnt            memory.oom_control               memory.use_hierarchy
memory.kmem.failcnt    memory.kmem.tcp.max_usage_in_bytes  memory.memsw.limit_in_bytes     memory.pressure_level            notify_on_release
[root@linjian limitTest]#  
# 查看使用的情况
[root@linjian limitTest]# cat memory.usage_in_bytes
0
# 查看限定额度
[root@linjian limitTest]# cat memory.limit_in_bytes
9223372036854771712
# 限定64k
[root@linjian limitTest]# echo 64k > memory.limit_in_bytes

限制cpu使用

[root@linjian memory]# mount|grep cpu
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
[root@linjian memory]# cd /sys/fs/cgroup/cpu,cpuacct
[root@linjian cpu,cpuacct]# mkdir limitTest
[root@linjian cpu,cpuacct]# cd limitTest/
[root@linjian limitTest]# ls
cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks
[root@linjian limitTest]# cat cpu.cfs_quota_us
-1
# 设置只能使用1个cpu的20%的时间
[root@linjian limitTest]# echo 20000 > cpu.cfs_quota_us
[root@linjian limitTest]# cat cpu.cfs_quota_us
20000
[root@linjian limitTest]# echo $$
12649
[root@linjian limitTest]# echo 12649 > cgroup.procs
[root@linjian limitTest]# while :; do echo limitTest > /dev/null; done

客户端2

# 可以看到已经占满了
[root@linjian ~]# top
top - 21:43:19 up 8 days,  6:42,  8 users,  load average: 0.01, 0.02, 0.05
Tasks: 135 total,   2 running, 133 sleeping,   0 stopped,   0 zombie
%Cpu(s):  8.0 us,  4.7 sy,  0.0 ni, 86.8 id,  0.0 wa,  0.0 hi,  0.5 si,  0.0 st
KiB Mem :  3880104 total,   112104 free,  1317032 used,  2450968 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  2281320 avail Mem PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                 
12649 root      20   0  115648   2196   1716 R  20.3  0.1   0:07.64 bash  
[root@linjian ~]# cat /sys/fs/cgroup/cpu,cpuacct/limitTest/cpu.stat
nr_periods 462 #表示过去了多少个cpu.cfs_period_us里面配置的时间周期 
nr_throttled 460 # 在上面的这些周期中,有多少次是受到了限制
throttled_time 36266699145 # cgroup中的进程被限制使用CPU持续了多长时间(纳秒)

cgroup和namespace区别

namespace:为了隔离进程组之间的资源

cgroup:为了对一组进程进行的资源监控和限制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595903.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国5米分辨率坡度数据

中国5米分辨率坡度数据 坡度是地表单元陡缓的程度,通常把坡面的垂直高度和水平距离的比值称为坡度。坡度的表示方法有百分比法、度数法、密位法和分数法四种,其中以百分比法和度数法较为常用。 中国5米分辨率坡度数据集,利用5米分辨率DEM数据…

借还款记账表,借款还款记账软件

我们每个人都在为生活奔波,为事业打拼。但有时候,生活中的一些小事情,比如朋友间的借贷、还款,就可能让我们的生活变得有些混乱。为了解决这个问题,一个全新的借还款记账软件【晨曦记账本】横空出世,它不仅…

如何实现APP安全加固?加固技术、方法和方案

​ 本文我们着重分享App安全加固的相关内容。 ​ (安全检测内容) 通过前面的文章我们知道了app安全检测要去检测哪些内容,发现问题后我们如何去修复?如何避免安全问题?首先我们先来讲一下APP安全加固技术。 Ipa Guar…

在Impala中分页 进行SQL查询并分页可以使用LIMIT子句来限制返回结果集的数量。

在Impala中进行SQL查询并分页可以使用LIMIT子句来限制返回结果集的数量。 示例1:获取前5条记录 SELECT * FROM table_name LIMIT 5;示例2:从第6条开始获取后面的5条记录(每次获取5条) SELECT * FROM (SELECT t.*, ROW_NUMBER()…

pinia 给 state 指定变量类型

pinia 给 state 指定变量类型 问题描述 自从用 vitetsvue3 以来,我一直有一个很大的疑问,就是 pinia 中的 state 变量类型该从哪定义,如何定义它? 因为我在使用未定义类型的 state 变量的时候一直会有一个提示,提示说…

nodejs和vuejs的区别

一、vue项目开发中,两个经常混合使用。 不同: 1、概念不同: 一个是前端框架,一个是服务端语言。 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使…

免费搭建知识付费平台:让知识更有价值

明理信息科技知识付费saas租户平台 在当今的知识经济时代,一个高效、便捷的知识服务平台对于企业和个人至关重要。然而,市面上的众多知识服务平台中,许多产品存在高昂的费用、无用功能的堆砌、无法定制化等问题,让用户进退两难&…

mysql根据查询结果连续序号

业务数据一般都不是连续的ID,导出Excel的时候要求连续序号 set rownum0; SELECT rownum:rownum1 as 序号,a.* from user a

C# 中英文及字符所占字节详解

1.C#中英文字符占用的空间大小 一般在英文状态下一个字母或字符占用一个字节,一个汉字用两个字节表示。 ASCII 码中,一个英文字母(不分大小写)为一个字节,一个中文汉字为两个字节。 UTF-8 编码中,一个英文字为一个字节&#xff…

VS Code打造Autohotkey环境

文章目录 简介和安装功能说明测试相关推荐 简介和安装 Autohotkey堪称自动化效率神器,可以穿透Windows窗口,获取UI对象,从而可以在现有程序的基础上,进行有针对性的开发,大大提高效率。 VS Code提供了AHK插件&#x…

KNN 分类(选择最佳的 K 值,并可视化模型精度与 n_neighbors 的关系)

import matplotlib.pyplot as plt from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier# 导入乳腺癌数据集 cancer load_breast_cancer()# 划分训练集和测试集 X_tra…

【学习笔记】CF1864H Asterism Stream

从一道 简单题 联想了过来。 Part 1 先复述一遍官方题解的做法:记几何级数 f ( x ) a k b x f(x)ak^{bx} f(x)akbx(也就是等比数列), [ 2 l , 2 r ] [2l,2r] [2l,2r]区间内的DP值可以表示为若干个几何级数的和。本题中 k 1 2 …

uniapp中uview组件库的Search 搜索 的用法

目录 基本使用 #设置输入框形状 #是否开启清除控件 #是否开启右边控件 #自定义样式 API #Props #Events 基本使用 通过placeholder参数设置占位内容通过v-model双向绑定一个变量值,设置初始化时搜索框的值,如果初始内容为空,那么请绑…

高通guestOS与hostOS通信框架HAB源码分析——概述

1)什么是HAB,他用来干什么? 如果你了解virtIO的话,就很容易明白HAB是用来干什么的。一句话来说,HAB实际作用和virtIO差不多。以高通8155(host qnxguest安卓)为例,所有硬件外设驱动都在qnx端&am…

二进制安装包安装Prometheus插件安装(mysql_exporter)

简介 mysql_exporter是用来收集MysQL或者Mariadb数据库相关指标的,mysql_exporter需要连接到数据库并有相关权限。既可以用二进制安装部署,也可以通过容器形式部署,但为了数据收集的准确性,推荐二进制安装。 一,下载安…

代码随想录算法训练营第四十八天|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

代码随想录算法训练营第四十八天|198.打家劫舍、213.打家劫舍II、337.打家劫舍III 打家劫舍 198.打家劫舍 文章讲解:https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html 题目链接:https://leetcode.cn/problems/house-robber…

[C#]使用onnxruntime部署yolov8-onnx实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…

Android Framework | Linux 基础知识:入门指南

Android Framework | Linux 基础知识:入门指南 进行Android Framework开发需要具备基本的Linux基本知识,下面是一份Linux基础知识入门指南,希望对你有所帮助! 1. 简介 Linux 是一种免费、开源的操作系统,它是由芬兰…

文件高效复制与删除:轻松删除垃圾文件,让文件夹焕然一新!

你是否经常遇到文件复制繁琐、删除垃圾文件困难的问题?现在,我们为你提供了一款强大的文件高效复制与删除工具,让你轻松实现目标文件夹的整洁与高效! 第一步,我们要打开目标文件夹,就会发现里面有很多其他的…

SCPMA最新研究论文推荐!中国移动玻色量子发布联合研究成果

《中国科学:物理学 力学 天文学》英文版(SCIENCE CHINA Physics, Mechanics & Astronomy, SCPMA)出版中移(苏州)软件技术有限公司闻经纬和钱岭团队与北京玻色量子文凯团队的研究成果,文章题为“Optical experimental solution for the multiway numb…