结合automaxprocs理解cgroups

news/2025/1/15 20:34:35/文章来源:https://www.cnblogs.com/cheyunhua/p/18412228

源码地址

总结

必须使用类似的方法设置容器中的核心数,通过runtime.GOMAXPROCS可能会和容器限制核心数不符
/proc/self下是当前进程的信息
/proc/self/cgroup 当前进程的cgroup信息
如下

11:freezer:/
10:memory:/
9:pids:/
8:blkio:/
7:hugetlb:/
6:devices:/
5:net_prio,net_cls:/
4:cpuset:/
3:cpuacct,cpu:/
2:perf_event:/
1:name=systemd:/user.slice/user-1000.slice/session-25788.scope

/proc/self/mountinfo 当前进程的挂载信息
如下

26 25 0:22 / /sys/fs/cgroup/systemd rw,nosuid,nodev,noexec,relatime shared:9 - cgroup cgroup rw,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd
27 18 0:23 / /sys/fs/pstore rw,nosuid,nodev,noexec,relatime shared:20 - pstore pstore rw
28 25 0:24 / /sys/fs/cgroup/perf_event rw,nosuid,nodev,noexec,relatime shared:10 - cgroup cgroup rw,perf_event
29 25 0:25 / /sys/fs/cgroup/cpu,cpuacct rw,nosuid,nodev,noexec,relatime shared:11 - cgroup cgroup rw,cpuacct,cpu
30 25 0:26 / /sys/fs/cgroup/cpuset rw,nosuid,nodev,noexec,relatime shared:12 - cgroup cgroup rw,cpuset
31 25 0:27 / /sys/fs/cgroup/net_cls,net_prio rw,nosuid,nodev,noexec,relatime shared:13 - cgroup cgroup rw,net_prio,net_cls
32 25 0:28 / /sys/fs/cgroup/devices rw,nosuid,nodev,noexec,relatime shared:14 - cgroup cgroup rw,devices
33 25 0:29 / /sys/fs/cgroup/hugetlb rw,nosuid,nodev,noexec,relatime shared:15 - cgroup cgroup rw,hugetlb
34 25 0:30 / /sys/fs/cgroup/blkio rw,nosuid,nodev,noexec,relatime shared:16 - cgroup cgroup rw,blkio
35 25 0:31 / /sys/fs/cgroup/pids rw,nosuid,nodev,noexec,relatime shared:17 - cgroup cgroup rw,pids
36 25 0:32 / /sys/fs/cgroup/memory rw,nosuid,nodev,noexec,relatime shared:18 - cgroup cgroup rw,memory
37 25 0:33 / /sys/fs/cgroup/freezer rw,nosuid,nodev,noexec,relatime shared:19 - cgroup cgroup rw,freezer

根据把/self/proc/cgroup中的路径翻译成/self/proc/mountinfo中的
比如cpu就是/sys/fs/cgroup/cpu

这边需要读取/sys/fs/cgroup/cpu/cpu.cfs_period_us和/sys/fs/cgroup/cpu/cpu.cfs_quota_us

而cfs_quota_us/cfs_period_us就是核数

首先看到使用方式

import _ "go.uber.org/automaxprocs"func main() {// Your application logic here.
}

automaxprocs.go 中

func init() {maxprocs.Set(maxprocs.Logger(log.Printf))
}

maxprocs/maxprocs.go中

func Set(opts ...Option) (func(), error) {cfg := &config{procs:         iruntime.CPUQuotaToGOMAXPROCS,minGOMAXPROCS: 1,}...maxProcs, status, err := cfg.procs(cfg.minGOMAXPROCS)if err != nil {return undoNoop, err}...
}

internal/runtime/cpu_quota_linux.go中

func CPUQuotaToGOMAXPROCS(minValue int) (int, CPUQuotaStatus, error) {cgroups, err := cg.NewCGroupsForCurrentProcess()...quota, defined, err := cgroups.CPUQuota()...
}

internal/cgroups/cgroups.go中

const (_procPathCGroup    = "/proc/self/cgroup"_procPathMountInfo = "/proc/self/mountinfo"
)func NewCGroupsForCurrentProcess() (CGroups, error) {return NewCGroups(_procPathMountInfo, _procPathCGroup)
}func NewCGroups(procPathMountInfo, procPathCGroup string) (CGroups, error) {cgroupSubsystems, err := parseCGroupSubsystems(procPathCGroup)if err != nil {return nil, err}cgroups := make(CGroups)newMountPoint := func(mp *MountPoint) error {if mp.FSType != _cgroupFSType {return nil}...cgroupPath, err := mp.Translate(subsys.Name)...}parseMountInfo(procPathMountInfo, newMountPoint)
}func (cg CGroups) CPUQuota() (float64, bool, error) {cpuCGroup, exists := cg[_cgroupSubsysCPU]if !exists {return -1, false, nil}cfsQuotaUs, err := cpuCGroup.readInt(_cgroupCPUCFSQuotaUsParam)if defined := cfsQuotaUs > 0; err != nil || !defined {return -1, defined, err}cfsPeriodUs, err := cpuCGroup.readInt(_cgroupCPUCFSPeriodUsParam)if err != nil {return -1, false, err}return float64(cfsQuotaUs) / float64(cfsPeriodUs), true, nil
}

internal/cgroups/mountpoint.go中


func NewMountPointFromLine(line string) (*MountPoint, error) {...
}// parseMountInfo parses procPathMountInfo (usually at `/proc/$PID/mountinfo`)
// and yields parsed *MountPoint into newMountPoint.
func parseMountInfo(procPathMountInfo string, newMountPoint func(*MountPoint) error) error {...mountPoint, err := NewMountPointFromLine(scanner.Text())newMountPoint(mountPoint)...
}func (mp *MountPoint) Translate(absPath string) (string, error) {...return filepath.Join(mp.MountPoint, relPath), nil
}
// NewCGroup returns a new *CGroup from a given path.
func NewCGroup(path string) *CGroup {return &CGroup{path: path}
}// readInt parses the first line from a cgroup param file as int.
func (cg *CGroup) readInt(param string) (int, error) {text, err := cg.readFirstLine(param)if err != nil {return 0, err}return strconv.Atoi(text)
}



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

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

相关文章

清理C盘缓存,超简单的清理C盘缓存清理方法

清理C盘缓存是优化Windows系统性能的重要步骤,以下是一些超简单的清理C盘缓存的方法:使用磁盘清理工具 步骤: 右键点击C盘(系统盘),选择“属性”。 在C盘属性窗口中,点击“磁盘清理”按钮。 系统会分析C盘上的文件,并列出可以删除的文件类型。 勾选你想要删除的文件类型…

Pytorch安装(GPU_Windows,安装过CPU版的想再次安装GPU)

看过我之前那篇【Pytorch安装 CPU版本】的朋友应该知道,Pytorch安装步骤很复杂。但是其实弄清楚整个逻辑会简单很多,本篇为PytorchGPU安装。如果有朋友跟着我之前的帖子安装过的,想再安装一个GPU的,可以跟着我一起安装一下。我会把我遇到的坑以及经验都给大家分享一下。 Py…

STM32F103C8T6软件安装

本教程参考b站视频教程(STM32入门教程-2023版 细致讲解 中文字幕,第三集P3软件安装),将从一下几个方面进行安装: 1.安装Keil5 MDK软件 2.安装器件支持包 3.软件注册 4.安装ST-LINK驱动 5.安装USB转串口驱动 一、安装Keil5 MDK软件 找到软件的下载链接:https://jiangxieke…

基于pikachu靶场的水平越权详解

1. pikachu靶场搭建 如果你在之前已经使用过phpstudy了,参考pikachu 靶场环境搭建 如果没有,参考pikachu 靶场搭建 如果在靶场搭建中遇到一些问题,参考皮卡丘靶场搭建遇到的问题大全 2. 水平越权简介 水平越权是指攻击者通过获取与自己拥有相同权限级别的其他用户的访问权限…

如何实现两个机器时间同步-计算rtt+offset

背景: 之前的项目大致可以分为两层,逻辑层和设备层,运行在同一个主机上。最近在着手搭建一个仿真平台,在另外一台主机上部署机器人机器相关硬件设备,比如陀螺仪,轮机,雷达等。 由于两台主机的时间戳不同步问题,导致定位系统有问题,为此需要实现两个主机的时间同步。 具…

C# 操作xml(转)

四、xml 1、概念:XML可扩展的标记语言类似于HTML XML:存储数据 注意: XM工是严格区分大小写的。 XML标签也是成对出现的。 2、通过代码来创建xML文档 1、引用命名空间 using System.Xml; 2、创建XML文档对象 XmlDocument doc = new XmlDocument(); 3、创建第一行描述信息,并且…

代码随想录突击版刷题

704.二分查找 https://leetcode.cn/problems/binary-search/description/ 59.螺旋矩阵IIhttps://leetcode.cn/problems/spiral-matrix-ii/description/、 参考题解写出54.螺旋矩阵https://leetcode.cn/problems/spiral-matrix/description/class Solution { public:vector<i…

高精地图(HD map)的简单介绍

高精度语义地图的动态构建-HDMapNet - 知乎 (zhihu.com)

fastDFS - 单机部署 + nginx

准备查看操作系统的版本信息[root@lab10 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)查看操作系统的网卡地址[root@lab10 ~]# ip address show ens32 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group def…