linux内核不提供系统级物理内存占用峰值,需自行定时采样/proc/meminfo中的memtotal与memfree并维护全局最大值;进程级峰值可用getrusage(rusage_self)获取ru_maxrss。

Linux 下用 /proc/meminfo 无法获取物理内存占用峰值
很多人一上来就查 /proc/meminfo,发现里面只有 MemTotal、MemAvailable 这类瞬时值,但没有“历史最高使用量”。这是设计使然:/proc/meminfo 不记录峰值,它只反映当前内核内存管理器的快照。
真正能拿到物理内存占用峰值的,是内核为每个进程维护的 peak_rss(即该进程生命周期中 RSS 的最大值),但它属于**进程级指标**,不是系统全局峰值。系统级物理内存峰值——比如从开机到现在物理内存使用的最高水位——Linux 内核本身不直接暴露这个值。
所以如果你要监控的是“整台机器历史上物理内存用到过的最高字节数”,得自己持续采样 + 记录。
用 getrusage(RUSAGE_SELF) 获取当前进程 RSS 峰值
这是最常用、开销最小的方案,适用于你想知道“本程序运行至今最多占了多少物理内存”:
-
getrusage(RUSAGE_SELF, &usage)返回的usage.ru_maxrss就是该进程的峰值 RSS(单位:KB,在 Linux 上) - 注意:Windows 下单位是 KB,macOS 是 bytes,需条件编译或统一转换
- 它不包含子进程,只统计调用时刻前本进程达到过的最高 RSS
- 调用开销极低,可每秒采样多次,不影响性能
示例片段:
#include <sys>
struct rusage usage;
if (getrusage(RUSAGE_SELF, &usage) == 0) {
long peak_kb = usage.ru_maxrss; // Linux: KB
}</sys>
监控系统全局物理内存峰值需自行累积采样
没有现成 syscall 或 proc 接口返回“系统自启动以来物理内存最高使用量”。你必须自己做两件事:
- 定时读取
/proc/meminfo中的MemTotal和MemFree,算出当前已用 =MemTotal - MemFree(更准可用MemAvailable反推活跃用量) - 在内存中或文件里维护一个全局最大值变量,每次更新:
global_peak = max(global_peak, current_used) - 注意:
/proc/meminfo的值是瞬时快照,采样频率太低会漏掉尖峰;太高(如 10ms 一次)可能引发 I/O 毛刺,建议 100–500ms 间隔 - 若需跨重启持久化峰值,必须写入本地文件(如
/var/run/memory_peak.bytes),并在启动时读取初始化
避免误把 VmPeak 当作物理内存峰值
有人去读 /proc/[pid]/status 里的 VmPeak,以为那是物理内存峰值。这是典型误解:
-
VmPeak是虚拟地址空间峰值(单位 KB),含 mmap、stack、heap 等所有虚拟映射,和物理内存(RSS)无关 - 一个只 malloc 1GB 但没 touch 的进程,
VmPeak可能很大,ru_maxrss却接近 0 - 判断真实物理内存压力,永远优先看
ru_maxrss(进程级)或MemTotal - MemFree(系统级)
真正难的不是读数据,而是定义清楚你要的“峰值”到底指什么:是某个进程的、整个系统的、是否含缓存、是否跨重启、精度要求到秒级还是分钟级——这些决定了你该采哪个源、怎么存、要不要加锁、要不要落盘。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











