私のWebサーバー(Apacheが実行されている、Linux CentOS)には、非常に大きなログファイル(50 Gbyte)があります。このWebサーバーは、いくつかのWebサービスを運用しています。
ログファイルを削除しようとすると、Webサーバーが約10秒間応答しませんでした。 (サービスアウト時間。)
rm -f monthly.log
Apacheフリーズせずにこの大きなファイルを削除する方法はありますか?
次のような設定を使用して、最初に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
データが必要ない場合は、/ dev/nullを使用してデータを切り捨てます。
cat /dev/null > monthly.log
Webサーバーは、切り捨て後もファイルにデータを書き込み続けるため、Webサーバーを再起動する必要がありません(ファイルを削除するrm monthly.log
とは異なります)。
差し迫った危機を解決した後、クアンタが示唆したようにログローテーションを検討してください。あなたはこれが再び起こることを望まない。 CentOSでは、Apacheログファイルはデフォルトですでにローテーションされていることに注意してください
また、syslogを介してWebログを送信することも検討してください(たとえば、/usr/bin/logger
を使用)。 Syslogを使用して作成されたログにも、通常、ログローテーションがすでに設定されています。
echo "0" > monthly.log && rm -f monthly.log
: > /path/to/monthly.log
操作でファイルを切り捨て/ゼロにします。次に、Apacheプロセスを再起動し、ログローテーションを設定して、これが今後発生しないようにします...
ただし、これは頻繁に発生します。
参照: スラッシングなしでLinuxで100GBファイルを削除する方法はありますかIO/load?
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
コマンドを使用すると、エクステントを使用して既存のファイルを再割り当てできます。パフォーマンス面では、これはファイルのコピーを作成してから元のファイルを削除することに相当します。
これは、ファイルシステムのパフォーマンスの問題に要約されます。これに対する興味深い答えは this SO question ですが、これは使用しているファイルシステムによって異なります。何百ものファイルシステムを作成するときにXFSを使用しました。 MythTV のマルチギガバイトMPEG2ファイル。当時、XFSの削除パフォーマンスはext3よりもはるかに優れていたためです。この間に状況が大幅に変わった可能性があります。
@quantaの答えは好きです。ファイルを小さな部分に分割すると、削除が速くなります。
問題は、ApacheWebサーバーユーザーよりもディスク操作を優先する特権ユーザーからファイルを削除していることが原因だと思います。ログファイルを削除する方法(rm -fまたはtruncate by>)を選択する方法に関係なく、ディスクの優先度の操作を最小に下げる必要があります。
ionice -c3 rm -f filename.log