50個のコンピューティングノードを使用するコンピュータクラスタで大規模なシミュレーションを実行しています。ソルバーは、ノードごとに(非常に)異なる動的に増加するデータ構造を使用します。使用するメモリが各ノードのメモリ制限を超えていないことを確認する必要があります。
私はこれまでで最も効率的な方法でこれを行っています。各ノードのターミナルタブを開き、実行して使用されているtop
メモリの割合を確認します。
スクリプトでこれを行う方法はありますか?アイデアは、各ノードでsshを実行し、メモリ使用量を保存し、次のノードにsshを送信するなどです。
答え1
大きすぎるプロセスを終了したい場合は、これがulimit
あなたの友人です。
マニュアルから:
-S use the `soft' resource limit
-H use the `hard' resource limit
-a all current limits are reported
-b the socket buffer size
-c the maximum size of core files created
-d the maximum size of a process's data segment
-e the maximum scheduling priority (`nice')
-f the maximum size of files written by the shell and its children
-i the maximum number of pending signals
-l the maximum size a process may lock into memory
-m the maximum resident set size
-n the maximum number of open file descriptors
-p the pipe buffer size
-q the maximum number of bytes in POSIX message queues
-r the maximum real-time scheduling priority
-s the maximum stack size
-t the maximum amount of cpu time in seconds
-u the maximum number of user processes
-v the size of virtual memory
-x the maximum number of file locks
-T the maximum number of threads
答え2
使用するメモリが各ノードのメモリ制限を超えていないことを確認する必要があります。
--memfree
GNU Parallelで使用するのは合理的ですか?システムに2 GBの空き容量がない場合、ジョブは開始されません。システムの空き容量が1GB未満の場合、システムはシャットダウンします。
parallel --slf hosts.txt --memfree 2G -j1 job ::: ar gu ments