限制和测量 VSS/RSS

限制和测量 VSS/RSS

我正在 Ubuntu 16.04 上编写一个程序,它将fork执行一些设置和exec另一个程序。我需要:

  1. 限制程序可以使用的最大 VSS
  2. 限制程序可以使用的最大 RSS
  3. 测量程序执行期间使用的最大 VSS
  4. 测量程序在执行期间使用的最大 RSS

到目前为止,我可以执行以下 1. 和 4. 操作:

pid_t chpid = fork();
if (!chpid) {
    // I do lots of setup here
    struct rlimit rlim;
    rlim.rlim_cur = rlim.rlim_max = limit_VSS;
    setrlimit(RLIMIT_AS, &rlim); // 1.
    execv(path, args);
}
struct rusage stats;
wait3(NULL, 0, &stats);
long max_RSS = stats.ru_maxrss;  // 4.

我怎样才能实现2.和3.?

RLIMIT_RSSin 中的选项似乎setrlimit没有用,而且我不知道如何在进程终止后(或在进程终止之前)VmPeak进入。/proc/pid/status

我需要一种有效的方法,即不对exec程序产生重大影响。 (有ptrace一些工具,例如valgrind,但它会大大减慢执行速度。)

答案1

我不知道如何将 VSS 与 RSS 使用分开,但您可以考虑使用内存池,或使用 malloc 替代品来监视和/或强制系统的最大分配。

看一下taskstats进程统计包。它不记录最终的内存使用情况,但会记录 RSS 使用情况和 VM 使用情况的高水位线,这可能正是您想要的?我不确定它是否可以作为 Ubuntu 16.04 内核的标准配置 - 您可能需要构建一个内核模块才能获得它。

相关内容