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


31

2回の連続したインタビューでこの質問をされましたが、さまざまなシステム管理者との調査と確認の後、良い答えが得られませんでした。誰かがここで私を助けることができるかどうか疑問に思っています。

サーバーのディスク容量が不足しています。非常に大きなログファイルに気付き、削除しても安全であると判断します。ファイルを削除しますが、ディスクはまだいっぱいであることを示しています。何が原因で、どのように修正しますか?そして、どのプロセスがこの巨大なログファイルを書き込んでいるかをどのように見つけますか?


3
より良いシステム管理者に相談する必要があります。これは些細なことです。
ウォンブル

2
些細なことですが、状況と問題は十分に頻繁に発生します
...-ewwhite

OPはこれを受け入れることができますか?
ewwhite

5
些細なことでもそうでない場合でも、* nixを流fluentに話せない人(たとえば、主にWindowsの管理者)にとって、これは学ぶのに良いことです。
ジョンガーデニアーズ

回答:


56

これは一般的なインタビューの質問であり、さまざまな実稼働環境で発生する状況です。

ファイルのディレクトリエントリは削除されましたが、ロギングプロセスはまだ実行中です。すべてのファイルハンドルが閉じられ(プロセスが強制終了されたなど)、すべてのディレクトリエントリが削除されるまで、オペレーティングシステムによってスペースが再利用されることはありません。ファイルに書き込むプロセスを見つけるには、lsofコマンドを使用する必要があります。

質問の他の部分は、「プロセスを強制終了せずに、書き込み中のファイルをどのようにクリアするのか」ということもあります。理想的には、ファイルを削除するのではなく、ログファイル「ゼロ」または「切り捨て」のようなものにしたいでしょう: > /var/log/logfile


1
...またはfuser
スティーブン

1
少し拡張します。ディスク上のファイルへのすべての参照が消えるまで、そのスペースは他の人が使用することはできません。これにはファイルハンドルが含まれます。それはまた仕事にこのトリックを可能にする:serverfault.com/questions/45237/link-to-a-specific-inode
ジェフFerland

1
あなたがいる場合にno-clobber設定し、試してみてください>| /var/log/logfile
Belminフェルナンデス

2
インタビューのたびに、この質問の変種を尋ねます。「ディスクがいっぱいになりました。dfスペースが不足している、duほとんど使用していないと言います。何が原因で、2つのツールが一致しないのですか?」
-voretaq7

> /var/log/fileディスク上のスペースが100%のままの場合はどうすればよいですか?ログファイルは空のように見えますが、このログファイルに書き込むプログラムを再起動した後にのみスペースが回復します。プログラムを再起動せずにディスク容量を回復する方法はありますか?
アレマーニ

14

ファイルへの別のリンク(ハードリンクまたは開いているファイルハンドル)がまだあります。ファイルを削除すると、ディレクトリエントリのみが削除されます。ファイルデータとiノードは、最後の参照が削除されるまでハングアップします。

サービスが一時ファイルを作成し、ファイルを開いたままですぐに削除することは、やや一般的な方法です。これにより、ディスク上にファイルが作成されますが、プロセスが異常終了した場合にファイルが削除されることが保証され、他のプロセスが誤ってファイルを踏みつけないようにします。MySQLは、たとえば、ディスク上のすべての一時テーブルに対してこれを行います。マルウェアは、多くの場合、同様の手法を使用してファイルを隠します。

Linuxでは、これらの削除されたファイルにとして簡単にアクセスできます/proc/<pid>/fd/<filenumber>


8

私はシステム管理者ではありませんが、Unix.SEで収集したものから、Linuxシステムは、それらを指すすべてのファイル記述子が持つまでリンクが解除された後、ファイルを実際に削除しません(空き/再利用可能としてマークします)閉じられました。したがって、最初の部分に答えるために、プロセスがまだそれを読んでいるので、スペースはまだ無料ではありません。2番目に答えるために、どのプロセスがファイルを使用しているかを確認できますlsof


2

明らかなハードリンク/オープンファイルの答えに加えて、1つの代替答え:そのファイルは、/var/log/lastlog実際にはそれほど多くのスペースを占有していないRHEL などの(非常に)疎なファイルです。削除してもほとんど影響がないため、次に大きいファイルを調べる必要があります。


1

ファイルを書き込むプロセスがルートの場合、スーパーユーザーの予約済みファイルスペースに書き込みます。ファイルシステムには、ユーザータスクがディスクをいっぱいにした場合にシステムを動作させ続けるためのスペースがあります。このスペース(デフォルトでは5%)は、多くのツールからは見えません。

lsofは、どのプロセスがファイルをロックしたか、ergoがファイルに書き込んでいるかを表示できます。


1
tune2fsを使用して、この予約率を調整することもできます。これは、ディスク容量を解放しながらサーバーの実行を継続するための簡単な方法です。
sjbotha

1

ファイルがプロセスによって開かれていることに加えて、2番目のケースは、btrfsまたはなどのスナップショットをサポートするファイルシステムがある場合ですZFS

たとえば、その巨大なログファイルが存在するスナップショットを作成します。ここでファイルを削除すると、デルタのみが削除されます。また、ファイルが使用されていない場合にのみ、デルタが削除されます。

こちらもご覧ください:

3番目のケースは、ブロックレベルの重複排除をサポートするファイルシステムがあり、ほとんどのファイルが別のファイルと同一である場合です。ログの内容が同一になるように、同じFSを共有するsyslogコンテナまたはVMにログを送信しているコンテナまたはVMがない限り、ログでこれが発生することはありません。

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