拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门