Linux ECS (Elastic Compute Service) インスタンスにファイルまたはアプリケーションを作成したときにデバイスに空き容量がありません
というエラーメッセージが返された場合、インスタンスのディスク容量が不足しています。 このトピックでは、ディスク容量不足の問題の原因とその解決方法について説明します。
考えられる原因
ほとんどの場合、ディスク容量不足の問題は次の原因で発生します。
ディスクパーティションの領域使用量は100% に達します。
ディスクパーティションのinode使用量が100% に達します。
残ったファイル (ゾンビ) が存在します。
説明ファイルハンドルは削除されたファイルによって占有されます。 この場合、削除されたファイルによって消費されたディスク領域は解放されません。
マウントポイントは上書きされます。
説明例えば、多数のファイルを管理するディスクパーティションのファイルシステムをディレクトリにマウントする。 ディレクトリはマウントポイントと見なされます。 別のディスクパーティションのファイルシステムがマウントポイントにマウントされている場合、マウントポイントは新しいファイルシステムによって上書きされます。 ただし、システム内のアプリケーションは、元のファイルシステムからデータを読み取り、元のファイルシステムにデータを書き込む可能性があります。 この場合、ディスク容量不足の問題を示すエラーメッセージが返されることがあります。
df
またはdu
コマンドを実行してファイルおよびディレクトリのディスク領域使用量を確認した場合、情報は返されません。 これは、df
またはdu
コマンドが、現在のマウントポイントに対応するディスクパーティションの領域使用量に関する情報を返すためです。inotify腕時計の上限に達します。
inotify APIは、Linuxのファイルシステムイベントを監視するためのメカニズムを提供します。 inotifyを使用して、ファイルシステムのファイル変更をリアルタイムで監視できます。 このエラーは、ディスク容量不足によるものではありません。 このトピックでは、問題のトラブルシューティングに役立つエラーについて説明します。
トラブルシューティングの方法と解決策
問題を解決するには、問題の原因に基づいて次の操作を実行します。
1. ディスクパーティションの領域使用量は100% に達します
この問題を解決するには、大量のディスク容量を消費するファイルまたはディレクトリを削除したり、既存のディスクのサイズを変更したり、ディスクをさらに作成したりできます。
ディスク容量の現在の使用状況を照会し、大量のディスク容量を消費するファイルを見つけます。
ECS インスタンスに接続します。
詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。
次のコマンドを実行して、ディスク領域の使用状況を照会します。
df -h
次の図に示すサンプルコマンド出力が表示されます。 この例では、/dev/xvda1パーティションのスペース使用量は15% です。
次のコマンドを実行してルートディレクトリに移動し、どのディレクトリが最も多くのディスク容量を消費しているかを特定します。
cd / du -sh *
次の図に示すサンプルコマンド出力が表示されます。 コマンドの出力は、
/usr
ディレクトリが最も多くのディスク容量を消費することを示しています。 次に、/usr
ディレクトリで最も多くのディスク領域を消費するファイルまたはディレクトリをさらに特定する必要があります。 実際のシナリオに基づいて操作を実行します。次のコマンドを順番に実行して、階層的に最大のディスク容量を消費するディレクトリを識別します。
たとえば、上記のコマンド出力は、
/usr
ディレクトリが最も多くのディスク容量を消費することを示しています。 次に、/usr
ディレクトリで最も多くのディスク領域を消費するファイルまたはディレクトリをさらに特定する必要があります。cd /usr du -sh *
次の図に示すサンプルコマンド出力が表示されます。 コマンドの出力は、
ローカル
ディレクトリが /usrディレクトリ内の最大量のディスク領域を消費することを示しています。 次に、ローカル
ディレクトリで最も多くのディスク領域を消費するファイルまたはディレクトリをさらに特定する必要があります。 最大のディスク容量を消費する最終的なファイルまたはディレクトリが見つかるまで、この操作を繰り返します。
ビジネスシナリオに基づいて次の操作を実行します。
ビジネス要件に基づいて、大量のディスク容量を消費し、不要になったファイルまたはディレクトリを削除します。
ビジネスでディスクからファイルを削除できない場合、またはファイルを削除してディスク領域を解放できない場合は、ビジネス要件に基づいて既存のディスクのサイズを変更するか、ディスクをさらに作成します。 詳細については、「ディスクのサイズ変更の概要」、「ディスクの作成」、および「データディスクのアタッチ」をご参照ください。
2. ディスクパーティションのinode使用量が100% に達する
ファイルシステム内の各ファイルまたはディレクトリは、一意のinodeによって識別されます。 ディスク・パーティションがフォーマットされるとき、特定の数のiノードが、ファイルおよびディレクトリのためのディスク・パーティションに予め割り当てられる。 ただし、ディスクパーティションのファイルシステムに多数の小さなファイルまたはディレクトリが格納されている場合、inodeリソースが不足する可能性があります。 ディスクパーティションのすべてのiノードがファイルまたはディレクトリに割り当てられている場合、ディスクパーティションに空き領域があるかどうかに関係なく、ディスクパーティションに新しいファイルまたはディレクトリを作成できません。 これにより、inode使用量が100% に達するという問題が発生します。 この問題を解決するには、不要なファイルまたはディレクトリを削除してinodeをリリースするか、inodeの数を増やすことができます。
inodeの使用状況を照会します。
ECS インスタンスに接続します。
詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。
次のコマンドを実行して、inodeの使用状況を照会します。
df -i
inodeの使用量が100% に達している場合、または近づいている場合は、次のいずれかの方法を使用して問題を解決します。
多数のinodeを使用するファイルまたはディレクトリを削除する
inodeの数を増やす
3。 残ったファイル (ゾンビ) が存在する
ディスクパーティションのスペース使用量およびinode使用量に対して例外が検出されない場合、インスタンスのディスクスペースが不足しているという問題は、多数のファイルが残っていることが原因である可能性があります。 特定のファイルが削除され、削除された状態で表示されても、プロセスによって使用されている場合、df
またはdu
コマンドを実行して、ファイルが占有しているディスク領域を解放または照会することはできません。 残りのファイルの数が多すぎると、大量のディスク容量が占有されます。 次の操作を実行して、残りのファイルを照会および削除します。
残りのファイルが存在するかどうかを確認します。
ECS インスタンスに接続します。
詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。
オペレーティングシステムにlsofがインストールされていない場合は、次のいずれかのコマンドを実行してlsofをインストールします。
Alibaba Cloud LinuxおよびCentOS:
yum install -y lsof
DebianとUbuntu:
apt-get install -y lsof
次のコマンドを実行して、残りのファイルのディスク領域使用量を照会します。
lsof |grep delete | sort -k7 -rn | more
次の図に示すサンプルコマンド出力が表示されます。 削除された状態のファイルのサイズは、7列目に表示されます。 サイズの合計が予想外のディスク容量の使用量に近いかどうかを確認します。 合計が予想外の使用量に近い場合、残りのファイルはディスク容量を消費します。
残りのファイルが存在する場合は、次のいずれかの方法でファイルハンドルを解放し、残りのファイルを消去してディスク領域を解放します。
インスタンスの再起動
インスタンスの再起動後、システムは実行中のプロセスを終了し、削除されたファイルのハンドルを解放します。
重要インスタンスの再起動によりサービスが中断されます。 適切な期間にインスタンスを再起動することを推奨します。
killコマンドの実行
lsof
コマンドを実行すると、残りのファイルに対応する実行中のプロセスのプロセスID (PID) が通常2番目の列に表示されます。kill
コマンドでPIDを指定して、対応するプロセスを終了できます。次のコマンドを実行して、プロセスのPIDを一覧表示します。
lsof | grep delete
次のコマンドを実行して、ビジネス要件に基づいて残りのファイルに対応するプロセスを終了します。
kill <PID>
重要プロセスが終了すると、インスタンスで実行されるサービスが影響を受ける可能性があります。 作業は慎重に行ってください。
4。 マウントポイントが上書きされます
上記の操作に基づいて問題をトラブルシューティングした後も問題が解決しない場合は、上書きされたマウントポイントが原因であるかどうかを確認します。 マウントポイントが上書きされているかどうかを確認するには、次の方法を使用します。
次の図は、サイズが30 GBの /dev/vda1システムディスクの容量使用量が95% に達したことを示しています。 du
コマンドを実行すると、/home
ディレクトリが24 GBのディスク容量を消費していることがわかります。
/home
ディレクトリに /dev/vdb1をマウントした後も、/dev/vda1システムディスクの領域使用量は95% です。 ただし、システムディスクのルートパーティションでは、/usr
ディレクトリのみが1 GBを超えるディスク容量を消費し、/home
ディレクトリは、以前のチェックに基づく24 GBのディスク容量ではなく、20 KBしか消費しません。 最も多くのディスク容量を消費するディレクトリを特定することはできません。 この場合、問題は上書きされたマウントポイントによって引き起こされる可能性があります。
この問題を解決するには、ディスクパーティションをアンマウントし、元のマウントポイントの領域使用量を確認します。
マウント解除操作により、アプリケーションサービスが中断される場合があります。 適切な期間にパーティションのマウントを解除することを推奨します。
5. inotify時計の上限に達しています
tail -f
などのコマンドを実行したときに、tail: cannot watch '...': No space left on device
のようなエラーメッセージが返された場合、inotify watchの上限に達します。 この問題を解決するには、inotify時計の上限を増やすことができます。
次のコマンドを実行して、inotifyウォッチの上限を表示します。
cat /proc/sys/fs/inotify/max_user_watches
次のコマンドを実行して、inotifyウォッチの上限を変更します。
sudo sysctl fs.inotify.max_user_watches=<New upper limit>
<New upper limit>
を、inotifyウォッチに指定する上限の値に置き換えます。説明inotifyウォッチの上限を増やすと、inotifyウォッチはより多くのシステムメモリを占有する可能性があります。 inotify時計の上限を変更すると、システムのメモリとパフォーマンス、および可能性のある影響を評価します。
man 7 inotify
コマンドを実行して、inotifyウォッチと関連する設定の詳細を確認できます。
頻繁なフルディスクの問題を防ぐためのストレージの最適化
ディスクスペースが頻繁に使い果たされたり、データストレージスペースの需要が急速に高まっている場合は、ビジネス要件に基づいてストレージを最適化し、ディスク全体の問題が頻繁に発生しないようにすることができます。
ディスク領域に画像やビデオなどの多数のファイルが保存されていて、同時実行性の高い読み取りまたは書き込み操作がディスクに対して実行されない場合は、Object Storage Service (OSS) を使用できます。 OSSは、大容量で安全で費用対効果が高く、信頼性の高いクラウドストレージサービスであり、データ量に基づいてストレージスペースを自動的に拡張できます。 ossfsを使用して、OSSバケットをECSインスタンスにマウントできます。 アプリケーションは、コードを変更することなく、オンプレミスのファイルと同じ方法でOSSバケット内のオブジェクトを管理できます。 ossfsを使用してOSSバケットをLinuxシステムのローカルディレクトリにマウントする方法については、「ossfs」をご参照ください。
ビジネスで並行性の高い読み書き操作とデータ共有が必要な場合は、Apsara File Storage NAS (NAS) を使用してファイルを保存できます。 NASは、高性能で同時実行性の高い共有ストレージを可能にするシンプルでスケーラブルなファイルシステムを提供し、ECSと一緒に使用できます。 NASは、手動操作を必要とせずに、データ量の増加に伴いストレージ容量を自動的に拡張できます。 詳細については、「Linux ECSインスタンスへのファイルシステムのマウント」をご参照ください。
大量のログファイルをディスクに保存する場合は、ログファイルをSimple log Serviceに転送できます。 これにより、ログクエリが容易になり、ディスク使用量が削減されます。 詳細については、「入門」をご参照ください。