首页/新闻资讯/正文详情

procfs 实战指南:在 Go 中读取 /proc 与 /sys 伪文件系统的系统、内核与进程指标

发布时间:2026/9/24 16:47:54 来源:云帆数科 栏目:资讯中心
procfs 实战指南:在 Go 中读取 /proc 与 /sys 伪文件系统的系统、内核与进程指标
云原生存储【免费下载链接】distributionThe toolkit to pack, ship, store, and deliver container content项目地址https://gitcode.com/gh_mirrors/dis/distribution点击查看免费下载本指南以 vendor/github.com/prometheus/procfs/README.md 为骨架结合该库在 distribution 仓库中 vendor 的完整源码系统讲解如何用 Go 从 Linux 的/proc与/sys伪文件系统中读取系统、内核和进程指标。读完本文你将掌握FS类型的使用方式、根包与子包的划分原则、进程指标的读取 API以及如何运行测试并维护其 ttar 测试夹具。1. 包定位面向 /proc 与 /sys 的指标读取库procfs 是一个纯 Go 库其职责是从 Linux 的两个核心伪文件系统——/proc与/sys——中读取系统、内核和进程指标。在 Linux 中/proc暴露进程列表、CPU/内存统计、网络连接等内核数据结构/sys则暴露设备、块设备、内核参数等系统信息二者共同构成了用户态程序观察内核状态的窗口。该库在 README.md 中明确声明This package provides functions to retrieve system, kernel, and process metrics from the pseudo-filesystems /proc and /sys.其典型消费场景包括监控与可观测性系统如 Prometheus 生态的各类 exporter、容器运行时、系统诊断工具。本仓库将其以 vendor 依赖形式引入供指标采集类功能使用库本身不产生可分发二进制而是作为其他应用程序的一部分被编译。需要特别注意的是README 同时给出了明确警告该包仍处于工作进展work in progress状态API 可能在无任何提示的情况下发生不向后兼容的破坏使用者需自担风险。这意味着依赖它时建议锁定版本升级前务必查看变更记录。2. 包组织原则按数据来源与信息类型分层README 给出了包划分的两条准则按数据来源划分数据来自/proc、/sys还是两者皆有按信息类型划分获取的是哪一类信息。绝大多数进程信息都可以通过根包procfs中的函数获得例如 CPU 统计来自/proc/stat而像磁盘这类块设备的信息则由子包提供README 中提到的blockdevice子包需要通过/proc与/sys两个挂载点初始化。从当前仓库 vendored 的实际目录结构看包内除根包文件外还包含两个 internal 子包internal/fs/fs.go定义底层FS类型与各伪文件系统的默认挂载点常量internal/util提供读取与解析辅助函数。需要说明的是README 中示例涉及的blockdevice子包在当前 vendored 版本中并未出现根包下直接以blockdevice相关需求对应的能力目前仅体现在 README 的 API 示例中——这正印证了上文工作进展、API 可能变动的警告。阅读该库源码时应以实际 vendored 目录为准。3. 快速上手FS 类型与最简调用链README 给出的最小示例展示了库的核心抽象——每个包都包含一个代表/proc、/sys或两者路径的FS类型fs, err : procfs.NewFS(/proc) stats, err : fs.Stat()第一步通过NewFS(/proc)初始化 proc 文件系统的挂载点第二步调用fs.Stat()读取/proc/stat中的统计信息。从源码看这个调用链背后做了两件事见 fs.go调用fs.NewFS(mountPoint)校验挂载点——路径必须存在且是一个目录否则返回错误调用isRealProc(mountPoint)判定该挂载点是否指向真实 proc 文件系统。FS结构体本身很轻量见 fs.gotype FS struct { proc fs.FS isReal bool }底层fs.FS只是一个字符串类型的路径包装见 internal/fs/fs.goPath方法通过filepath.Join拼接路径元素NewFS则负责校验挂载点。此外根包还导出了两个便捷常量DefaultMountPoint /procproc 文件系统的常见挂载点SectorSize 512Linux 块 I/O 的扇区大小字节。如果你使用的是默认挂载点可以省略参数直接用NewDefaultFS()见 fs.go。3.1 Stat 结构体一次拿到全系统统计fs.Stat()返回的Stat结构体见 stat.go聚合了/proc/stat中的关键字段字段含义BootTime自 Unix 纪元起的开机时间秒CPUTotal/CPU汇总的 CPU 统计 / 按 CPU 编号区分的统计IRQTotal/IRQ中断处理总次数 / 各编号 IRQ 触发次数ContextSwitches上下文切换次数ProcessCreated已创建的进程数ProcessesRunning/ProcessesBlocked当前运行 / 阻塞等待 I/O的进程数SoftIRQTotal/SoftIRQsoftirq 调度总次数 / 详细分类统计单个 CPU 的统计由CPUStat承载包含User、Nice、System、Idle、Iowait、IRQ、SoftIRQ、Steal、Guest、GuestNice十个阶段耗时字段见 stat.go。行解析通过fmt.Sscanf按/proc/stat的固定列格式完成见 stat.go解析失败会返回包装了ErrFileParse的错误。SoftIRQStat则细分了Hi、Timer、NetTx、NetRx、Block、Tasklet、Sched、Hrtimer、Rcu等 softirq 类别若需按 CPU 查看可另行读取/proc/softirqs。4. 进程指标从 /proc 读取单个进程与全部进程根包提供了三条面向进程的顶层便捷函数见 proc.gop, err : procfs.Self() // 当前进程经由 /proc/self 解析 p, err : procfs.NewProc(pid) // 指定 PID 的进程 procs, err : procfs.AllProcs() // 当前所有进程的列表它们都基于默认挂载点NewFS(DefaultMountPoint)初始化然后委托给FS的方法。FS.Self()的实现很有技巧先Readlink读取/proc/self这个符号链接解析出当前 PID 后再构造进程对象见 proc.goFS.AllProcs()则直接枚举/proc目录下所有纯数字命名的条目作为 PID见 proc.go。Proc结构体只保存 PID 和对FS的引用见 proc.go所有具体数据都按需从对应的/proc/[pid]/文件读取。例如cmdline, err : p.CmdLine() // 读取 /proc/[pid]/cmdline按 \x00 分割参数 status, err : p.Status() // 读取 /proc/[pid]/status解析内存与状态字段CmdLine()的实现会先去除结尾的空字节再按\x00分隔参数见 proc.go。ProcStatus结构体见 proc_status.go则完整映射了/proc/[pid]/status中的字段包括Name、PID、TGID、命名空间 PID 列表NSpids以及一整套内存统计VmPeak峰值虚拟内存、VmSize虚拟内存、VmRSS常驻内存集等于RssAnon、RssFile、RssShmem之和、VmData、VmStk等。Procs类型实现了sort.Interface可直接按 PID 排序见 proc.go。根包还提供了大量针对/proc单个文件的读取方法从仓库文件即可一窥覆盖面loadavg.go系统负载、meminfo.go内存信息、cpuinfo.goCPU 详情含x86、arm、mips、ppc、s390x等平台变体、net_dev.go与net_tcp.go等网络统计、mdstat.go软 RAID、swaps.go交换分区、buddyinfo.go内存碎片、zoneinfo.go、slab.goslab 缓存、softirqs.go、interrupts.go等。每个文件对应一个结构化的读取函数模式高度一致初始化FS→ 读取伪文件 → 解析为结构化数据。5. 跨文件系统数据同时初始化 /proc 与 /sys有些信息同时依赖两个伪文件系统。README 以块设备为例展示了这种用法fs, err : blockdevice.NewFS(/proc, /sys) stats, err : fs.ProcDiskstats()这类子包需要同时传入/proc与/sys两个挂载点ProcDiskstats()则负责读取/proc/diskstats中的磁盘统计。这种双挂载点初始化的设计体现了第 2 节的组织原则凡数据来源跨/proc与/sys的信息都会被独立成子包而不是塞进根包。6. 构建与测试make test 与 ttar 夹具维护procfs 被设计为其他应用的组成部分因此没有可分发二进制但它拥有完善的单元测试可以通过make test运行。测试依赖一套从真实/proc、/sys文件系统中摘录的样例文件作为夹具这些夹具以 ttar 归档形式打包在仓库中当前 vendored 版本中为 ttar 文件测试时会自动解压。6.1 更新测试夹具的标准流程README 给出了维护夹具的完整流程。当需要新增或修改测试数据时rm -rf testdata/fixtures make test第一步删除旧的testdata/fixtures目录make test会触发 Makefile 中的规则如果.unpacked标记文件缺失就用随库分发的ttar工具解压fixtures.ttar并打上标记%/.unpacked: %.ttar。因此删掉目录后重新make test即可得到一份全新的、可编辑的夹具目录。然后对testdata/fixtures中的文件做所需修改最后重新打包并校验差异make update_fixtures git diff testdata/fixtures.ttarupdate_fixtures目标见 Makefile会先删除.unpacked标记再用ttar以testdata/fixtures/为内容重新生成fixtures.ttar。由于.unpacked标记被删除下一次make test会再次触发解压保证测试数据与归档始终同步。最后通过git diff人工确认归档变更符合预期。这套归档 标记文件的机制确保了夹具在每次测试时都能从 ttar 中可复现地解压既避免了把大量样例文件直接提交进版本库也保证了测试环境的确定性。7. 使用前提与限制基于仓库源码使用该库时有几点需要注意仅适用于 Linux/proc与/sys是 Linux 特有的伪文件系统在其他操作系统上无法工作挂载点校验NewFS要求挂载点路径存在且为目录见 internal/fs/fs.go在容器或 chroot 环境中若/proc未被正确挂载初始化将直接失败API 不稳定README 明确提示包仍处于 WIP 状态接口可能在无警告的情况下破坏性变更升级依赖前应阅读版本变更说明文件即数据所有指标均为按需解析读取单个文件如cmdline、status代价很低但AllProcs()之类的全量枚举会扫描整个/proc目录在高 PID 密度场景下应控制调用频率。8. 在 distribution 仓库中的定位本仓库distribution通过 vendor 机制将 procfs 锁定在 vendor/github.com/prometheus/procfs 下与go.mod中的依赖版本一一对应。它属于指标采集与观测能力的底层支撑当需要从运行中的系统获取 CPU、内存、进程或块设备等内核级数据时procfs.NewFS(...)与fs.Stat()这套 API 即是最直接的入口。理解它的包组织与读取模式有助于在排查系统指标异常或扩展观测功能时快速定位对应的伪文件与解析函数。参考文件索引均以仓库根目录为起点文档主体vendor/github.com/prometheus/procfs/README.mdFS 类型与挂载点常量vendor/github.com/prometheus/procfs/fs.go、vendor/github.com/prometheus/procfs/internal/fs/fs.go系统统计解析vendor/github.com/prometheus/procfs/stat.go进程 APIvendor/github.com/prometheus/procfs/proc.go、vendor/github.com/prometheus/procfs/proc_status.go测试与夹具机制vendor/github.com/prometheus/procfs/Makefile赞分享云原生存储【免费下载链接】distributionThe toolkit to pack, ship, store, and deliver container content项目地址https://gitcode.com/gh_mirrors/dis/distribution点击查看免费下载相关推荐procfs 库完全指南从 /proc 与 /sys 伪文件系统读取系统指标Prometheus 生态 Go 实现procfs 库完全指南从 /proc 与 /sys 伪文件系统读取系统指标Prometheus 生态 Go 实现 导读 procfs 是 Prometh云原生集群管理虚拟化多集群Kubetap 的 mitmproxy 代理镜像剖析Dockerfile、入口脚本与 ConfigMap 注入全解读Kubetap 的 mitmproxy 代理镜像剖析Dockerfile、入口脚本与 ConfigMap 注入全解读 Kubetap 是一款 kubectl构建工具云原生后端prometheus/procfs 使用指南用 Go 读取 /proc 与 /sys 的内核与进程指标prometheus/procfs 使用指南用 Go 读取 /proc 与 /sys 的内核与进程指标 本指南围绕 kOps 仓库 vendor 目录中随附的云原生集群管理运维IaC上一篇探索Django Pandas数据科学家的利器下一篇CANN Runtime 数据类型参考25-05 Typedefs 全部 24 个 typedef 类型详解与源码定位创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

PiKVM 与 Prometheus 集成:通过 /api/export/prometheus/metrics 监控 ATX、GPIO 与硬件健康状态
PiKVM 与 Prometheus 集成:通过 /api/export/prometheus/metrics 监控 ATX、GPIO 与硬件健康状态

文档教程 【免费下载链接】pikvm Open and inexpensive DIY IP-KVM based on Raspberry Pi 项目地址: https://gitcode.com/gh_mirrors/pi/pikvm 点击查看 免费下载 PiKVM(基于 Raspberry Pi 的开源 DIY IP-KVM)内置了对 Prometheus 监控系统… · 2026/9/24 16:47:48

Flask Celery 异步视图支持与异步任务队列
Flask Celery 异步视图支持与异步任务队列

Flask 是一款轻量级 Web 框架,因其简洁和易用性受到广泛欢迎。在现代 Web 应用开发中,异步编程成为提升性能的关键手段,尤其是在处理高并发请求和后台任务时。然而,Flask 原生并非为异步设计,如何在其中引入 async/await 支持,以及如何借助 Celery 构建任务队列,是提高 … · 2026/9/24 16:47:40

Netty 4.1 使用 Protobuf 传输数据:itstack-demo-netty 中级拓展篇二实战解析
Netty 4.1 使用 Protobuf 传输数据:itstack-demo-netty 中级拓展篇二实战解析

文档教程后端 【免费下载链接】CodeGuide :books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、… · 2026/9/24 16:47:31

数字化工业软件全面AI解决方案
数字化工业软件全面AI解决方案

重塑从设计、仿真到PLM的空华品国邮智能研发新范式产品越来越复杂,合规、协同压力拉满,传统研发陷入效率低、周期长、成本高的困境怎么办?西门子数字化工业软件全面的 AI 解决方案,重塑从设计、仿真到 PLM 的全生命周期智能研发新… · 2026/9/24 17:28:29

【C++】005 C++进阶实战:从.h到.cpp,手把手带你吃透运算符重载(附完整代码)
【C++】005 C++进阶实战:从.h到.cpp,手把手带你吃透运算符重载(附完整代码)

好,我们书接上回,继续讲解C类和对象(中)的相关内容。5.2 赋值运算符重载赋值运算符有一个默认成员函数,用于完成两个已经存在的对象直接的拷贝赋值,这里要注意跟拷贝构造区分,拷贝构造用于一个对… · 2026/9/24 17:28:29

AI助学系统案例复盘:从视频字幕问答到课程上下文 AI 助手的设计与落地
AI助学系统案例复盘:从视频字幕问答到课程上下文 AI 助手的设计与落地

AI助学系统案例复盘:从视频字幕问答到课程上下文 AI 助手的设计与落地 项目定位: 面向在线视频课程自主学习场景,探索如何利用大语言模型能力降低学习过程中的上下文准备成本,构建一个能够理解课程背景、结合视频内容和学习过程进… · 2026/9/24 17:28:29

阿里云 Windows ECS 使用教程
阿里云 Windows ECS 使用教程

下面是一份适用于阿里云 Windows ECS IIS ASP.NET Core Vue SQLite的部署手册。假设你的项目是 MusicStudy,正式访问地址为: https://music.example.com 服务器内部让 ASP.NET Core 运行在: http://127.0.0.1:5080 用户只通过 IIS 的 8… · 2026/9/24 17:28:29

FreeRTOS源码---list 和 queue
FreeRTOS源码---list 和 queue

数据结构的基石 链表头 FreeRTOS 的所有内核对象(任务、队列、事件组等)都通过 List_t 组织。它本质上是一个 带哨兵节点的双向循环链表,并且链表中的元素按 xItemValue 升序排列。 //list.h typedef struct xLIST {listFIRST_LIST_INTEGRITY_CHECK_VALUE /**< S… · 2026/9/24 17:28:29

BA | 一周速学业务与系统框架
BA | 一周速学业务与系统框架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 17:28:23

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介&#xff1a;这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源&#xff0c;围绕YOLOv8实现渔船作业监控系统&#xff0c;可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件&#xff0c;约24.21MB&#xff0c;以70个Python源码文件为… · 2026/9/24 0:00:13

1D-CNN时间序列建模实战:从Conv1d原理到工业落地
1D-CNN时间序列建模实战:从Conv1d原理到工业落地

简介&#xff1a;面向时间序列数据建模的一维卷积神经网络完整实现&#xff0c;适合深度学习入门者及需要快速验证时序模型的研究者&#xff0c;能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小&#xff0c;只有3KB&#xff0c;内含3个Python脚… · 2026/9/24 0:00:26

柔软的L:汉语语流中被忽视的舌肌张力控制
柔软的L:汉语语流中被忽视的舌肌张力控制

1. 这个“L”不是字母表里的L&#xff0c;而是舌尖上的L最近在几个方言群和语音教学社群里&#xff0c;反复看到有人发一句&#xff1a;“也说字母L&#xff1a;柔软的长舌”。初看以为是英语发音课笔记&#xff0c;点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码