ほとんどの場合、Linuxインスタンスのディスク容量は限られています。 アプリケーションがLinuxインスタンスにデプロイされている場合、アプリケーションが実行され続け、保存されているファイルの数が増加すると、使用可能なディスク領域が減少します。 Linuxインスタンスのディスク容量が不十分な場合、サービスはファイルをディスクに書き込み続けることができず、サービス例外が発生する可能性があります。 このトピックでは、ディスク容量不足の問題をチェックする方法と、問題を解決する方法について説明します。
問題の説明
Linux ECS (Elastic Compute Service) インスタンスにファイルまたはアプリケーションを作成したときにデバイスに空き容量がありません
というエラーメッセージが返された場合、インスタンスのディスク容量が不足しています。 この場合は, ディスク容量不足の原因を特定し, 対策を講じる必要があります。
原因
ほとんどの場合、ディスク容量不足の問題は次の原因で発生します。
ディスクパーティションの領域使用量は100% に達します。
ディスクパーティションのinode使用量が100% に達します。
残ったファイル (ゾンビ) が存在します。
説明削除されたファイルは、削除される前にファイルハンドルが開いていたため、ファイルが削除されたときにファイルスペースを解放できない場合があります。
マウントポイントは上書きされます。
説明例えば、多数のファイルを管理するディスクパーティションのファイルシステムをディレクトリにマウントする。 ディレクトリはマウントポイントと見なされます。 別のディスクパーティションのファイルシステムがマウントポイントにマウントされている場合、マウントポイントは新しいファイルシステムによって上書きされます。 ただし、アプリケーションは、元のファイルシステム空間からデータを読み取り、元のファイルシステム空間にデータを書き込み続ける場合があります。 この場合、ディスク容量不足の問題を示すエラーメッセージが返されることがあります。
df
またはdu
コマンドを実行してファイルおよびディレクトリのディスク領域使用量を確認した場合、情報は返されません。 これは、df
またはdu
コマンドが、現在のマウントポイントに対応するディスクパーティションの領域使用量に関する情報を返すためです。Dockerファイルは大量のメモリスペースを占有します。
inotify腕時計の上限に達します。
説明inotify APIは、Linuxのファイルシステムイベントを監視するためのメカニズムを提供します。 inotifyを使用して、ファイルシステムのファイル変更をリアルタイムで監視できます。 このエラーは、ディスク容量不足によるものではありません。 このトピックでは、問題のトラブルシューティングに役立つエラーについて説明します。
同定方法とソリューション
デバイスに空き容量がありません
エラーを解決するには、問題の原因に基づいて次の操作を実行します。
問題をトラブルシューティングできるECSインスタンスに接続する必要があります。 詳細については、「Workbenchを使用したSSH経由のLinuxインスタンスへの接続」をご参照ください。
次の操作で, ファイルを削除してディスク領域を解放する場合は, 削除する前にファイルが不要になったことを確認してください。 これにより、データの損失やビジネスへの影響を防ぎます。 手動でファイルを削除する前に、ディスクバックアップを実行することを推奨します。 ファイルをコピーするか、スナップショットを使用してデータをバックアップできます。 スナップショットの作成方法については、「ディスクのスナップショットの作成」をご参照ください。
ディスクパーティションの領域使用量は100% に達します。
識別方法
ディスク容量の現在の使用状況を照会し、大量のディスク容量を消費するファイルを見つけます。
次のコマンドを実行して、ディスク領域の使用状況を照会します。
df -h
次のコマンド出力が返されます。 この例では、
/dev/vda3
パーティションの使用率は100% に達します。次のコマンドを実行してルートディレクトリに移動し、どのディレクトリが最も多くのディスク容量を消費しているかを特定します。
sudo du -sh /* | sort -rh | head -n 10
次のコマンド出力が返されます。 図に示すように、
/home
ディレクトリは最も多くのディスク容量を消費します。 したがって、/home
ディレクトリのどのファイルまたはディレクトリが最大のディスク容量を占有しているかを確認してください。 ビジネス要件に基づいて次の操作を実行します。次のコマンドを実行して、最も多くのディスク容量を消費するディレクトリを特定します。
たとえば、コマンド出力は、
/home
ディレクトリが最も多くのディスク容量を消費することを示します。 次に、/home
ディレクトリで最も多くのディスク容量を消費するファイルまたはディレクトリを特定します。sudo du -sh /home/* | sort -rh | head -n 10
次のコマンド出力が返されます。
ecs-user
ディレクトリは、最大のディスク容量を消費します。 さらに、ecs-userディレクトリ内の特定のファイルまたはサブディレクトリを確認して、どのアイテムが大量のsaceを消費しているかを判断できます。上記のプロセスを繰り返します。 この例では、
/home/ecs-user/
ディレクトリで削除できる多数のファイルを見つけることができます。
ソリューション
ビジネスシナリオに基づいて考えられる原因を確認し、特定の原因に基づいて適切な対策を講じます。
ビジネス要件に基づいて、大量のディスク容量を消費し、不要になったファイルまたはディレクトリを削除します。
ビジネスでディスクからファイルを削除できない場合、またはファイルの削除後にディスク領域を解放できない場合は、ビジネス要件に基づいて既存のディスクのサイズを変更するか、ディスクをさらに作成します。 詳細については、「ディスクのサイズ変更の概要」、「空のデータディスクの作成」、および「データディスクのアタッチ」をご参照ください。
ディスクパーティションのinode使用率が100%
ファイルシステム内の各ファイルまたはディレクトリは、一意のinodeによって識別されます。 ディスク・パーティションがフォーマットされるとき、特定の数のiノードが、ファイルおよびディレクトリのためのディスク・パーティションに予め割り当てられる。 ただし、ディスクパーティションのファイルシステムに多数の小さなファイルまたはディレクトリが格納されている場合、inodeリソースが不足する可能性があります。 ディスクパーティションのすべてのiノードがファイルまたはディレクトリに割り当てられている場合、ディスクパーティションに空き領域があるかどうかに関係なく、ディスクパーティションに新しいファイルまたはディレクトリを作成できません。 この問題を解決するには、不要なファイルまたはディレクトリを削除してinodeをリリースするか、inodeの数を増やすことができます。
識別方法
次のコマンドを実行して、inodeの使用状況を照会します。
df -i
ソリューション
inodeの使用量が100% に達している場合、または近づいている場合は、次のいずれかの方法を使用して問題を解決します。
残ったファイル (ゾンビ) が存在する
ディスクパーティション容量とinode容量が両方とも正常である場合、システム内に多数の削除されたファイル (削除され
たファイル) が存在する可能性があります。 これらのファイルはまだシステム内のプロセスによって占有されているため、システムは対応するディスクスペースを解放できません。 これらのファイルは削除済みとしてマークされており、df
またはdu
コマンドを実行してもカウントできません。 残りのファイルの数が多すぎると、大量のディスク容量が占有されます。 次の操作を実行して、残りのファイルを照会および削除します。
識別方法
オペレーティングシステムにlsofがインストールされていない場合は、次のいずれかのコマンドを実行して、オペレーティングシステムに基づいてlsofをインストールします。
Alibaba Cloud LinuxおよびCentOS
sudo yum install -y lsof
DebianとUbuntu
sudo apt install -y lsof
次のコマンドを実行して、残りのファイルのディスク領域使用量を照会します。
sudo lsof | grep delete | sort -k7 -rn | more
次の図に示すサンプルのコマンド出力が返されます。 削除された状態のファイルのサイズ (バイト単位) が7列目に表示されます。 サイズの合計が予想外のディスク容量の使用量に近いかどうかを確認します。 合計が予想外の使用量に近い場合、残りのファイルはディスク容量を消費します。
ソリューション
残りのファイルが存在する場合は、次のいずれかの方法でファイルハンドルを解放し、残りのファイルを消去してディスク領域を解放します。
インスタンスの再起動
インスタンスの再起動後、システムは実行中のプロセスを終了し、削除されたファイルのハンドルを解放します。
警告インスタンスの再起動によりサービスが中断されます。 適切な期間にインスタンスを再起動することを推奨します。
killコマンドの実行
lsof
コマンドを実行した後、2番目の列の残りのファイルに対応する実行中のプロセスのプロセスID (PID) を取得します。kill
コマンドでPIDを指定して、対応するプロセスを終了できます。次のコマンドを実行して、プロセスのPIDを照会します。
lsof | grep delete
次のコマンドを実行して、ビジネス要件に基づいて残りのファイルに対応するプロセスを終了します。
kill <PID>
警告プロセスが終了すると、インスタンスで実行されるサービスが影響を受ける可能性があります。 作業は慎重に行ってください。
マウントポイントが上書きされる
上記の3つの原因を取り除いた後、ディスク容量不足の原因を特定できない場合は、マウントポイントが上書きされる可能性があります。 次の方法を使用して問題をトラブルシューティングできます。
識別方法
次のコマンドを実行して、データディスクのマウント情報を表示します。
mount
次のコマンド出力が返されます。
2つのデバイスが /mnt/device_vdcディレクトリにマウントされています。 マウントポイントは、ディレクトリ内で上書きされる可能性があります。
次のコマンドを実行して、パーティションに関する情報を表示します。
df -h
次のコマンド出力が返されます。
解決策
この問題を解決するには、ディスクパーティションをアンマウントし、元のマウントポイントの領域使用量を確認します。
次のコマンドを実行して、ファイルシステムをアンマウントします。 この例では、/mnt/device_vdc
ファイルシステムがアンインストールされています。
inodeの数を増やすには、マウントポイントからファイルシステムをアンマウントする必要があります。 ただし、これはアプリケーションを中断する可能性があります。 適切な期間にファイルシステムをアンマウントすることを推奨します。
sudo umount /mnt/device_vdc
ディスクパーティションのマウントをキャンセルした後、元のマウントディレクトリの領域使用量を確認し、実際の状況に基づいて適切な対策を講じる必要があります。
Dockerファイルは大量のメモリ領域を消費します
ECS
インスタンスでDocker
サービスを実行すると、実行中のコンテナの数が増加し、Docker
で未使用または使用されなくなったイメージとコンテナがディスク領域を占有するという問題が発生する可能性があります。 ディスク容量が不足している場合は、次の方法を使用してDocker
で使用されなくなったファイルをクリーンアップし、ディスク使用量を削減できます。
次の方法は、Docker
を実行するインスタンスと、Docker
関連のサービスが大量のメモリ領域を占有するためにディスク領域がいっぱいのインスタンスにのみ適用されます。
次のコマンドを実行して、Docker
がインスタンスにインストールされているかどうかを確認できます。
sudo docker -v
次のサンプルコマンド出力は、インスタンスがDocker
を実行することを示しています。
Docker version 26.1.3, build b72abbb
識別方法
次のコマンドを実行して、ディスク容量を照会します。
sudo df -h
次のサンプルコマンド出力は、ディスク領域使用量が100% に達したことを示しています。
次のコマンドを実行して、
Docker
に関連するファイルディスクの使用状況を表示します。sudo docker system df
次のサンプルコマンド出力が返されます。
Docker
イメージは大量のスペースを占有します (再利用されたスペースは76% を占めます) 。 不要なイメージをクリーニングしてディスクスペースを解放できます。説明sudo docker system df
コマンドの出力で、わずかなDocker関連ファイルしかクリアできないことが示された場合は、大量のスペースを占有する不要なファイルを確認してクリーンアップします。 詳細については、このトピックの「ディスクパーティション領域使用量が100% に達する」セクションをご参照ください。
解決策
Dockerファイルが過剰な容量を占有する場合は、次の方法でファイルをクリアできます。
次のコマンドを実行して、不要なファイルを消去します。
sudo docker system prune
次のサンプルコマンド出力が返された場合は、Yと入力してファイルを削除します。
sudo docker system prune
コマンドは、次の項目を削除します。 操作を実行する前に、コンテンツを消去する必要があるかどうかを確認してください。
すべての停止コンテナ
コンテナによって現在使用されていないすべてのネットワーク
タグのないすべてのぶら下がっている画像
使用されなくなったキャッシュを構築する
inotify時計の上限に達しています
tail -f
などのコマンドを実行したときに、tail: cannot watch '...': No space left on device
のようなエラーメッセージが返された場合、inotify watch
の上限に達します。 この問題を解決するには、inotify時計
の上限を増やすことができます。
識別方法
次のコマンドを実行して、inotify watch
の上限を表示します。
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に転送できます。 これにより、ログクエリが容易になり、ディスク使用量が削減されます。 詳細については、「入門」をご参照ください。