以编程方式检索进程的峰值虚拟内存
我试图在Linux,macOS和FreeBSD上找到我正在运行的进程的最高虚拟内存。
我关注的是峰值虚拟内存,因为这是在任何给定点超出物理内存限制(RSS可提供什么高峰)的过程中,我的进程的峰值内存使用情况的相关度量。
本着如何从进程内部确定CPU和内存消耗的精神? 我打算使用这篇文章为这三个平台编译解决方案(如果您有工作代码提供,我很乐意将它扩展到更多的平台)。
视窗
在Windows上,以下内容似乎会返回与Process Explorer相同的值:
PROCESS_MEMORY_COUNTERS_EX pmc;
GetProcessMemoryInfo(
GetCurrentProcess(),
reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmc),
sizeof(pmc));
return pmc.PeakPagefileUsage;
Linux的
解析/proc/self/status
的输出是Linux上的最佳/唯一选项? 所有的Linux风格都以相同的方式返回相同的信息格式吗?
作为参考,下面是Ubuntu上的一个输出示例:
root@appleseedhq:~# cat /proc/self/status
Name: cat
State: R (running)
Tgid: 12975
Ngid: 0
Pid: 12975
PPid: 12938
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups: 0
VmPeak: 7220 kB
VmSize: 7220 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 608 kB
VmRSS: 608 kB
VmData: 176 kB
VmStk: 136 kB
VmExe: 44 kB
VmLib: 1924 kB
VmPTE: 40 kB
VmSwap: 0 kB
Threads: 1
(more stuff...)
这里感兴趣的线似乎是
VmPeak: 7220 kB
任何更简单,更快,更脆弱的解决方案?
苹果系统
在MacOS我想到用task_info()
与TASK_BASIC_INFO
或MACH_TASK_BASIC_INFO
会做的工作,即
#ifdef MACH_TASK_BASIC_INFO
struct mach_task_basic_info info;
mach_msg_type_number_t info_count = MACH_TASK_BASIC_INFO_COUNT;
if (task_info(
mach_task_self(),
MACH_TASK_BASIC_INFO,
(task_info_t)&info,
&info_count) != KERN_SUCCESS)
return 0;
#else
struct task_basic_info info;
mach_msg_type_number_t info_count = TASK_BASIC_INFO_COUNT;
if (task_info(
mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&info,
&info_count) != KERN_SUCCESS)
return 0;
#endif
不幸的是,虽然接近,但它看起来并不像我能够获得进程的峰值虚拟内存,只有当前的虚拟内存使用(以info.virtual_size
,以字节为单位)。
FreeBSD的
同样,在FreeBSD上,我认为getrusage()
会提供信息,但它似乎没有关于峰值虚拟内存的任何信息。
上一篇: Programmatically retrieve peak virtual memory of a process