症状
-
リモート接続の失敗:
-
SSH または Workbench を使用してインスタンスに接続すると、接続が拒否されるか、タイムアウトします。
-
VNC を使用してログオンすると、正しい資格情報を入力した後に システムエラー メッセージが表示されます。
-
-
アプリケーションの異常な動作:
アプリケーションログまたはコマンドラインの出力に Too many open files エラーが表示されます。
./test3.sh: redirection error: cannot duplicate fd: Too many open files ./test3.sh: line 13: /tmp/testfile_20: Too many open files Error opening file 20: Too many open files
原因
nofile のリソース制限が厳しすぎる:/etc/security/limits.conf ファイル内の nofile パラメーターは、プロセスが開くことができるファイルの最大数を決定します。プロセスがこの制限を超えるファイルを開こうとすると、システムがエラーを報告したり、新しい接続を拒否したりすることがあります。
手順
インスタンスにログオンできる場合は、設定ファイルを直接変更できます。インスタンスにログオンできない場合は、システムディスクを別のインスタンスにアタッチして設定を修復する必要があります。
インスタンスにアクセスできる場合
-
root ユーザーとして ECS インスタンスにログオンします。
-
ECS コンソール - インスタンス ページに移動します。左上の隅で、インスタンスが配置されているリソースグループとリージョンを選択します。
-
対象インスタンスの詳細ページに移動します。接続 をクリックし、ワークベンチ を選択します。画面の指示に従い、root ユーザー としてログオンし、ターミナルを開きます。
-
-
設定ファイルを変更します。
/etc/security/limits.confファイルを編集します。hard nofileおよびsoft nofileパラメーターの値をデフォルトの65535に変更します。その後、ファイルを保存して終了します。* soft nofile 65535 * hard nofile 65535 root soft nofile 65535 root hard nofile 65535-
アスタリスク (
*) はすべての一般ユーザーに適用され、rootは root ユーザーに適用されます。 -
hard nofile:オープンファイルの数のハードリミットです。この値は、fs.nr_openカーネルパラメーターで設定された制限を超えることはできません。超えた場合、インスタンスにログオンできなくなる可能性があります。 -
soft nofile:オープンファイルの数の現在の制限です。この値はhard nofileの制限を超えることはできません。超えた場合、この設定は無視されます。soft nofileの値がhard nofileの値より大きい場合、有効なnofileの値はhard nofileパラメーターの値になります。
-
-
新しい設定を適用します。
-
対象ユーザーとして ECS インスタンスからログアウトし、再度ログオンして変更を適用します。
-
sudo ulimit -nコマンドを実行します。出力が65535であれば、nofileの制限は更新されています。
-
-
関連アプリケーションを再起動し、正常に機能することを確認します。
インスタンスにアクセスできない場合
システムディスクの過去のスナップショットが利用可能な場合は、まず 新しいスナップショットを作成 して現在のデータをバックアップすることを推奨します。その後、過去のスナップショットを使用してシステムディスクをロールバック し、インスタンスが復元されたことを確認します。
過去のスナップショットが利用できない場合は、問題のインスタンスと 同じゾーン にある正常な Linux インスタンスを準備します。その後、問題のインスタンスのシステムディスクを正常なインスタンスにアタッチすることで nofile パラメーターを変更できます。
-
システムディスクをデタッチします。
問題のインスタンスが [停止済み] 状態であることを確認し、次の手順を実行します。
-
意図しないデータ損失を防ぐため、システムディスクの 手動スナップショットを作成 します。
-
ECS コンソール - インスタンス ページに移動します。左上の隅で、インスタンスが配置されているリソースグループとリージョンを選択します。
-
問題のインスタンスの ID をクリックして インスタンスの詳細 ページに移動し、ブロックストレージ タブをクリックします。
-
システムディスク セクションの 操作 列で、 を選択します。
-
ディスクのデタッチ ダイアログボックスで、情報を確認して OK をクリックします。インスタンスのステータスが システムディスクなし に変わると、ディスクは正常にデタッチされます。
-
-
正常なインスタンスにデータディスクとしてディスクをアタッチします。
正常なインスタンスが [実行中] 状態であることを確認し、次の手順を実行します。
-
問題のインスタンスのシステムディスクを正常なインスタンスにアタッチします。
-
正常なインスタンスの ID をクリックして、その詳細ページに移動します。
-
ブロックストレージ タブをクリックし、ディスクのアタッチ をクリックします。
-
インスタンスにアタッチ ページで、ターゲットディスク セクションからデタッチされたシステムディスクを選択し、次へ をクリックします。
-
パーティショニングとファイルシステムのマウント ページで、[後で設定] を選択してアタッチを完了します。
-
-
接続 をクリックし、ワークベンチ を選択します。画面の指示に従い、root ユーザー としてログオンし、ターミナルを開きます。
-
ファイルシステムをマウントします。
-
問題のディスクのパーティション名を特定します。
lsblk -fvda ├─vda1 ├─vda2 vfat 7938-FA03 /boot/efi └─vda3 ext4 root 33b46ac5-7482-4aa5-8de0-60ab4c3a4c78 / vdb ├─vdb1 ├─vdb2 vfat 7938-FA03 └─vdb3 ext4 root 33b46ac5-7482-4aa5-8de0-60ab4c3a4c78この例では、問題のディスク
vdbのルートパーティションはvdb3です。これがマウントする必要があるパーティションです。パーティションは次のように説明されます。-
vdb1/vdb2:これらのパーティションにはシステムブートファイルが含まれており、無視できます。
-
vdb3:これは、オペレーティングシステムファイルとユーザーデータを含むルートパーティションです。マウントする必要があります。
-
-
ディレクトリを作成し、ファイルシステムをマウントします。
mkdir <mount_point> && sudo mount /dev/<partition_name> <mount_point>パラメーター
説明
<partition_name>前の手順で特定した問題のディスクのルートパーティションの名前。
<mount_point>/で始まる一意の空のパス。重要空でないディレクトリにファイルシステムをマウントすると、そのディレクトリ内の元のファイルは非表示になり、アクセスできなくなります。注意して進めてください。
たとえば、対象パーティション
vdb3を新しく作成した/testディレクトリにマウントするには、mkdir /test && sudo mount /dev/vdb3 /testコマンドを実行します。 -
マウント結果を確認します。
lsblkコマンドを実行します。対象パーティションのMOUNTPOINT列にマウントポイントが表示されていれば、ファイルシステムは正常にマウントされています。
-
-
-
設定ファイルを変更します。
<mount_point>/etc/security/limits.conf ファイルを編集します。
hard nofileおよびsoft nofileパラメーターの値をデフォルトの65535に変更します。その後、ファイルを保存して終了します。* soft nofile 65535 * hard nofile 65535 root soft nofile 65535 root hard nofile 65535-
アスタリスク (
*) はすべての一般ユーザーに適用され、rootは root ユーザーに適用されます。 -
hard nofile: オープンファイル数のハードリミットを指定します。この値は、カーネルパラメーター<mount point>/proc/sys/fs/nr_openの値を超えることはできません。そうしないと、インスタンスにログインできなくなる可能性があります。 -
soft nofile:オープンファイルの数の現在の制限です。この値はhard nofileの制限を超えることはできません。超えた場合、この設定は無視されます。soft nofileの値がhard nofileの値より大きい場合、有効なnofileの値はhard nofileパラメーターの値になります。
-
-
ディスクをシステムディスクとして元の ECS インスタンスにアタッチし直します。
-
ファイルシステムをアンマウントします。
<mount_point>を実際の マウントポイント に置き換えます。umount <mount_point>たとえば、
umount /testコマンドを実行します。 -
修復したシステムディスクをデタッチします。
-
ECS コンソールに戻り、正常なインスタンスの詳細ページの ブロックストレージ タブに移動します。
-
修復したシステムディスクの 操作 列で、デタッチ をクリックします。
-
ディスクのデタッチ ダイアログボックスで、OK をクリックします。
-
-
修復したシステムディスクを元のインスタンスにアタッチし直します。
-
問題のインスタンスの詳細ページの ブロックストレージ タブに移動し、ディスクのアタッチ をクリックします。
-
インスタンスにアタッチ ページで、ターゲットディスク リストから修復したシステムディスクを選択します。ログイン情報 を設定し、次へ をクリックします。
-
パーティショニングとファイルシステムのマウント ページで、[後で設定] を選択してアタッチを完了します。
-
-
ECS インスタンスを起動します。
-
-
元の ECS インスタンスにログオンし、正常に機能することを確認します。
推奨事項
-
コアシステムファイルの慎重な取り扱い:重要なシステムファイルを変更する前に、必ず 手動スナップショットを作成 してください。リスクを理解し、必要な変更のみを行うようにしてください。
-
監視とアラートの設定:重要なインスタンスの
ulimit -n設定を監視してください。ulimit -nの実行時の値を意図した設定と定期的に照合することで、リソース制限を検証し、不正な変更に対するアラートを受け取ることができます。
> デタッチ