すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:Linuxインスタンスのディスク容量不足の問題を解決する

最終更新日:Aug 27, 2024

Linux ECS (Elastic Compute Service) インスタンスにファイルまたはアプリケーションを作成したときにデバイスに空き容量がありませんというエラーメッセージが返された場合、インスタンスのディスク容量が不足しています。 このトピックでは、ディスク容量不足の問題の原因とその解決方法について説明します。

考えられる原因

ほとんどの場合、ディスク容量不足の問題は次の原因で発生します。

  1. ディスクパーティションの領域使用量は100% に達します。

  2. ディスクパーティションのinode使用量が100% に達します。

  3. 残ったファイル (ゾンビ) が存在します。

    説明

    ファイルハンドルは削除されたファイルによって占有されます。 この場合、削除されたファイルによって消費されたディスク領域は解放されません。

  4. マウントポイントは上書きされます。

    説明

    例えば、多数のファイルを管理するディスクパーティションのファイルシステムをディレクトリにマウントする。 ディレクトリはマウントポイントと見なされます。 別のディスクパーティションのファイルシステムがマウントポイントにマウントされている場合、マウントポイントは新しいファイルシステムによって上書きされます。 ただし、システム内のアプリケーションは、元のファイルシステムからデータを読み取り、元のファイルシステムにデータを書き込む可能性があります。 この場合、ディスク容量不足の問題を示すエラーメッセージが返されることがあります。 dfまたはduコマンドを実行してファイルおよびディレクトリのディスク領域使用量を確認した場合、情報は返されません。 これは、dfまたはduコマンドが、現在のマウントポイントに対応するディスクパーティションの領域使用量に関する情報を返すためです。

  5. inotify腕時計の上限に達します。

    inotify APIは、Linuxのファイルシステムイベントを監視するためのメカニズムを提供します。 inotifyを使用して、ファイルシステムのファイル変更をリアルタイムで監視できます。 このエラーは、ディスク容量不足によるものではありません。 このトピックでは、問題のトラブルシューティングに役立つエラーについて説明します。

トラブルシューティングの方法と解決策

問題を解決するには、問題の原因に基づいて次の操作を実行します。

1. ディスクパーティションの領域使用量は100% に達します

この問題を解決するには、大量のディスク容量を消費するファイルまたはディレクトリを削除したり、既存のディスクのサイズを変更したり、ディスクをさらに作成したりできます。

  1. ディスク容量の現在の使用状況を照会し、大量のディスク容量を消費するファイルを見つけます。

    1. ECS インスタンスに接続します。

      詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。

    2. 次のコマンドを実行して、ディスク領域の使用状況を照会します。

      df -h

      次の図に示すサンプルコマンド出力が表示されます。 この例では、/dev/xvda1パーティションのスペース使用量は15% です。

      image

    3. 次のコマンドを実行してルートディレクトリに移動し、どのディレクトリが最も多くのディスク容量を消費しているかを特定します。

      cd /
      du -sh * 

      次の図に示すサンプルコマンド出力が表示されます。 コマンドの出力は、/usrディレクトリが最も多くのディスク容量を消費することを示しています。 次に、/usrディレクトリで最も多くのディスク領域を消費するファイルまたはディレクトリをさらに特定する必要があります。 実際のシナリオに基づいて操作を実行します。 image

    4. 次のコマンドを順番に実行して、階層的に最大のディスク容量を消費するディレクトリを識別します。

      たとえば、上記のコマンド出力は、/usrディレクトリが最も多くのディスク容量を消費することを示しています。 次に、/usrディレクトリで最も多くのディスク領域を消費するファイルまたはディレクトリをさらに特定する必要があります。

      cd /usr
      du -sh * 

      次の図に示すサンプルコマンド出力が表示されます。 コマンドの出力は、ローカルディレクトリが /usrディレクトリ内の最大量のディスク領域を消費することを示しています。 次に、ローカルディレクトリで最も多くのディスク領域を消費するファイルまたはディレクトリをさらに特定する必要があります。 最大のディスク容量を消費する最終的なファイルまたはディレクトリが見つかるまで、この操作を繰り返します。image

  2. ビジネスシナリオに基づいて次の操作を実行します。

    • ビジネス要件に基づいて、大量のディスク容量を消費し、不要になったファイルまたはディレクトリを削除します

    • ビジネスでディスクからファイルを削除できない場合、またはファイルを削除してディスク領域を解放できない場合は、ビジネス要件に基づいて既存のディスクのサイズを変更するか、ディスクをさらに作成します。 詳細については、「ディスクのサイズ変更の概要」、「ディスクの作成」、および「データディスクのアタッチ」をご参照ください。

2. ディスクパーティションのinode使用量が100% に達する

ファイルシステム内の各ファイルまたはディレクトリは、一意のinodeによって識別されます。 ディスク・パーティションがフォーマットされるとき、特定の数のiノードが、ファイルおよびディレクトリのためのディスク・パーティションに予め割り当てられる。 ただし、ディスクパーティションのファイルシステムに多数の小さなファイルまたはディレクトリが格納されている場合、inodeリソースが不足する可能性があります。 ディスクパーティションのすべてのiノードがファイルまたはディレクトリに割り当てられている場合、ディスクパーティションに空き領域があるかどうかに関係なく、ディスクパーティションに新しいファイルまたはディレクトリを作成できません。 これにより、inode使用量が100% に達するという問題が発生します。 この問題を解決するには、不要なファイルまたはディレクトリを削除してinodeをリリースするか、inodeの数を増やすことができます。

  1. inodeの使用状況を照会します。

    1. ECS インスタンスに接続します。

      詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。

    2. 次のコマンドを実行して、inodeの使用状況を照会します。

      df -i

      image

  2. inodeの使用量が100% に達している場合、または近づいている場合は、次のいずれかの方法を使用して問題を解決します。

    • 多数のinodeを使用するファイルまたはディレクトリを削除する

      inodeの数を増やすようにディスクをフォーマットしたくない場合は、次の操作を実行して、inodeの数が多いファイルまたはディレクトリを削除します。

      1. 次のコマンドを実行して、ルートディレクトリの各サブディレクトリに存在するファイルの数を照会します。

        for i in /*; do echo $i; find $i | wc -l; done

        次の図に示すサンプルコマンド出力が表示されます。 コマンドの出力は、/usrディレクトリのファイル数が最も多いことを示します。 次に、/usrディレクトリ内のどのディレクトリに最も多くのファイルがあるかを特定する必要があります。 ファイル数の増加に伴い、Inodeの使用量が増加します。 実際のシナリオに基づいて操作を実行します。

        image

      2. 上記のコマンドを実行して、階層的に最大数のinodeを使用するファイルまたはディレクトリを識別します。 次に、ファイルまたはディレクトリを削除します。

    • inodeの数を増やす

      ディスクに保存されているファイルを削除できない場合、またはファイルの削除後にinodeの使用率が高いままである場合は、次の手順を実行して、ファイルシステム内のinodeの数を増やします。

      警告
      • ディスク上のinodeの数を増やすには、ディスクをフォーマットする必要があります。 この場合、ディスクに保存されているデータは削除されます。 ディスクをフォーマットする前に、データをバックアップする必要があります。 データをコピーするか、ディスクのスナップショットを作成できます。 スナップショットの作成方法については、「ディスクのスナップショットの作成」をご参照ください。

      • inodeの数を増やすには、マウントポイントからファイルシステムをアンマウントする必要があります。 ただし、アプリケーションサービスが中断される可能性があります。 適切な期間にファイルシステムをアンマウントすることを推奨します。

      1. 次のコマンドを実行して、マウントポイントからファイルシステムをマウント解除します。

        この例では、ファイルシステムは /homeマウントポイントからマウント解除されます。 実際のシナリオに基づいてコマンドを変更します。

        umount /home
      2. 次のコマンドを実行してファイルシステムを作成し、より多くのinodeを指定します。

        この例では、/dev/xvdbパーティションに対してext3ファイルシステムが作成され、inodeの数は1,638,400に設定されています。 実際のシナリオに基づいてコマンドを変更します。

        mkfs.ext3 /dev/xvdb -N 1638400
        説明

        Linuxでは、iノードの数はディスク容量によって異なります。 ほとんどの場合、inodeの数は次の式を使用して計算されます。inodeの数=ディスク容量 (KB)/16 KB。 たとえば、40 GBのディスクは、上記の式に基づいて2,621,440のiノードを持つことができます。 ディスクに許可されるinodeの最大数は2 ^ 32で、これは約4.3億です。 ディスク容量に基づいてinodeの数を指定します。

      3. 次のコマンドを実行して、新しいファイルシステムをマウントポイントにマウントします。

        この例では、新しいファイルシステムは、/etc/fstabファイルの設定に基づいて /homeマウントポイントにマウントされます。 実際のシナリオに基づいてコマンドを変更します。

        mount -a
      4. (オプション) 次のコマンドを実行してinodeの数を照会し、inodeの数が増加しているかどうかを確認します。

        dumpe2fs -h /dev/xvdb | grep node

        次の図に示すサンプルコマンド出力が表示されます。 コマンド出力は、inodeの数が増加したことを示します。 バックアップデータをディスクにコピーして、影響を受けるアプリケーションを復元できます。

        image

3。 残ったファイル (ゾンビ) が存在する

ディスクパーティションのスペース使用量およびinode使用量に対して例外が検出されない場合、インスタンスのディスクスペースが不足しているという問題は、多数のファイルが残っていることが原因である可能性があります。 特定のファイルが削除され、削除された状態で表示されても、プロセスによって使用されている場合、dfまたはduコマンドを実行して、ファイルが占有しているディスク領域を解放または照会することはできません。 残りのファイルの数が多すぎると、大量のディスク容量が占有されます。 次の操作を実行して、残りのファイルを照会および削除します。

  1. 残りのファイルが存在するかどうかを確認します。

    1. ECS インスタンスに接続します。

      詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。

    2. オペレーティングシステムにlsofがインストールされていない場合は、次のいずれかのコマンドを実行してlsofをインストールします。

      • Alibaba Cloud LinuxおよびCentOS:

        yum install -y lsof
      • DebianとUbuntu:

        apt-get install -y lsof
    3. 次のコマンドを実行して、残りのファイルのディスク領域使用量を照会します。

      lsof |grep delete | sort -k7 -rn | more

      次の図に示すサンプルコマンド出力が表示されます。 削除された状態のファイルのサイズは、7列目に表示されます。 サイズの合計が予想外のディスク容量の使用量に近いかどうかを確認します。 合計が予想外の使用量に近い場合、残りのファイルはディスク容量を消費します。image

  2. 残りのファイルが存在する場合は、次のいずれかの方法でファイルハンドルを解放し、残りのファイルを消去してディスク領域を解放します。

    • インスタンスの再起動

      インスタンスの再起動後、システムは実行中のプロセスを終了し、削除されたファイルのハンドルを解放します。

      重要

      インスタンスの再起動によりサービスが中断されます。 適切な期間にインスタンスを再起動することを推奨します。

    • killコマンドの実行

      lsofコマンドを実行すると、残りのファイルに対応する実行中のプロセスのプロセスID (PID) が通常2番目の列に表示されます。 killコマンドでPIDを指定して、対応するプロセスを終了できます。

      1. 次のコマンドを実行して、プロセスのPIDを一覧表示します。

        lsof | grep delete
      2. 次のコマンドを実行して、ビジネス要件に基づいて残りのファイルに対応するプロセスを終了します。

        kill <PID>
        重要

        プロセスが終了すると、インスタンスで実行されるサービスが影響を受ける可能性があります。 作業は慎重に行ってください。

4。 マウントポイントが上書きされます

上記の操作に基づいて問題をトラブルシューティングした後も問題が解決しない場合は、上書きされたマウントポイントが原因であるかどうかを確認します。 マウントポイントが上書きされているかどうかを確認するには、次の方法を使用します。

次の図は、サイズが30 GBの /dev/vda1システムディスクの容量使用量が95% に達したことを示しています。 duコマンドを実行すると、/homeディレクトリが24 GBのディスク容量を消費していることがわかります。

image

/homeディレクトリに /dev/vdb1をマウントした後も、/dev/vda1システムディスクの領域使用量は95% です。 ただし、システムディスクのルートパーティションでは、/usrディレクトリのみが1 GBを超えるディスク容量を消費し、/homeディレクトリは、以前のチェックに基づく24 GBのディスク容量ではなく、20 KBしか消費しません。 最も多くのディスク容量を消費するディレクトリを特定することはできません。 この場合、問題は上書きされたマウントポイントによって引き起こされる可能性があります。

image

この問題を解決するには、ディスクパーティションをアンマウントし、元のマウントポイントの領域使用量を確認します。

警告

マウント解除操作により、アプリケーションサービスが中断される場合があります。 適切な期間にパーティションのマウントを解除することを推奨します。

5. inotify時計の上限に達しています

tail -fなどのコマンドを実行したときに、tail: cannot watch '...': No space left on deviceのようなエラーメッセージが返された場合、inotify watchの上限に達します。 この問題を解決するには、inotify時計の上限を増やすことができます。

  1. 次のコマンドを実行して、inotifyウォッチの上限を表示します。

    cat /proc/sys/fs/inotify/max_user_watches
  2. 次のコマンドを実行して、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に転送できます。 これにより、ログクエリが容易になり、ディスク使用量が削減されます。 詳細については、「入門」をご参照ください。