linux内核不维护全局物理内存占用峰值,仅能通过getrusage获取单个进程rss峰值(ru_maxrss),或通过周期采样/proc/meminfo自行计算系统级近似峰值。

Linux 下用 /proc/meminfo 无法直接拿到物理内存占用峰值
很多人一上来就查 /proc/meminfo,发现里面只有 MemTotal、MemFree、MemAvailable 这类瞬时值,但没有 PeakRss 或类似字段——没错,Linux 内核**不维护全局物理内存占用历史峰值**。这个值根本不存在于系统接口里,硬查只会白忙。
真正能拿到的“峰值”,只存在于两个上下文里:
- 单个进程的
getrusage(RUSAGE_SELF, &ru)返回的ru.ru_maxrss(单位是 KB),这是该进程生命周期内驻留集(RSS)的最大值; - 系统级近似峰值只能靠周期采样 + 外部记录,例如每秒读一次
/proc/meminfo中的MemTotal - MemFree - Buffers - Cached - SReclaimable算出近似已用内存,再自己比大小。
C++ 调用 getrusage 获取当前进程 RSS 峰值
getrusage 是 POSIX 标准接口,在 Linux/macOS/WSL 上都可用,Windows 需用 GetProcessMemoryInfo 替代(下节讲)。它返回的是进程自启动以来的**最大常驻内存(RSS)**,不是系统总内存峰值,但对监控自身服务是否内存泄漏极其关键。
示例代码片段:
#include <sys>
#include <iostream><p>long get_peak_rss_kb() {
struct rusage ru;
if (getrusage(RUSAGE_SELF, &ru) == 0) {
return ru.ru_maxrss; // Linux 返回 KB,macOS 返回 bytes(需判断 _SC_PAGESIZE)
}
return -1;
}
</p></iostream></sys>
注意点:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
ru_maxrss在 Linux 上单位是 KB,在 macOS 上是字节,可通过sysconf(_SC_PAGESIZE)和getpagesize()辅助判断平台; - 该值只增不减,且仅反映用户态分配+内核为该进程分配的页框,不含共享库重复计数;
- 调用开销极小,可放心在性能敏感服务中每几秒采集一次。
Windows 上用 GetProcessMemoryInfo 替代 getrusage
Windows 没有 getrusage,但 psapi.h 提供的 GetProcessMemoryInfo 可以拿到 PROCESS_MEMORY_COUNTERS_EX::PeakWorkingSetSize,单位字节,含义最接近 Linux 的 ru_maxrss。
关键步骤:
- 链接
Psapi.lib(MSVC)或加-lpsapi(MinGW); - 必须用
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ权限打开当前进程句柄; - 结构体要用
PROCESS_MEMORY_COUNTERS_EX(不是旧版PROCESS_MEMORY_COUNTERS),否则PeakWorkingSetSize字段不存在; - 该值受 Windows 工作集策略影响,可能比实际物理页分配略宽松,但仍是生产环境唯一可用的进程级峰值指标。
系统级“物理内存占用峰值”只能靠采样 + 自维护
如果你真需要整个系统的物理内存使用历史最高点(比如做告警阈值基线),别指望内核提供现成字段。可行做法是:
- 定时(如 1s 间隔)读取
/proc/meminfo,提取MemTotal:、MemFree:、Buffers:、Cached:、SReclaimable:四行; - 按公式计算近似已用内存:
MemTotal - MemFree - Buffers - Cached - SReclaimable(单位 kB); - 自己维护一个
static long long system_peak_kb = 0,每次更新时比较取大; - 注意:该值会受 page cache 回收、cgroup 限制、zram 压缩等干扰,不能用于精确审计,只适合趋势监控。
真正棘手的不是怎么算,而是采样频率和精度的权衡——太密增加 I/O 和锁争用(/proc/meminfo 读取会触发内核统计),太疏又可能错过尖峰。线上建议起始设为 3~5 秒,再根据 top -b -n1 | head -20 观察 Mem: 行波动幅度动态调整。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










