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

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

xargsを使用して複数のプロセスを並列に実行しており、累積最大メモリ使用量を測定したいと想像してください。 Linuxでこれを行うにはどうすればよいですか? GNU時間は、私が実行している単一のプロセスの最高RSSのみを測定します。つまり、各プロセスがM GBのメモリを消費し、そのうちN個を実行すると、結果はGNU時間で提供されるMではなくN * M GBとして表示されると予想されます。

答え1

各プロセスの最大メモリ使用量の合計に興味がありますか、またはプロセスの最大メモリ使用量の合計に興味がありますか?

たとえば、システム内の最大消費者の上位5人の最大常駐メモリ使用量を取得するには、次のようにします。

$ printf "PID\tPeak RSS usage (kB)\n"; grep VmHWM: /proc/*/status | sort -rnk2 | head -n 5 | perl -npe 's#^/proc/(\d+)/\S+\s+(\d+) kB$#$1\t$2#'
PID Peak RSS usage (kB)
19799   8515140
28243   930620
1357    911612
19833   766020
17926   734952

これにより、プロセス履歴にRAM使用量が最も多い5つのプロセスが一覧表示されます。しかしながら、これらのプロセスは、同じ瞬間にピークが発生しないことが一般的であるため、これらのプロセスのピークの合計は、すべてのプロセスのピークの合計よりもはるかに低い可能性がある。

複数のプロセスのプロセスメモリ使用量の最大合計を計算する唯一の信頼できる方法は、そのプロセスのコレクションを別のメモリで実行することですcgroup。理論的には、プログラムを実行し、systemd-run --pipe --user --pty ...そのメモリの最大メモリ使用量を監視できますcgroup。ただし、私の経験では、一時ユーザーモードグループは正しく実装できないため、測定したいグループを含む別々systemd-runのシステムレベルを作成してから、そのグループでプロセスツリーを起動する必要があります。cgroup私が試したよりも新しいディストリビューションを実行している場合は、 systemd-runハッキングなしで動作できます。バラよりhttps://stackoverflow.com/a/61916151/334451もっと学ぶ。cgroup通常、下のどこかに取り付けられているメモリマウントを見ると、結果を確認できます/sys/fs/cgroup。可能な場所にはサブディレクトリmemoryまたはが含まれますunifiedmount | grep cgroupあなたの結果はそうかもしれませんが、memory.max_usage_in_bytes実際の常駐RAM使用量ではなく、コミットされた使用量だと思います。探している項目を指定していません。詳細な統計については、memory.statメモリ内部を参照してください。cgroup

sleep一時メモリcgroupを使用している場合は、プロセスツリーの完了後にcgroupを削除する前に最大メモリ使用量を読み取るのに十分な時間を確保するために、長いコマンドを最後のプロセスとして実行できます。

関連情報