Linux cgroup

news2024/11/25 16:51:16

前言

Cgroup和namespace类似,也是将进程进程分组,但是目的与namespace不一样,namespace是为了隔离进程组之前的资源,而Cgroup是为了对一组进程进行统一的资源监控和限制。

Cgroup的组成

在这里插入图片描述

subsystem

一个subsystem就是一个内核模块(例如:图中的cpu,memory).它被关联到一颗Cgroup树之后,它就会对树的每个节点(进程组) 调度和限制资源,监控,及观察进程组的状态.
目前Linux支持12中system,比如限制CPU的使用时间,限制使用内存,统计CPU使用情况,冻结和恢复一组进程等。

subsystem作用
cpu主要限制进程CPU使用率
cpuacct统计cgroups中进程的cpu使用率
cpuset为cgroups中进程分配单独的CPU节点(多核)或内存节点
blkio限制进程的块设备IO
memory限制进程的memory使用量
devices可以控制进程能够访问某些设备
freezer挂起或者恢复cgrops中进程
net_cls可以标记cgroups中进程的网络数据包,然后可以使用tc(traffic control)对数据包进程控制
ns可以使不同cgroups下面的进程使用不同的namespace
Hierachy

cgroup结构体可以组成一棵树,每一颗cgroup结构体组成的的树称为cgroup层级结构(hierarchy)在这里插入图片描述
当前层级结构可以对其子的cgroups进行资源限制, 如图所示

  • cgroup1 中限制了使用 cpu 及 内存资源,它将控制子节点的 CPU 周期和内存分配(即,限制 cgroup2、cgroup3、cgroup4 中的cpu及内存资源分配)。
  • cgroup2 中启用了内存限制,但是没有启用cpu的资源限制,这就导致了 cgroup3 和 cgroup4 的内存资源受 cgroup2中的 mem 设置内容的限制;
  • cgroup3 和 cgroup4 会自由竞争在 cgroup1 的 cpu 资源限制范围内的 cpu 资源。

也可以明显的看出 cgroup 资源是自上而下分布约束的。只有当资源已经从上游 cgroup 节点分发给下游时,下游的 cgroup 才能进一步分发约束资源。

Task

任务即系统的一个进程。一个进程可以加入到某个cgroups,也可以从一个cgroups迁移到另一个cgroups。一个进程组的进程可以使用cgroups为单位分配资源,同时受到cgroups为单位设定限制。

三者关系
  1. 同一个task不能属于同一个hierarchy的不同的cgroup
  2. 同一个hierarchy可以附加到一个或者多个subsystem
  3. 一个subsystem可以附加到多个hierarchy,当且仅当这个hierarchy只有这一个subsystem。
  4. fork出的子进程在初始化状态与其父进程处于同一个cgroup。

2,3 可以理解为,当hierarchy有能力管理多个资源的时候,让别的hierarchy,分担你其中一资源。当仅仅当你一个资源的管理不过来的时候可以分担

实操

要想使用cgroup,要先通过两种方式创建

  1. 在/sys/fs/cgroup目录中的任何subsystem中创建子目录,并把任务的PID添加到tasks文件中,该文件会在创建子目录后立即自动创
  2. 通过libcgroup库创建、删除和管理cgroups

这里我们使用第一种。

  1. 现在我们前往memory子目录
cd memory
  1. 创建cgroup_test_group目录
mkdir cgroup_test_group
  1. 在创建完cgroup_test_group文件夹之后,下面的文件会自动创建:
/sys/fs/cgroup/memory/cgroup_test_group$ ls -l
total 0
-rw-r--r-- 1 root root 0 May  7 01:00 cgroup.clone_children
--w--w--w- 1 root root 0 May  7 01:00 cgroup.event_control
-rw-r--r-- 1 root root 0 May  7 01:00 cgroup.procs
-r--r--r-- 1 root root 0 May  7 01:00 memory.stat
-rw-r--r-- 1 root root 0 May  7 01:00 memory.swappiness
-rw-r--r-- 1 root root 0 May  7 01:18 memory.limit_in_bytes
-r--r--r-- 1 root root 0 May  7 01:00 memory.usage_in_bytes
-rw-r--r-- 1 root root 0 May  7 01:00 memory.use_hierarchy
-rw-r--r-- 1 root root 0 May  7 01:00 notify_on_release
-rw-r--r-- 1 root root 0 May  7 01:00 tasks
  1. 设置最大内内存
echo 1048576 > memory.limit_in_bytes
  1. 关闭虚拟内存swap
echo 0 > memory.swappiness
  1. 编写java程序
public class Demo {

    public static void main(String[] args) throws InterruptedException {
        byte[][] a = new byte[10000][];
        for (int i = 0; i < 10000; i++) {
            a[i] = new byte[1024 * 5];
            System.out.println("创建了" + (i+1) * 5  + "K" );
            Thread.sleep(300);
        }
    }
}
  1. 运行java并将pid加入task
echo ${pid} > tasks

在这里插入图片描述
发现创建到645K就被kill了,因为Java虚拟机本生运行要内存

主要参考

《Cgroup概述》
《memory cgroup》

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

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

相关文章

【HCIP】VLAN实验(Hybrid模式)

目录 需求&#xff1a; 一、设计 二、VLAN配置 三、交换机间实现trunk的功能 四、路由器配置 五、验证 需求&#xff1a; 1、PC1和PC3所在接口为access 2、PC2/4/5/6处于同一网段&#xff0c;其中PC2可以访问PC4/5/6&#xff1b;但PC4可以访问PC5&#xff0c;不能访问PC…

ARM嵌入式编译器-volatile关键字对编译器优化的影响

volatile限定符告知计算机&#xff0c;其他agent&#xff08;而不是变量所在的程序&#xff09;可以改变该变量的值。通常它被用于硬件地址以及在其他程序或同时运行的线程中共享数据。要求编译器不要对其描述的对象作优化处理&#xff0c;对它的读写都需要从内存中访问。 使用…

文献阅读:LLaMA: Open and Efficient Foundation Language Models

文献阅读&#xff1a;LLaMA: Open and Efficient Foundation Language Models 1. 文章简介2. 模型训练 1. 训练数据2. 模型结构3. 模型训练 1. Optimizer2. 效率优化 3. 效果评估 1. 经典任务下效果 1. Commen Sense Reasoning2. Closed-book Question Answering3. Reading Co…

数据分析03——矩阵常用计算方法和函数

0、前言&#xff1a; 数组&#xff1a;计算机领域的概念矩阵&#xff1a;数学领域的概念对于Numpy而言&#xff0c;矩阵是数组的分支 1、创建矩阵&#xff1a; 字符串创建矩阵&#xff1a;mat1 np.matrix(‘1 2;3 4’)列表形式创建矩阵&#xff1a;mat2 np.matrix([[5, 6],…

MySQL基础(八)聚合函数

上一章讲到了 SQL 单行函数。实际上 SQL 函数还有一类&#xff0c;叫做聚合&#xff08;或聚集、分组&#xff09;函数&#xff0c;它是对一组数据进行汇总的函数&#xff0c;输入的是一组数据的集合&#xff0c;输出的是单个值。 1. 聚合函数介绍 什么是聚合函数 聚合函数作…

深度学习目标检测项目实战(五)—基于mobilenetv2和resnet的图像背景抠图及其界面封装

深度学习目标检测项目实战(五)—基于mobilenetv2和resnet的图像背景抠图及其界面封装 该项目很有意思&#xff0c;也是比较前沿&#xff0c;项目主要参考了开源代码&#xff1a; https://github.com/PeterL1n/BackgroundMattingV2 环境搭建 kornia0.4.1 tensorboard2.3.0 to…

图像修复_criminis算法及改进算法学习小结

摘要 对图像修复专题学习情况的一个总结&#xff0c;学习内容包括&#xff1a; &#xff08;1&#xff09;综述文献的阅读及对图像修复的理解。 &#xff08;2&#xff09;criminis算法的仿真情况。 &#xff08;3&#xff09;criminis算法的改进算法的仿真 一、 前言 1&…

【leetcode】138.复制带随机指针的链表

《力扣》138.复制带随机指针的链表 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设…

[羊城杯 2020]a_piece_of_java

首先jd-gui进行反编译 简单查看发现有用的类就两个一个是 MainContrller.class和InfoInvocationHandler.class public class MainController {GetMapping({"/index"})public String index(CookieValue(value "data", required false) String cookieDa…

【C++】类和对象(初阶认识)#上篇#

目录 对面向过程和面向对象的初步认识 类的引入 封装 和 类的访问限定符 所以祖师爷在类中还引入了访问权限 用类定义变量 类的理解和对象的实例化 sizeof 计算类对象的大小 类对象的成员函数在公共代码区 this 指针 对面向过程和面向对象的初步认识 什么&#xff0c;是…

分片集群-搭建

分片集群 高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。 为了解决这些问题,有两个基本的方法: 垂直扩展和水平扩展。 垂直扩展&#xff1a;增加更多的…

阿里云服务器地域和可用区怎么选择合适?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

ROHM常见的电冰箱控制电路图,轻松了解冰箱工作原理

​冰箱是我们日常生活中使用频率非常高的电器&#xff0c;它可以将食物和饮料保存在低温下&#xff0c;以延长它们的保质期。冰箱的工作原理主要基于制冷循环和温度控制。 先看电路图&#xff1a; 1. 单门直冷式电冰箱重锤式控制电路 电路的基本组成&#xff1a;采用重锤式启…

win10安装pytorch全网最好用的教程[2023.5.7更新]

目录 0.关于pytorch a. 什么是 PyTorch &#xff1f; b. 为何选择 PyTorch &#xff1f; 1.安装pytorch 1.1确定关联性 1.2下载最新版本的pytorch 1.3.pytorch历史版本下载 1.4 避坑 1.4.1、猜测 1.4.2、验证 1.4.3、解决方案 1.5、检验 0.关于pytorch a. 什么是…

前端学习----webpack入门学习

webpack是前端项目工程化的具体解决方案 主要功能&#xff1a;它提供了友好的前端模块化开发支持&#xff0c;以及 代码压缩(将空格和注释全部消除&#xff0c;变成一行代码)、 处理浏览器端JavaScript的兼容性(只管写高级语法&#xff0c;自动向下兼容。例如ie8不支持let 语法…

【Shell】一天快速入门

1 Shell解析器 Linux提供的shell解析器有6种&#xff1a; /bin/sh /bin/bash /sbin/nologin /bin/csh /bin/dash /bin/tashsh是bash的软连接。 2 Shell脚本 2.1 hello.sh脚本 #!/bin/bash echo hello world!#! 告诉系统这个脚本需要什么解释器来执行&#xff1b; 脚本以#!…

NCNN----Monodepthv2单目深度估计 小米手机部署

题目要求&#xff1a;学习了解单目深度估计模型MonoDepthv2&#xff0c;基于NCNN推理框架部署到小米手机 MonoDepthv2 论文&#xff1a;Digging Into Self-Supervised Monocular Depth Estimation MonoDepthv2 源码&#xff1a;Monodepth2 GitHub 分析&#xff1a; 1&#xff0…

Illustrator如何进行任务自动化之实例演示?

文章目录 0.引言1.动作的录制2.对文件播放动作3.批处理 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对Illustrator进行了学习&#xff0c;本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对任务自动化进行…

Cadence技巧总结学习(DRC、Annotate)持续更新~

Cadence技巧总结学习持续更新~ 你还可以再哪里看到这篇文章&#xff1a;知乎 1. 画叉 对于芯片上不用的引脚信号画上号&#xff0c;如下&#xff1a; 按大写X就可以了&#xff0c;或是双脚引脚&#xff0c;在跳出的界面中&#xff0c;Is No Connect上✔。 2. 画线快捷键&#…

【关于C++中----智能指针】

文章目录 一、概念引入二、内存泄漏2.1 内存泄漏概念及其危害2.2 内存泄漏分类2.3 避免内存泄漏 三、智能指针的原理3.1 RAII3.2 像指针一样 四、三类智能指针4.1 auto_ptr4.2 unique_ptr4.3 shared_ptr 五、循环引用和weak_ptr 一、概念引入 在我们日常写代码过程中&#xff…