複数プロセスの最大メモリ使用量の測定

複数プロセスの最大メモリ使用量の測定

さまざまな異なるスクリプトを呼び出すbashスクリプトがあり、そのうちの1つには、次のスクリーンセッションでスクリプトを起動する多くのコマンドがあります。

screen -S $SESSION_NAME -p $f -X stuff "$CMD\n"

/usr/bin/time -v を使用して最上位スクリプトを実行すると、すべての最大メモリ使用量がキャプチャされますか?このスクリプトをcronジョブとして実行したいのですが、システムの他のユーザーに問題を引き起こす前に必要なメモリ量を知っておく必要があります。

ありがとう

ベストアンサー1

はいまたはいいえ、GNU時代はすべての要約/頂点を表示しようとします。

次の小さなCプログラムを使用してこれを確認できますmal.c

#include <stdlib.h>
#include <string.h>

int main(int argc, char **argv)
{
    long bytes;
    void *buf;

    bytes = atol(argv[1]) * 1024;
    buf = malloc(bytes);
    memset(buf, 0, bytes);
    printf("");
    return 0;
}

そして見てください:

$ gcc mal.c -o mal
$ /usr/bin/time -f "%M" sh -c "./mal 5000"
5452
$ /usr/bin/time -f "%M" sh -c "./mal 10000"
10452
$ /usr/bin/time -f "%M" sh -c "./mal 5000; ./mal 10000"
10452

しかし、getrusage(2) のマニュアルページ (Linux) に記載されているように、これはプロセスツリーの瞬間累積 RSS ではなく、すべての単一サブプロセスの最大 RSS です。すべてのプロセスは同時にメモリを使用します。

つまり、次のように並列またはバックグラウンドプロセスを要約しません。

$ /usr/bin/time -f "%M" sh -c "./mal 1000000 & ./mal 5000"
5452

timeこれはまた、画面だけでなく$ CMDも測定するために画面セッション内で実行する必要があることを意味します。

参考までにシェル組み込みとの違いは、時間バイナリがパイプまたは関数を直接要約できないことです。

$ time /bin/sleep 1 | /bin/sleep 2
 real 2.00
 user 0.00
 sys 0.00

$ /usr/bin/time -p  /bin/sleep 1 | /bin/sleep 2
 real 1.00
 user 0.00
 sys 0.00

おすすめ記事