Linux - ディスク容量不足によるアプリケーション障害の防止

Linux - ディスク容量不足によるアプリケーション障害の防止

予測できない状況のため、現在のアプリケーション(終了したくない)がゆっくりとディスク容量全体を占める状況に対する解決策を見つける必要があります。より多くの背景情報を提供

  • multiprocessing.Poolを使用して5つのスレッドを起動するPythonアプリケーションがあります。各スレッドは独自のファイルにいくつかのデータを書き込みます。

  • このプログラムはLinux上で実行され、コンピュータへのrootアクセス権がありません。

  • このプログラムは多くのCPUを使用し、数ヶ月間実行されました。まだすべてのデータを書き込むには数日がかかりました。

  • ファイル内のデータの40%が重複しているため、クイックテスト後に削除できます。

  • プログラムを実行しているシステムでは、残りのディスク容量はわずか30GBで、現在の作業速度で見ると、プログラムが完了する前に確実に入力されます。

上記を考慮して、各問題に対する次の解決策を見てください。

  • iがfile_iに書き込んでいるプロセス番号を考えると、file_iを外部の場所に移動しても安全ですか?オペレーティングシステムは単に新しいfile_iインスタンスを作成し、ここに記録しますか?ファイルを移動すると、そのファイルが削除され、プロセスが「死んだ」ファイルを作成することになると思いました。

  • 生成されたワーカーの5つのうち4つを停止し、そのうちの1つが完了するのを待ってからジョブを再開する「コマンドライン」方法はありますか? (ワーカースレッドがディスクを占有しないと確信しています)

  • Ctrl + Zを使用して基本プロセスを停止するとします。これにより、multiprocessing.Poolによって生成された他のすべてのプロセスが停止しますか?それでは、ファイルを安全に編集して追加の行を削除できますか?

私が見た3つのオプションが与えられた場合、この状況でどのようなオプションが機能しますか?そうでない場合、この問題を処理するより良い方法はありますか?プログラムが完了する数日前にクラッシュが発生する状況は本当に避けたいと思います。

答え1

ファイルを別のファイルシステムに移動すると、後で起こるのは、ファイルの現在の内容がコピーされ、元のファイルが削除されることです。プログラムがまだファイルに書き込んでいる場合は、現在削除されているファイルにも書き込みを続けます。削除されたが開いているファイルは実際には削除されず、分離のみされます(もはや名前はありません)。プログラムが閉じられると、ファイルは実際に削除されます。したがって、両方の利点を得ることができます。ファイルはまだ可能な限り多くのディスク容量を使用しますが、残りの出力は失われます。

Ctrl+を押してZフォアグラウンドプロセスを一時停止し、コマンドを使用またはbg再開できますfg。プログラムで他の動作が発生しない限り、すべてのスレッドは中断されます。 (ネットワークを介してサブプロセスを生成するように設計されたプログラムは、異なる動作を表すことができます。単一プロセス、マルチスレッドプログラムは正常に動作する可能性が高いです。)プログラムが別のプロセスで構成されている場合は、コマンドを使用してすべてのプロセスを見つけますps。のkill -STOP 1234 1238 1239ようなコマンドを使用します。すべて歩いてください(kill -CONT …後で復元するため)。

プログラムがファイルに書き込んだり前後に読み込んだりすると、鼻の下にあるデータは削除できません。この段階では、データの移動は可能ですが、難しい場合があり、プログラムの動作方法によって異なります。ただし、あなたの説明によれば、プログラムは各ファイルに追加を続けることができます。その場合、一部のデータは最初に削除されることがあります。

ファイルを編集しないでください。所望の効果を得る可能性が低い。ほとんどの編集者が作業する方法は、新しいファイルを保存して古いファイルの場所に移動することです(保存時に競合が発生した場合はより安定しています)。ファイルの先頭を切り取ってディスク容量を節約できます。まず、ファイルをコピーして他の場所にデータを保存します。その後、ファイルは長さ0に切り捨てられます。プログラムは前の場所に追加し続けます。その場所が12345の場合、プログラムが別のバイトを追加すると、ファイルは12345ヌルバイトで始まります。ほとんどのヌルバイトはディスク容量を占有しません。スパースファイル

# Suspend the program first, otherwise you'll lose output produced between cp and truncation!
for x in *.out; do
  cp "$x" /elsewhere/
  : >|"$x"  # truncate $x to size 0
done

プログラムが完了したら、残りのデータを他の場所に保存されているファイルに追加できます。これtailユーティリティは最初のファイルを省略してファイルをコピーできます。窒素bytes;このパラメーターは、省略するバイト数に1を加えたものです。

for x in *.out; do
  existing_size=$(stat -c %s "/elsewhere/$x")
  tail -c +$((existing_size+1)) "$x" >>"/elsewhere/$x"
done

rsync 3.0.0以降の場合は利用できます

rsync --append *.out /elsewhere/

以前のバージョンのrsyncは、ファイルの既存の部分をソースの新しいnullバイトで上書きすることに注意してください。これを行う前に、rsyncのバージョンを確認してください。

答え2

ルートアクセスがない場合、オプションは非常に制限されます。最善の選択であり、現実的に成功する唯一の機会であるIMHOは、すでに作成して閉じたファイルを圧縮してプログラムを完了するのに十分なスペースを確保することです。 SOユーザーには他のオプションがあります。そこに尋ねましたか?

答え3

iがfile_iに書き込んでいるプロセス番号を考えると、file_iを外部の場所に移動しても安全ですか?オペレーティングシステムは単に新しいfile_iインスタンスを作成し、ここに記録しますか?ファイルを移動すると、そのファイルが削除され、プロセスが「死んだ」ファイルを作成することになると思いました。

プログラムがファイルを開いて、データを書き込んで再び閉じると、ファイルを移動すると新しいファイルが作成されます。それはほとんどのプログラムが動作する方法ではありません。オペレーティングシステムではファイルが移動されたことを示すことができますが、実際にはプログラムがファイルハンドルを閉じるまでディスク容量を占有します。

生成されたワーカーの5つのうち4つを停止し、そのうちの1つが完了するのを待ってからジョブを再開する「コマンドライン」方法はありますか? (ワーカースレッドがディスクを占有しないと確信しています)

これはプログラムが使用するワーカースレッドの種類によって異なりますが、ほぼ確実にrootアクセスが必要です(デバッグツールを使用する必要があり、正確な順序はプログラムの仕組みによって大きく異なります)。これは、プログラムの内部動作へのルートアクセスや深い知識がなければ実現できない可能性があります。

Ctrl + Zを使用して基本プロセスを停止するとします。これにより、multiprocessing.Poolによって生成された他のすべてのプロセスが停止しますか?それでは、ファイルを安全に編集して追加の行を削除できますか?

繰り返しますが、プログラムの実行方法によって異なります。プロセスを一時停止すると、ワーカーも一時停止する可能性が高くなりますが、これは保証されません。しかし、ファイルハンドルのファイルポインタがまだファイルを編集する前と同じオフセットを指しているので、これは問題を変えないと思います。


システムから別のファイルを移動できますか?それとも仮想ディスクを拡張できる仮想マシンですか?

関連情報