windows下可通过getperformanceinfo的committotal/commitlimit比值计算页面文件使用率,linux则无等效统一指标,需解析/proc/swaps或调用sysinfo()获取各swap分区使用率,二者语义与监控意义不同。

Windows下用 GetPerformanceInfo 读取页面文件使用率
Windows 没有直接返回“页面文件使用率”的 API,但 GetPerformanceInfo 能拿到当前已提交的虚拟内存总量(CommitTotal)和系统允许的最大提交量(CommitLimit),二者相除就是页面文件使用率的等效值——因为 Windows 的提交限制主要由物理内存 + 页面文件共同决定,且页面文件是提交空间的主要弹性来源。
实操注意点:
-
GetPerformanceInfo需要链接Psapi.lib,头文件为<psapi.h></psapi.h> - 调用前必须先用
sizeof(PERFORMACE_INFORMATION)初始化结构体大小字段cb,否则返回失败(GetLastError()为ERROR_INVALID_PARAMETER) - 返回的
CommitTotal和CommitLimit单位是页(通常 4KB),不是字节,别直接当字节数用 - 若
CommitLimit == 0,说明获取失败,应跳过计算
PERFORMANCE_INFORMATION pi = {0};
pi.cb = sizeof(pi);
if (GetPerformanceInfo(&pi, sizeof(pi))) {
if (pi.CommitLimit > 0) {
double usage = static_cast<double>(pi.CommitTotal) / pi.CommitLimit;
// usage ∈ [0.0, 1.0]
}
}</double>
Linux 下没有等效的“页面文件使用率”,只有 swapon -s 对应的内核指标
Linux 没有 Windows 那种统一的“提交空间”概念,swap 使用率是按每个 swap 分区/文件单独统计的,内核也不提供全局加权使用率。用户真正能拿到的,是 /proc/swaps 解析出的各 swap 区域 Used / Size 比值,或通过 sysinfo() 获取粗略的 si.freeswap 和 si.totalswap。
关键差异:
-
sysinfo()返回的是所有 swap 设备的总和,但精度低(单位是页,且totalswap可能含未激活区域) -
/proc/swaps是权威来源,但需自己解析文本——每行格式为filename\ttype\tsize\tused\tpriority,注意size和used单位是 KB - 不要用
free -h的输出做自动化判断,它的 “Swap used” 行可能把压缩内存(zswap)或 cgroup 限制混入,不反映真实磁盘 swap 利用
跨平台封装时,别试图统一“页面文件使用率”语义
Windows 的 CommitTotal/CommitLimit 实质是“系统虚拟内存压力”,而 Linux 的 swap 使用率只是“磁盘交换区占用”。两者动机、触发机制、监控意义都不同:前者关系到进程能否成功 VirtualAlloc,后者更多反映内存回收是否频繁写盘。
如果你在写监控工具,建议分开展示:
- Windows 标为 “Commit Usage” 或 “Virtual Memory Pressure”
- Linux 标为 “Swap Usage (per device)” 并列出各 swap 条目
- 绝对不要把 Linux 的
si.freeswap/si.totalswap直接套用到 Windows 场景做告警阈值——它们数值分布和敏感度完全不同
权限与稳定性风险:Windows 上 GetPerformanceInfo 不需要管理员权限,但 Linux 解析 /proc/swaps 要求进程能读该文件(通常没问题);sysinfo() 则始终可用
GetPerformanceInfo 在任意用户权限下调用都有效,这是它比 WMI 或 ETW 查询更轻量的原因。Linux 下 /proc/swaps 默认所有用户可读,但某些加固系统可能通过 hidepid 隐藏 —— 此时 fopen("/proc/swaps", "r") 会失败,需回退到 sysinfo()(尽管精度差)。
容易被忽略的一点:sysinfo() 在容器环境中可能返回宿主机值(取决于 cgroup v1/v2 和 kernel 版本),而 /proc/swaps 在容器里默认不可见(除非挂载了 host 的 /proc)。这意味着在 Kubernetes 等场景中,“swap 使用率”本身就是一个有歧义的指标。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











