从automaxprocs库浅窥Linux容器的资源控制
automaxprocs能够自动调整Go程序中的Goroutine数量,以充分利用系统资源并提高程序的性能。
automaxprocs通过读取系统信息,如CPU核心数和Cgroups限制,来动态调整Goroutine的数量
automaxprocs获取CPU限额的关键方法在
// CPUQuotaToGOMAXPROCS converts the CPU quota applied to the calling process
// to a valid GOMAXPROCS value. The quota is converted from float to int using round.
// If round == nil, DefaultRoundFunc is used.
func CPUQuotaToGOMAXPROCS(minValue int, round func(v float64) int) (int, CPUQuotaStatus, error) {if round == nil {round = DefaultRoundFunc}cgroups, err := _newQueryer()if err != nil {return -1, CPUQuotaUndefined, err}quota, defined, err := cgroups.CPUQuota()if !defined || err != nil {return -1, CPUQuotaUndefined, err}maxProcs := round(quota)if minValue > 0 && maxProcs < minValue {return minValue, CPUQuotaMinUsed, nil}return maxProcs, CPUQuotaUsed, nil
}
可以看到是先获取到cgroup的实现,然后调用实现方法获取限制
获取cgroup2实现如下
func newCGroups2From(mountInfoPath, procPathCGroup string) (*CGroups2, error) {// 检查是否是cgroup2// 通过/proc/self/mountinfo中文件系统类型是否为cgroup2或者挂载点在/sys/fs/cgroupisV2, err := isCGroupV2(mountInfoPath)if err != nil {return nil, err}if !isV2 {return nil, ErrNotV2}// 从/proc/self/cgroup解析子系统对应的cgroupsubsystems, err := parseCGroupSubsystems(procPathCGroup)if err != nil {return nil, err}// Find v2 subsystem by looking for the `0` id// 找到v2子系统var v2subsys *CGroupSubsysfor _, subsys := range subsystems {if subsys.ID == 0 {v2subsys = subsysbreak}}if v2subsys == nil {return nil, ErrNotV2}return &CGroups2{mountPoint: _cgroupv2MountPoint,groupPath: v2subsys.Name,cpuMaxFile: _cgroupv2CPUMax,}, nil
}
具体算限制方法如下
其实就是取cpu.max文件中指定的限额
// CPUQuota returns the CPU quota applied with the CPU cgroup2 controller.
// It is a result of reading cpu quota and period from cpu.max file.
// It will return `cpu.max / cpu.period`. If cpu.max is set to max, it returns
// (-1, false, nil)
func (cg *CGroups2) CPUQuota() (float64, bool, error) {// 打开/sys/fs/cgroup下对应cgroup的cpu.max文件cpuMaxParams, err := os.Open(path.Join(cg.mountPoint, cg.groupPath, cg.cpuMaxFile))if err != nil {if os.IsNotExist(err) {return -1, false, nil}return -1, false, err}defer cpuMaxParams.Close()scanner := bufio.NewScanner(cpuMaxParams)if scanner.Scan() {fields := strings.Fields(scanner.Text())if len(fields) == 0 || len(fields) > 2 {return -1, false, fmt.Errorf("invalid format")}if fields[_cgroupv2CPUMaxQuotaIndex] == _cgroupV2CPUMaxQuotaMax {return -1, false, nil}// 解析最大额度max, err := strconv.Atoi(fields[_cgroupv2CPUMaxQuotaIndex])if err != nil {return -1, false, err}var period intif len(fields) == 1 {period = _cgroupV2CPUMaxDefaultPeriod} else {period, err = strconv.Atoi(fields[_cgroupv2CPUMaxPeriodIndex])if err != nil {return -1, false, err}if period == 0 {return -1, false, errors.New("zero value for period is not allowed")}}// 返回限额// 也就是最大额度除以周期return float64(max) / float64(period), true, nil}if err := scanner.Err(); err != nil {return -1, false, err}return 0, false, io.ErrUnexpectedEOF
}
cgroup2了解
cgroup允许对进程进行资源限制与管理,由负责分层组织进程的核心与负责沿层次
cgroup2则引入了更一致的设计和体验
统一层次结构
cgroup2引入统一层次结构,所有子系统(如cpu、memory)都共享同一个层次结构,从而减少了管理的复杂性
也简化了API,统一了配置接口,使其更加易用
基于权重的CPU调度
cgroup2以权重来控制CPU资源的分配。相对的权重越高,则获得的CPU时间越多。
如此,通过权重机制,用户可以很轻松地为不同任务分配 CPU 资源,而无需指定具体的 CPU 配额。这使得 CPU 使用更加灵活,同时调度系统也会根据实际负载动态调整资源分配
更安全的容器子树委派:
cgroup子树委派是将部分资源控制交予非特权用户的方式。
非特权用户可以管理自己子树下的 cgroup 控制器,而不会有权限修改父级或同级 cgroup 的资源控制设置
对内存管理进行更严格控制、记账
- 内核内存和用户内存 的统一管理
- 改进了内存压力下的行为,通过 压力感知提供实时的内存压力监控
内存控制相关文件
- memory.high: 高水位线,超过这个值时,系统会尝试回收内存
- memory.low: 若内存使用率在其有效下限内,则除非可以从不受保护的 cgroup 中回收内存,否则不会回收 cgroup 的内存
- memory.max: 硬性内存限制,超出该值后将触发 OOM
- memory.swap.max: 控制交换区使用的最大内存量。
- memory.current: 实时显示当前 CGroup 使用的内存量
thread mode
在 cgroup v1 中,资源控制一般是基于进程组的,无法对同一进程中的不同线程进行独立的资源控制和隔离
为此在v2中,便支持thread mode,将进程中不同线程分配到不同cgroup中,这意味着可以对单个线程设置 CPU、内存等资源限制
在线程式子树中,只能启用线程式控制器。在线程子树中启用线程控制器时,它仅考虑和控制与 cgroup 及其后代中的线程关联的资源消耗。所有未绑定到特定线程的消费都属于线程域 cgroup。
控制PID
限制某个 CGroup 中允许的进程数量,防止某些容器或进程滥用系统资源
Ref
- https://kubernetes.io/docs/concepts/architecture/cgroups/
- https://github.com/uber-go/automaxprocs
- https://docs.kernel.org/admin-guide/cgroup-v2.html
相关文章:
从automaxprocs库浅窥Linux容器的资源控制
automaxprocs能够自动调整Go程序中的Goroutine数量,以充分利用系统资源并提高程序的性能。 automaxprocs通过读取系统信息,如CPU核心数和Cgroups限制,来动态调整Goroutine的数量 automaxprocs获取CPU限额的关键方法在 // CPUQuotaToGOMAXP…...
AI 读文献(二):综述论文10倍速读和整理
我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 上一篇娜姐讲了research研究论文的速度框架和效果, AI阅读研究论文,这个方法10倍速提升效率还不损失关键信息! 学员们反馈效果很好&#x…...
【AAOS】Android Automotive 10模拟器源码下载及编译
源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r47 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch aosp_car_x86_64-userdebug make -j8 运行效果 emualtor Cluster Home Map All …...
前端开发攻略---使用css实现滚动吸附效果
实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><style>…...
解析 MySQL 查询优化:提升性能的十个关键策略
1. 避免全表扫描 当查询的数据量非常大时,全表扫描的效率会很低。应尽量通过在WHERE和ORDER BY涉及的列上创建索引,避免全表扫描。索引就像一本书的目录,可以快速定位到需要的数据,而不用从头开始逐页查找。 示例: 如…...
QT--QPushButton设置文本和图标、使能禁能、信号演示
按钮除了可以设置显示文本之外,还可以设置图标 文本 可以获取和设置按钮上显示的文本 // 获取和设置按钮的文本 QString text() const void setText(const QString &text)该属性,既可以在 Qt 设计师右侧的属性窗口中修改,也可以在代码…...
PostgreSQL学习笔记六:模式SCHEMA
模式(Schema) PostgreSQL中的模式(Schema)是一个命名的数据库对象集合,包括表、视图、索引、数据类型、函数、存储过程和操作符等。模式的主要作用是组织和命名空间数据库对象,使得同一个数据库中可以包含…...
基础IO -- 理解文件(1)
目录 一:回顾文件 二:加深对文件的理解 1.概念 2.以w写方式打开 3.以a追加方式打开 4.重定向 一:回顾文件 以前学习过在C语言中的文件操作, 但那根本是不足以理解文件的,即站在语言角度是不可能理解文件的 我们要…...
golang包管理
package 在工程化的Go语言开发项目中,Go语言的源码复用是建立在包(package)基础之上的。本文介绍了Go语言中如何定义包、如何导出包的内容及如何导入其他包。 包与依赖管理 本章学习目标 掌握包的定义和使用掌握init初始化函数的使用掌握…...
outlook 添加企业邮箱账号出现 553 authentication is required 错误解决
系统报错如下 问题原因 发件服务器身份验证设置错误,或者未勾选发送服务器验证的选项。 解决方案 Outlook客户端 本文以Outlook 2016为例,具体操如下: 1、在Outlook客户端的电子邮件设置窗口中,单击其他设置; 2、…...
一个开源可本地部署的英文翻译服务----EnToZhAPI
EnToZhAPI项目简介 项目背景 提供本地化的英文翻译服务API。支持单句翻译请求或者批量翻译请求。支持建立查询词汇表。 项目架构 前端:使用原生js,使用MDB作为CSS框架。django模板引擎渲染可视化界面。 后端:使用waitress作为后端服务器…...
【unity】编辑器扩展——在OnValidate中创建、删除游戏物体
我们知道在OnValidate中创建游戏物体会发出警告,删除游戏物体会报错。 所以我们使用协程,将开始动作的信号放在OnValidate中,将动作的执行放在帧结尾。 参考代码如下: using System.Collections; using UnityEngine;public clas…...
学习记录:js算法(六十四):最后一块石头的重量
文章目录 最后一块石头的重量思路一思路二 最后一块石头的重量 有一堆石头,每块石头的重量都是正整数。 每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x < y。那么粉碎的可能结果如…...
单片机探秘:从理论到应用
单片机探秘:从理论到应用 在这个科技飞速发展的时代,单片机的应用如同一颗璀璨的星星,照亮了我们生活的方方面面。今天,让我们一同深入探讨单片机的原理与应用,揭开这个技术领域的神秘面纱。 1. 单片机概述 1.1 什么…...
options妙用
options妙用 设置默认浏览器为 Chrome options(browser “chrome”) 再次尝试运行 igsva() res <- igsva() 加载 BiocManager library(BiocManager) 设置超时时间 options(timeout 3600) 安装包 BiocManager::install(c(“org.Hs.eg.db”, “org.Mm.eg.db”)) …...
UE5 圆周运动、贝塞尔曲线运动、贝塞尔曲线点
圆周运动 贝塞尔曲线路径运动 蓝图函数库创建贝塞尔曲线点 // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "MyB…...
线程局部存储(TLS)
很多时候,我们可能想存储一些线程的私有数据,属于线程的私有变量有局部变量,函数的参数,假如我们要在线程中存储全局变量,多个线程访问都对这个变量有自己的一个副本。 一、隐式实现 __thread int a; //linux __dec…...
JavaSE——集合7:Set接口实现类—TreeSet
目录 一、TreeSet基本介绍 二、TreeSet核心方法 三、TreeSet排序方法 四、TreeSet源码解析 1.无参构造时,底层是创建TreeMap对象 2.有参构造时,底层也创建TreeMap对象 3.执行add方法 4.执行put方法 一、TreeSet基本介绍 TreeSet是 Java 集合框架…...
【idea技巧篇】idea的类注释和方法注释模版自定义设置
这块idea技巧虽然常用,谁没事会经常修改模版设置呢,一般是搭建开发环境的时候或者开发规范要求等设置一次就行了。用的虽然少,但几乎每次搭建环境都会用到,这里记录下并分享设置的过程已经发现的更高级的一些使用技巧。 注释模版…...
【Kubernetes① 基础】一、容器基础
目录 一、进程二、隔离与限制三、容器镜像总结参考书籍 一、进程 容器技术的兴起源于PaaS技术(平台即服务)的普及;Docker公司发布的Docker项目具有里程碑式的意义;Docker项目通过“容器镜像”解决了应用打包这个根本性难题(CloudFoundry)。 容器本身的价…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
