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
またはが含まれますunified
。mount | grep cgroup
あなたの結果はそうかもしれませんが、memory.max_usage_in_bytes
実際の常駐RAM使用量ではなく、コミットされた使用量だと思います。探している項目を指定していません。詳細な統計については、memory.stat
メモリ内部を参照してください。cgroup
sleep
一時メモリcgroupを使用している場合は、プロセスツリーの完了後にcgroupを削除する前に最大メモリ使用量を読み取るのに十分な時間を確保するために、長いコマンドを最後のプロセスとして実行できます。