)
机器学习深度学习数据可视化可观测性【免费下载链接】wandbThe AI developer platform. Use Weights Biases to train and fine-tune models, and manage models from experimentation to production.项目地址https://gitcode.com/gh_mirrors/wa/wandb点击查看免费下载导读numcpus是一个专注于系统有多少个 CPU这一基础问题的轻量 Go 库它把 Linux、BSD、Darwin、Solaris、Windows 各平台底层获取 CPU 拓扑信息的方式统一为六个语义明确的查询函数。本文以当前仓库中 vendor 化的 numcpus README 为主体结合其在 wandb 项目中作为间接依赖github.com/tklauser/numcpus v0.12.0见 go.mod的源码级实现讲解 online/offline/present/possible 等概念的准确含义、各平台实现机制与可运行的实战代码帮助你在自己的 Go 程序中正确处理 CPU 数量探测与并发度决策。numcpus 是什么只做一件事的 CPU 数量查询库numcpus包提供关于系统 CPU 数量的信息它不做监控、不做调度只回答一个精确的问题系统里有多少个 CPU以及它们处于什么状态。它在 Linux、Darwin、FreeBSD、NetBSD、OpenBSD、DragonflyBSD、Solaris/Illumos 以及 Windows 上分别返回 CPU 的 online在线、offline离线、present存在、possible可能、configured已配置与 kernel maximum内核上限六种计数。其包级文档见 numcpus.go明确了各平台的数据来源Linux读取/sys/devices/system/cpu下对应的 CPU 拓扑文件BSD 系含 Darwin读取hw.ncpu与hw.ncpuonlinesysctl若内核支持Windows调用GetActiveProcessorCount与GetMaximumProcessorCountSolaris/Illumos调用sysconf相关常量。并不是所有函数在所有平台都受支持不支持的平台上会返回ErrNotSupported。六种 CPU 计数的准确语义numcpus的核心价值在于它把CPU 数量这个看似简单的概念拆成了六个互不相同的维度。理解它们之间的差异是正确使用该库的前提。以下语义均来自 numcpus.go 中的函数文档函数返回内容平台支持GetConfigured()系统已配置的 CPU 数量Unix 下与getconf _SC_NPROCESSORS_CONF一致全平台GetKernelMax()内核配置允许的最大CPU 数量仅 Linux、WindowsGetOffline()离线CPU 数量即因热插拔关闭或超出内核上限而未在线的 CPU仅 LinuxGetOnline()在线且正在参与调度的 CPU 数量全平台GetPossible()可能的 CPU 数量即已分配资源、若存在即可被带上线的 CPU全平台GetPresent()系统中实际存在的 CPU 数量全平台对照 sysfs 拓扑文件可以更直观地理解这几层关系possible是硬件上电后系统可能使用的全部 CPU 范围present是已检测到的物理 CPUonline是其中当前被内核调度器使用的部分而offline则是possible减去online后因热插拔或内核参数限制而未在线的部分。GetKernelMax返回的则是编译/引导内核时配置的硬上限Linux 下对应/sys/devices/system/cpu/kernel_max文件。需要特别说明的是函数返回的错误ErrNotSupported在某个函数不被当前平台支持时返回定义于 numcpus.go例如在 Linux 之外的平台调用GetOffline其余错误通常来自底层系统调用或文件读取失败。列表 API不止计数还能拿到具体 CPU 编号除了返回数量的Get*系列numcpus还提供了返回[]int的List*系列可用于需要精确到具体 CPU 编号的场景ListOffline()→ 离线 CPU 编号列表ListOnline()→ 在线 CPU 编号列表ListPossible()→ 可能 CPU 编号列表ListPresent()→ 存在 CPU 编号列表。它们在 Linux 上解析 sysfs 中形如0-3,7的 CPU range 字符串实现见 numcpus_linux.go按逗号分段a-b展开为闭区间单个数字视为单元素若last first会返回错误。值得注意的是空文件被视作合法输入并返回空列表——例如系统没有离线 CPU 时/sys/devices/system/cpu/offline为空文件此时ListOffline()返回[]int{}而不是报错。各平台底层实现机制Linuxsysfs 文件 sched_getaffinityLinux 实现numcpus_linux.go是所有平台中最丰富的数据源是/sys/devices/system/cpu目录下的online、offline、possible、present、kernel_max文件GetConfigured通过os.ReadDir遍历目录统计所有cpu数字形式的子目录GetKernelMax读取kernel_max文件GetOnline有个值得一提的细节它优先调用unix.SchedGetaffinity(0, cpuSet)读取当前进程的 CPU 亲和性集合并返回cpuSet.Count()只有该调用失败时才回退到读取online文件见 numcpus_linux.go。从源码结构看这意味着在容器或 cgroup 限制、taskset指定亲和性的环境下GetOnline返回的是当前进程实际可用的 CPU 数而非宿主机的全部在线 CPU——这与runtime.NumCPU()GOMAXPROCS 初始值同样受 CPU 亲和性影响的语义是一致的对并发度决策更实用。BSD 系含 Darwinsysctlnumcpus_bsd.go 覆盖darwin、dragonfly、freebsd、netbsd、openbsdGetConfigured/GetPossible/GetPresent读取hw.ncpuGetOnline在 NetBSD/OpenBSD 上优先读hw.ncpuonline失败则回退到hw.ncpu其余平台直接读hw.ncpuGetKernelMax仅 FreeBSD 支持读取kern.smp.maxcpusGetOffline不支持返回ErrNotSupported。Windows处理器组 APInumcpus_windows.go 基于golang.org/x/sys/windowsGetConfigured/GetOnline/GetPossible/GetPresent均调用windows.GetActiveProcessorCount(windows.ALL_PROCESSOR_GROUPS)覆盖全部处理器组GetKernelMax调用windows.GetMaximumProcessorCountGetOffline返回ErrNotSupported。Solaris/Illumossysconfnumcpus_solaris.go 定义了取自/usr/include/sys/unistd.h的三个常量_SC_NPROCESSORS_CONF14、_SC_NPROCESSORS_ONLN15、_SC_NPROCESSORS_MAX516并通过unix.Sysconf查询GetConfigured/GetPossible/GetPresent返回_SC_NPROCESSORS_CONFGetOnline返回_SC_NPROCESSORS_ONLNGetKernelMax返回_SC_NPROCESSORS_MAXGetOffline不支持。实战代码完整可运行的查询示例原 README 给出的示例是入门入口这里将其完整保留并扩展为覆盖全部核心 API 的版本package main import ( fmt os github.com/tklauser/numcpus ) func main() { // 在线 CPU决定运行时并发度的关键指标 online, err : numcpus.GetOnline() if err ! nil { fmt.Fprintf(os.Stderr, GetOnline: %v\n, err) } fmt.Printf(online CPUs: %v\n, online) // 可能 CPU系统资源层面允许的最大可用数 possible, err : numcpus.GetPossible() if err ! nil { fmt.Fprintf(os.Stderr, GetPossible: %v\n, err) } fmt.Printf(possible CPUs: %v\n, possible) // 已配置 CPU与 getconf _SC_NPROCESSORS_CONF 一致 configured, err : numcpus.GetConfigured() if err ! nil { fmt.Fprintf(os.Stderr, GetConfigured: %v\n, err) } fmt.Printf(configured CPUs: %v\n, configured) // 存在 CPU实际检测到的物理 CPU 数 present, err : numcpus.GetPresent() if err ! nil { fmt.Fprintf(os.Stderr, GetPresent: %v\n, err) } fmt.Printf(present CPUs: %v\n, present) // 内核最大 CPU 数Linux/Windows 支持其他平台返回 ErrNotSupported kernelMax, err : numcpus.GetKernelMax() if err ! nil { fmt.Fprintf(os.Stderr, GetKernelMax: %v\n, err) } fmt.Printf(kernel max CPUs: %v\n, kernelMax) // 离线 CPU 数仅 Linux 支持 offline, err : numcpus.GetOffline() if err ! nil { fmt.Fprintf(os.Stderr, GetOffline: %v\n, err) } fmt.Printf(offline CPUs: %v\n, offline) // 列表 API拿到具体 CPU 编号 if list, err : numcpus.ListOnline(); err nil { fmt.Printf(online CPU list: %v\n, list) } if list, err : numcpus.ListPossible(); err nil { fmt.Printf(possible CPU list: %v\n, list) } }一个典型的多核 Linux 机器上输出类似online CPUs: 16 possible CPUs: 16 configured CPUs: 16 present CPUs: 16 kernel max CPUs: 8191 offline CPUs: 0 online CPU list: [0 1 2 ... 15] possible CPU list: [0 1 2 ... 15]注意kernel max通常远大于实际物理核数它代表内核配置的理论上限不应被当作可用核数使用。在 wandb 项目中的角色与引入方式在 wandb 仓库中numcpus以间接依赖indirect身份出现在 core/go.modgithub.com/tklauser/numcpus v0.12.0其完整源码被 vendor 到 core/vendor/github.com/tklauser/numcpus 目录下。这意味着它被 wandb-core 的某个依赖链引用为系统监控等场景提供跨平台的 CPU 数量探测能力作为使用方你也可以在任意 Go 项目中通过go get github.com/tklauser/numcpus直接引入它。该库代码量极小核心 API 集中在 numcpus.go 的 98 行内无外部运行时依赖仅依赖golang.org/x/sys非常适合作为工具库嵌入。它采用 Apache License 2.0 许可见 LICENSE。使用建议与注意事项不要忽略错误跨平台代码中ErrNotSupported是正常分支而非异常务必像示例中那样检查并处理err避免把 0 当作真实数量。区分六种语义报告机器有多少核用GetConfigured决定并发 worker 数量用GetOnlineLinux 下还会反映亲和性/cgroup 限制判断热插拔能力用GetPossible/GetOffline。平台差异先确认GetKernelMax仅 Linux/WindowsGetOffline仅 Linux编写跨平台逻辑时请先查阅各文件头的构建标签如 numcpus_bsd.go 的//go:build darwin || dragonfly || freebsd || netbsd || openbsd。Linux range 解析是安全的listCPURange对空文件返回空列表、对乱序 range 返回错误解析逻辑严谨可放心用于处理 sysfs 输出。在 wandb 仓库中深入阅读若想继续研究其实现细节可依次阅读 numcpus.goAPI 定义、numcpus_linux.goLinux 实现以及 numcpus_bsd.go、numcpus_windows.go、numcpus_solaris.go 三个平台实现文件。总结numcpus以极小的 API 面解决了系统有多少 CPU这一高频基础需求其六种计数语义 四种列表接口 多平台统一实现使其成为系统工具、监控采集与运行时资源探测的理想选择。理解其各平台数据来源与ErrNotSupported语义你就能在 wandb 这类跨平台项目中可靠地做出并发度与资源相关的决策。赞分享机器学习深度学习数据可视化可观测性【免费下载链接】wandbThe AI developer platform. Use Weights Biases to train and fine-tune models, and manage models from experimentation to production.项目地址https://gitcode.com/gh_mirrors/wa/wandb点击查看免费下载相关推荐KubeEdge 依赖解析numcpus 库如何跨平台获取系统 CPU 数量KubeEdge 依赖解析numcpus 库如何跨平台获取系统 CPU 数量 本文以 KubeEdge 仓库中 vendored 的第三方库 github.c云原生边缘计算物联网容器编排边缘网关inngest 依赖剖析用 tklauser/numcpus 精确获取系统 CPU 数量inngest 依赖剖析用 tklauser/numcpus 精确获取系统 CPU 数量 导读 本篇文章以 inngest 仓库中 vendored 的 Go后端任务调度工作流自动化微服务跨平台 CPU 数量检测深入解析 numcpus Go 库的实现原理与实战用法跨平台 CPU 数量检测深入解析 numcpus Go 库的实现原理与实战用法 导读 在高并发扫描器、资源池调度与系统监控类程序中准确获取宿主机的 CPU网络安全漏洞扫描渗透测试应用安全上一篇Python Twitter API多媒体处理终极指南图片上传与推文发布完整教程下一篇AI-Trader快速上手指南3分钟让AI代理跑通全自动智能交易创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考