私は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
のオプションがsetrlimit
機能しないようで、プロセスが終了した後(または以前)に入る方法がわかりませんVmPeak
。/proc/pid/status
効率的な方法、すなわちexec
プログラムに大きな影響を与えない方法が必要です。 (ptrace
たとえば、これにはいくつかのツールがありますが、valgrind
実行速度が大幅に遅くなります。)
答え1
RSSの使用からVSSを分離する方法はわかりませんが、メモリプールを使用するか、malloc代替を使用してシステムの最大割り当てを監視および/または強制することを検討できます。
taskstatsプロセス統計パッケージを見てください。最終的なメモリ使用量は記録されませんが、RSS使用量とVM使用量の最高水位表示は記録されます。これはすぐに欲しいものでしょうか? Ubuntu 16.04カーネルに標準で提供されているかどうかはわかりません。これを得るには、カーネルモジュールをビルドする必要があるかもしれません。