web-dev-qa-db-ja.com

Webサーバーをフリーズせずに非常に大きなファイルを削除する

私のWebサーバー(Apacheが実行されている、Linux CentOS)には、非常に大きなログファイル(50 Gbyte)があります。このWebサーバーは、いくつかのWebサービスを運用しています。

ログファイルを削除しようとすると、Webサーバーが約10秒間応答しませんでした。 (サービスアウト時間。)

rm -f monthly.log

Apacheフリーズせずにこの大きなファイルを削除する方法はありますか?

11
Jinbom Heo

次のような設定を使用して、最初にlogrotateを介してローテーションします。

/path/to/the/log {
    missingok
    notifempty
    sharedscripts
    daily   
    rotate 7
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
    compress
}

次に、深夜にcronジョブを作成して、ローテーションされたファイルを削除します。

30 2 * * * Nice -n 19 ionice -c2 -n7 rm -f /path/to/the/log/file.1
23
quanta

データが必要ない場合は、/ dev/nullを使用してデータを切り捨てます。

cat /dev/null > monthly.log

Webサーバーは、切り捨て後もファイルにデータを書き込み続けるため、Webサーバーを再起動する必要がありません(ファイルを削除するrm monthly.logとは異なります)。

差し迫った危機を解決した後、クアンタが示唆したようにログローテーションを検討してください。あなたはこれが再び起こることを望まない。 CentOSでは、Apacheログファイルはデフォルトですでにローテーションされていることに注意してください

また、syslogを介してWebログを送信することも検討してください(たとえば、/usr/bin/loggerを使用)。 Syslogを使用して作成されたログにも、通常、ログローテーションがすでに設定されています。

3
echo "0" > monthly.log && rm -f monthly.log
3
Amit Biyani

: > /path/to/monthly.log操作でファイルを切り捨て/ゼロにします。次に、Apacheプロセスを再起動し、ログローテーションを設定して、これが今後発生しないようにします...

ただし、これは頻繁に発生します。

参照: スラッシングなしでLinuxで100GBファイルを削除する方法はありますかIO/load?

NIXでは、アクティブに書き込まれている大規模なログファイルのサイズを削減する最良の方法は何ですか?

Linuxサーバーの容量不足

3
ewwhite

Ext3ファイルシステムを使用している場合は、ext4への切り替えを検討してください。

Ext3は個々の4kブロックの場所を保存するため、大きなファイルの削除が遅くなる可能性があります。50GiBファイル(50 * 1024 ^ 3バイト)は13107200ブロックを占有し、それぞれが32ビットのブロック番号としてiノードテーブルに記録されます、ファイルの内容がディスク上のどこにあるかを追跡するためだけに、合計50MiBの簿記データ。その大きなブロックリストは、多くの 間接ブロック に散在している可能性があり、ファイルを削除するときにすべて更新する必要があります。これらすべての間接ブロックにアクセスしようとしているディスクが、おそらく遅延の原因です。

一方、Ext4は、最大128MiBの「エクステント」でファイルを割り当てます。その50GiBファイルは、13107200の個別のブロック番号ではなく、400エクステントレコードだけを使用してiノードテーブルに記録できます。これにより、ファイルを削除するときに必要なディスクI/Oの量が大幅に削減されます。

既存のext3ファイルシステムをインプレースでext4に変換すると、newファイルはエクステントを使用して割り当てられますが、既存のファイルは引き続きブロックリストを使用します。 chattr +eコマンドを使用すると、エクステントを使用して既存のファイルを再割り当てできます。パフォーマンス面では、これはファイルのコピーを作成してから元のファイルを削除することに相当します。

2
Wyzard

これは、ファイルシステムのパフォーマンスの問題に要約されます。これに対する興味深い答えは this SO question ですが、これは使用しているファイルシステムによって異なります。何百ものファイルシステムを作成するときにXFSを使用しました。 MythTV のマルチギガバイトMPEG2ファイル。当時、XFSの削除パフォーマンスはext3よりもはるかに優れていたためです。この間に状況が大幅に変わった可能性があります。

@quantaの答えは好きです。ファイルを小さな部分に分割すると、削除が速くなります。

1
Tim Potter

問題は、ApacheWebサーバーユーザーよりもディスク操作を優先する特権ユーザーからファイルを削除していることが原因だと思います。ログファイルを削除する方法(rm -fまたはtruncate by>)を選択する方法に関係なく、ディスクの優先度の操作を最小に下げる必要があります。

  ionice -c3 rm -f filename.log
1