我正在 Ubuntu 16.04 上编写一个程序,它将fork
执行一些设置和exec
另一个程序。我需要:
- 限制程序可以使用的最大 VSS
- 限制程序可以使用的最大 RSS
- 测量程序执行期间使用的最大 VSS
- 测量程序在执行期间使用的最大 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_RSS
in 中的选项似乎setrlimit
没有用,而且我不知道如何在进程终止后(或在进程终止之前)VmPeak
进入。/proc/pid/status
我需要一种有效的方法,即不对exec
程序产生重大影响。 (有ptrace
一些工具,例如valgrind
,但它会大大减慢执行速度。)
答案1
我不知道如何将 VSS 与 RSS 使用分开,但您可以考虑使用内存池,或使用 malloc 替代品来监视和/或强制系统的最大分配。
看一下taskstats进程统计包。它不记录最终的内存使用情况,但会记录 RSS 使用情况和 VM 使用情况的高水位线,这可能正是您想要的?我不确定它是否可以作为 Ubuntu 16.04 内核的标准配置 - 您可能需要构建一个内核模块才能获得它。