linux下需两次读取/proc/stat中cpu行各字段做差值计算非空闲占比,windows调用getsystemtimes获取系统时间并换算,跨平台封装须避免硬编码采样间隔、忽略权限检查及误用核数接口。

Linux下读取/proc/stat计算全局CPU利用率
Linux没有直接返回“总CPU负载比例”的系统调用,最可靠的方式是两次读取/proc/stat中cpu行的各时间字段(user、nice、system、idle、iowait、irq、softirq),做差值后算出非空闲占比。注意:这里必须采样两次,间隔至少100ms,否则结果为0或失真。
关键点:
-
user+nice+system+irq+softirq是“忙时间”,idle+iowait是“空闲时间”(严格说iowait不算真正空闲,但主流监控工具如top默认将其计入idle) - 不要忽略
steal和guest字段(虚拟化环境可能非零),若存在应加到忙时间里 - 单次读取
/proc/stat无法得出利用率——它只提供自启动以来的累加值
Windows下用GetSystemTimes获取整体CPU占用
Windows需调用GetSystemTimes(仅支持Win7+),它返回三个FILETIME:空闲时间、内核时间(含idle)、用户时间。注意:内核时间包含空闲时间,所以实际忙时间为kernel - idle + user。
常见坑:
- 必须以管理员权限运行,否则
GetSystemTimes返回FALSE且GetLastError()为ERROR_ACCESS_DENIED -
FILETIME是100纳秒单位,需转为毫秒或微秒再做减法,直接相减易溢出(建议转成ULARGE_INTEGER) - 该API不区分逻辑核,返回的是全系统总时间,符合“总CPU负载”需求
C++跨平台封装时避免的典型错误
写一个get_cpu_load()函数时,最容易错的是把“两次采样间隔”硬编码为1秒——这会导致在高负载突变场景下响应滞后;或者没处理采样失败(如/proc/stat被删、权限不足),直接用旧值计算导致结果跳变。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
实操建议:
- 首次调用返回
-1.0(无效值),强制要求至少一次完整采样周期 - 用
std::chrono::steady_clock控制间隔,而非sleep,避免被系统调度拉长等待 - Linux路径检查:
access("/proc/stat", R_OK);Windows检查:GetSystemTimes返回值 +GetLastError() - 不要用
std::thread::sleep_for替代采样间隔逻辑——它不保证精度,且阻塞主线程
为什么不用sysconf(_SC_NPROCESSORS_ONLN)或std::thread::hardware_concurrency()
这两个接口只返回逻辑CPU数量,不是负载。有人误以为“当前活跃线程数 / 总核数 = CPU使用率”,这是完全错误的:一个满载的单线程程序在4核机器上也能跑出100%单核占用,但总CPU负载是25%,而操作系统级统计仍是接近100%(因该核100% busy)。
更危险的是,hardware_concurrency()可能返回0(实现未定义),或返回超线程数(如8核16线程),与真实物理负载无直接关系。
真正的系统级总CPU负载,必须基于时间片累加统计,而不是线程/进程计数。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










