linux系统不提供/proc/meminfo中的物理内存占用峰值字段,该文件仅含瞬时值;系统级峰值需用户态持续采样memtotal−memavailable并维护最大值。

Linux 下用 /proc/meminfo 获取物理内存峰值不靠谱
系统本身并不在 /proc/meminfo 中暴露“历史最高物理内存使用量”。它只提供瞬时值,比如 MemTotal、MemAvailable、MemUsed(需计算),但没有 MemPeak 或类似字段。试图反复轮询并自己记录最大值,只能得到你进程启动后观察到的峰值,不是系统级全局峰值——内核不维护这个统计。
C++ 读取 /sys/fs/cgroup/memory.max_usage_in_bytes 前先确认 cgroup v1/v2
真正能拿到“本进程或其所在 cgroup 的物理内存使用峰值”的路径,取决于 cgroup 版本:
- cgroup v1(旧系统):路径通常是
/sys/fs/cgroup/memory/<em>your_cgroup</em>/memory.memsw.max_usage_in_bytes或memory.max_usage_in_bytes(不含 swap) - cgroup v2(主流新发行版):统一路径为
/sys/fs/cgroup/<em>your_cgroup</em>/memory.current和/sys/fs/cgroup/<em>your_cgroup</em>/memory.peak—— 注意,memory.peak是 v2 新增且可靠的峰值指标
你的 C++ 程序得先判断运行环境:access("/sys/fs/cgroup/cgroup.controllers", F_OK) 存在即为 v2;否则 fallback 到 v1 路径探测。硬编码路径会直接失败。
用 getrusage(RUSAGE_SELF) 只能拿到本进程虚拟内存峰值
getrusage(RUSAGE_SELF, &ru) 返回的 ru.ru_maxrss 是本进程生命周期内的最大驻留集大小(RSS),单位是 KB(Linux)或 bytes(macOS),但它反映的是虚拟内存映射中实际驻留在物理内存的部分,**不包含共享库、page cache、内核分配等系统级占用**,更不是整机物理内存峰值。它适合监控单个程序资源水位,不能替代系统级监控。
示例片段:
struct rusage ru;
if (getrusage(RUSAGE_SELF, &ru) == 0) {
long peak_kb = ru.ru_maxrss; // Linux 下是 KB
}
真正系统级物理内存峰值只能靠外部持续采样 + 自行追踪
如果你非要“系统当前物理内存占用峰值”,唯一可行方式是:自己起一个后台采集线程,周期性读取 /proc/meminfo 中的 MemTotal 减 MemAvailable(即已用物理内存估算值),然后维护一个运行时最大值。注意三点:
-
MemAvailable比MemFree更准确,它考虑了可回收 cache 和 slab,是内核 3.14+ 才有的字段 - 采样间隔不宜过密(如
- 该峰值仅限你程序运行期间有效;重启后归零,无法跨 boot 持久化
别指望某个 libc 函数或 sysctl 一键返回“系统历史最高内存使用量”——内核没存这个数据,也没提供接口。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











