Linuxサーバー:並列プロセスにメモリはどのように割り当てられますか?

Linuxサーバー:並列プロセスにメモリはどのように割り当てられますか?

私は完全初心者なので、私の無知および/または誤った用語を理解してください。

私は脳の画像処理にSSHを介してUbuntuサーバーを使用しています(1つのコマンドには複数のプログラムが含まれており、各脳の実行には約4〜5時間かかります)、端末を介して画像を実行します。サーバーの保存スペースが制限されていて(~200GB)、脳データが大容量(入力2~3GB、出力500MB)なので、FileZillaを使って処理されたデータをダウンロードし、新しい保留データをアップロードしています。

脳画像処理はRAMを大量に消費し、メモリの問題により何度も失敗しました。したがって、2つのプログラムを別々に手動で実行しています(プログラム1 =脳画像処理とプログラム2 =アップロード/ダウンロード)。一つのことをしながら同時に他のことをしません。しかし、脳の画像処理が失敗しないようにしながら、これを行うためのより効率的な方法があるかどうか疑問に思います。

簡単に言えば、プロセス1が必要なRAMを使用し、「残り」はプロセス2に割り当てられます。現在、8つのコアをすべてプロセス1に割り当てていますが(プログラムの作成方法のため)、8つのコアはすべて非常に頻繁に使用されます。理想的には、まだFileZillaを使用できるようにする方法はありますか? (ターミナルを介したアップロード/ダウンロードに反対するわけではありませんが、非常に高速で簡単なためです)。可能ですか?それとも同時に実行されるプロセス間でRAMを割り当てる方法は何ですか(特に重要な場合は他のソフトウェアで実行されている場合)。

これらすべてが理解されることを願っています。よろしくお願いします!

答え1

これはGNU Parallelの仕事のように聞こえます。

16個のブレインを並列に実行するのに十分なCPU性能があり、データ転送に必要な時間は、実行時間(4~5時間)に比べて非常に短いとしましょう。

送信するコンピューターで、次を実行します。

parallel --delay 1m -j16 -S server --trc {}.output 'process_brain {} > {}.output' ::: brain*.input
オプション 説明する
-遅延1分 1分ごとに最大1つのジョブを開始します(これにより、最初のファイルを転送するために1分間の最初のジョブに全帯域幅が与えられます)。
-j16 最大16のジョブを同時に実行
-Sサーバー サーバー上
--trc{.}.output 入力ファイルをサーバーに転送し、完了したら出力を再送信してクリーンアップします(サーバーから両方のファイルを削除します)。
'process_brain {} > {.}.output' Brain*.input で process_brain を実行し、Brain*.output に保存します。
::: 入力ソース区切り記号
脳*.入力 入力に使用するファイル

1章と2章を20分間読んでください。https://doi.org/10.5281/zenodo.1146014。あなたのコマンドラインはあなたを愛するでしょう。

関連情報