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_RSSのオプションがsetrlimit機能しないようで、プロセスが終了した後(または以前)に入る方法がわかりませんVmPeak/proc/pid/status

効率的な方法、すなわちexecプログラムに大きな影響を与えない方法が必要です。 (ptraceたとえば、これにはいくつかのツールがありますが、valgrind実行速度が大幅に遅くなります。)

答え1

RSSの使用からVSSを分離する方法はわかりませんが、メモリプールを使用するか、malloc代替を使用してシステムの最大割り当てを監視および/または強制することを検討できます。

taskstatsプロセス統計パッケージを見てください。最終的なメモリ使用量は記録されませんが、RSS使用量とVM使用量の最高水位表示は記録されます。これはすぐに欲しいものでしょうか? Ubuntu 16.04カーネルに標準で提供されているかどうかはわかりません。これを得るには、カーネルモジュールをビルドする必要があるかもしれません。

関連情報