最可靠的方式是直接解析/proc/meminfo中的swaptotal和swapfree字段(单位kb),计算(swaptotal-swapfree)*100.0/swaptotal;需先判断swaptotal>0避免除零,且不可用committed_as替代。

Linux下读/proc/meminfo算Swap使用率最可靠
直接解析 /proc/meminfo 是唯一稳定、无需额外权限、不依赖命令行工具的方式。它提供 SwapTotal: 和 SwapFree: 两行,单位都是 KB,真实反映当前激活的 swap 总容量和剩余容量。
常见错误是误用 free -h 输出或 /proc/swaps ——前者格式易受 locale 影响,后者只列设备不保证实时汇总;/proc/meminfo 是内核维护的单一权威来源。
-
SwapTotal包含所有已激活的 swap 分区 + swapfile + zram 容量(zram 已计入) -
SwapFree是真正未被使用的 swap 空间,不是“可用”而是“空闲” - 计算公式为:
(SwapTotal - SwapFree) * 100.0 / SwapTotal,结果范围是 0.0–100.0 - 若
SwapTotal == 0,说明系统没启用任何 swap,应跳过计算并返回 0 或标记不可用
别把Committed_AS当Swap使用率
/proc/meminfo 里还有 Committed_AS 和 CommitLimit,它们反映的是内核对“虚拟内存提交压力”的估算,语义接近 Windows 的 CommitTotal/CommitLimit,但和磁盘 swap 占用无关。
你真正要监控 swap 磁盘空间是否快耗尽,就得看 SwapTotal 和 SwapFree;用 Committed_AS 会得到一个偏高的、含义不同的值,容易误判。
-
Committed_AS是内核预估未来可能需要换出的内存总量,含未实际写盘部分 -
SwapUsed = SwapTotal - SwapFree才是已写入磁盘的交换页字节数 - 某些容器环境或 overcommit=2 模式下,
CommitLimit可能为 0,此时该比值完全失效
解析/proc/meminfo时字段定位要稳
字段名后可能有多个空格或制表符,不能靠固定偏移或行号提取;也不能用 std::getline 后直接 substr(9) 这类硬编码方式——不同内核版本空格数不一致。
宝塔Linux面板11.8.1为官网当前正式版,新增AI建站能力并经过宝塔网站工程师深度调教,开放自定义AI功能API,同时对WAF进行界面重构和深度优化,提升拦截能力与运维效率。
推荐做法是逐行扫描,用 line.find("SwapTotal:") 找到键位置,再跳过冒号和后续空白,用 std::stol 提取数值。生产环境必须加异常处理。
- 用
line.substr(pos + 10)不安全,因为"SwapTotal:"长度是 10,但冒号后空格数不定 - 更健壮写法:
size_t colon = line.find(':'); if (colon != std::string::npos) { std::string val_str = line.substr(colon + 1); val_str.erase(0, val_str.find_first_not_of(" \t")); ... } -
std::stol可能抛std::invalid_argument或std::out_of_range,必须捕获 - 字段单位统一是 KB,乘 1024 得字节,但计算百分比时可直接用 KB 值避免溢出
没有swap时的行为要显式处理
很多服务器禁用 swap(swapoff -a 且无配置),此时 SwapTotal 和 SwapFree 都为 0。若代码不做判断直接除零,会触发浮点异常或返回 inf。
这不是边缘情况——云主机、Kubernetes 节点、嵌入式设备常默认关闭 swap。必须在计算前检查 SwapTotal > 0。
- 返回值建议设为
-1.0或通过输出参数传bool*表示“swap 不可用” - 不要 fallback 到
sysinfo():其si.freeswap精度低,且未激活 swap 时也返回 0,无法区分“禁用”和“占满” - 也不要用
swapon --show解析:需 fork+exec,慢、不可靠、可能被 SELinux 阻断
实际 swap 使用率高低本身不直接决定性能问题,但持续 >80% 通常意味着物理内存长期不足,此时 MemAvailable 和 page fault 频率比 swap 百分比更有诊断价值。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










