以编程方式检索进程的峰值虚拟内存

时间:2018-01-24 08:04:04

标签: c++ linux macos memory freebsd

我试图在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;

的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

在macOS上,我认为使用task_info()TASK_BASIC_INFOMACH_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的

同样,在FreeBSD上,我认为getrusage()会提供信息,但它似乎没有任何关于峰值虚拟内存的信息。

0 个答案:

没有答案