我试图在Linux,macOS和FreeBSD上查找正在运行的进程的峰值虚拟内存。
我专注于峰值虚拟内存,因为这是我的进程在任何给定点的峰值内存使用量的相关度量,超出了物理RAM的限制(RSS将提供的峰值)。
本着How to determine CPU and memory consumption from inside a process?的精神,我计划使用这篇文章为这三个平台编译解决方案(如果你有提供的工作代码,我很乐意将它扩展到更多平台)。
在Windows上,以下内容似乎返回与Process Explorer相同的值:
PROCESS_MEMORY_COUNTERS_EX pmc;
GetProcessMemoryInfo(
GetCurrentProcess(),
reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmc),
sizeof(pmc));
return pmc.PeakPagefileUsage;
解析/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
不幸的是,虽然接近,但我看起来不能获得进程的峰值虚拟内存,只有当前虚拟内存使用情况({{1}以字节为单位)。
同样,在FreeBSD上,我认为getrusage()
会提供信息,但它似乎没有任何关于峰值虚拟内存的信息。