windows下用getperformanceinfo通过committotal/commitlimit比值计算页面交换文件利用率,反映提交空间占用率而非磁盘i/o;linux读/proc/meminfo中swaptotal与swapfree计算swap使用率,二者语义不同需平台条件编译。

Windows下用GetPerformanceInfo获取页面交换文件利用率
Windows没有直接暴露“页面交换文件利用率”的API,但GetPerformanceInfo能返回当前提交的页面文件总量(CommitTotal)和系统总提交限额(CommitLimit),二者相除就是实际使用的页面文件比例——这等价于用户常说的“页面交换文件利用率”。注意:它反映的是整个提交空间(含物理内存+分页文件)的占用率,不是纯分页文件的I/O使用率。
实操要点:
-
GetPerformanceInfo需链接Psapi.lib,头文件为<psapi.h></psapi.h> - 调用前必须先用
sizeof(SYSTEM_PERFORMANCE_INFORMATION)初始化结构体大小字段cb,否则返回ERROR_INVALID_PARAMETER - 返回的
CommitTotal和CommitLimit单位是页(通常4KB),需转为字节再计算百分比 - 该API不需管理员权限,但结果延迟约1秒,不适合高频轮询
Linux下读取/proc/meminfo计算Swap使用率
Linux没有“页面交换文件利用率”这个概念,只有Swap分区/文件的使用情况,对应/proc/meminfo中的SwapTotal和SwapFree。物理内存限额则由MemTotal决定,但注意:Linux的“物理限额”不是硬性上限,而是可用RAM总量;真正影响进程提交的是CommitLimit(在/proc/sys/vm/overcommit_memory为0或1时生效)。
实操建议:
- 用
std::ifstream打开/proc/meminfo,逐行匹配SwapTotal:、SwapFree:、MemTotal:三行 - 每行格式为
Key: 123456 kB,需跳过冒号后空格并提取数值,单位统一为kB - Swap利用率 =
(SwapTotal - SwapFree) * 100.0 / SwapTotal,若SwapTotal == 0则视为未启用Swap - 不要依赖
/proc/sys/vm/commit_memory——它只控制策略,不提供实时限额值
跨平台无法直接获取“物理限额”,需区分语义
所谓“物理限额”在不同系统含义不同:Windows指CommitLimit(物理内存 + 所有分页文件大小),Linux中无等价字段,MemTotal只是物理RAM容量,而实际可提交内存受vm.overcommit_ratio和overcommit_memory共同影响。试图用同一套逻辑跨平台会出错。
关键区别:
- Windows的
CommitLimit是精确值,可直接从GetPerformanceInfo拿到 - Linux的
CommitLimit需手动计算:CommitLimit = MemTotal * overcommit_ratio / 100 + SwapTotal(仅当overcommit_memory == 2时有效) -
cat /proc/sys/vm/overcommit_memory返回0(启发式)、1(总是允许)、2(严格限制),只有2才让CommitLimit有意义 - C++程序若需跨平台,必须按OS分支处理,不能抽象成统一接口
常见错误:混淆“提交用量”与“分页文件I/O”
很多开发者误以为“页面交换文件利用率”是指分页文件的磁盘读写繁忙度(类似iostat里的%util),但操作系统API根本不提供这个指标。所有主流系统返回的都是内存提交层面的用量,而非磁盘I/O负载。
典型误操作:
- 在Windows上尝试用
QueryDosDevice查pagefile.sys路径,再用GetDiskFreeSpaceEx算磁盘占用——这得到的是文件大小,不是内存提交使用率 - 在Linux上监控
/sys/block/*/stat或/proc/diskstats来算Swap设备忙时——这反映的是底层块设备活动,和内存管理无直接关系 - 把
GetPerformanceInfo的AvailablePages当作剩余物理内存——它其实是未分配的物理页帧数,不含被缓存占用的部分
真正需要I/O级指标时,得走PerfMon(Windows)或iostat -x(Linux),而不是内存API。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











