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


11

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

ログファイルを削除しようとしたときに、Webサーバーから約10秒の応答がありませんでした。(サービス停止時間。)

rm -f monthly.log

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

回答:


23

次の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

これが何を意味/するのか説明できますか?
mowwwalker

1
削除を「ニッキング」および「イオン化」しています。NiceはCPUの過剰使用をほぼ間違いなく防止するために使用されていましたが、ここで最も重要なのはioniceであり、実際にはスケジューラに優先度の低いファイルを削除するように指示しています。-cはクラス用で、1はリアルタイム、2は通常、3はアイドルです。クラス2には、0から7(IRRC)があり、7が最低です。それでも問題が発生する場合は、「ionice -c3」を使用して実行すると問題ありません。
ゴラン

5

大きなファイルをより速く削除するには、truncate次のコマンドを使用します-ゼロのサイズに縮小してから削除するように言ってください:

 truncate -s 0  monthly.log && rm -f monthly.log

クォンタが推奨するように、最初にログローテーションする必要があります。


とはどうtruncate違い>ますか?
小次郎

うーん、いい質問です。結果は同じですが、実装がどのように異なるかについては答えがありません。
ダニエルt。

truncateで使用する方が簡単ですsudoより>。でも簡単find -execです。
クバンチク


3

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

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

参照:IO /ロードをスラッシングせずにLinuxで100GBファイルを削除する方法はありますか?

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

Linuxサーバーのスペース不足


の必要はありません:。あなたができること> /path/to/monthly.log
kojiro

私はそれがであることを知ってnoopいますが、教育の観点からはより理にかなっています。
ewwhite

…しかし、その後、将来のインストラクターはその誤解を修正なければなりません。まあ、私はそれが仕事のセキュリティだと思います。
小次郎

true > /path/to/monthly.log同じことはしないだろう、そしてそれはそれほど古風ではあり:ませんか?
ステファンLasiewski

おそらく真...
ewwhite

3

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

cat /dev/null > monthly.log

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

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

また、syslogを使用してWebログを送信することも検討してください(/usr/bin/loggerたとえば、を使用)。通常、syslogを使用して作成されたログにもlogrotationがセットアップされています。


5
あなただけの行うことはできません>logfile猫のための必要性
user9517

2

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

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

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

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


1

これは、ファイルシステムのパフォーマンスの問題に帰着します。このSOの質問にこれに対する興味深い答えがありますが、これは使用しているファイルシステムにかなり依存します。MythTV用の数百のマルチギガバイトMPEG2ファイルを保存するファイルシステムを作成するときにXFSを使用しました。これは、当時XFSの削除パフォーマンスがext3よりもはるかに優れていたためです。その間、事態は大きく変わったかもしれません。

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


1

この問題は、Apache Webサーバーのユーザーよりもディスク操作の優先度が高い特権ユーザーからファイルを削除しているためだと思われます。ログファイルを削除する方法(rm -fまたは>で切り捨て)を選択する方法に関係なく、ディスクプライオリティ操作を最小値に下げる必要があります。

  ionice -c3 rm -f filename.log
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.