このトピックでは、無効なio_timeoutパラメーターが原因でLinux Elastic Compute Service (ECS) インスタンス上の不揮発性メモリエクスプレス (NVMe) ディスクが利用できないという問題の原因と解決策について説明します。
問題の説明
Linux ECSインスタンスがNVMeディスクをシステムディスクとして使用する場合、インスタンスでのI/O読み取り /書き込み操作が遅くなります。 その結果、インスタンスのオペレーティングシステムまたはインスタンスでホストされているアプリケーションは、NVMeディスクでI/O読み取り /書き込み操作を実行できません。 NVMeディスク上のファイルシステムのステータスが読み取り /書き込みから読み取り専用に変更されます。 NVMeディスクでのその後の書き込み操作は失敗し、オペレーティングシステムとアプリケーションは期待どおりのサービスを提供できません。
低速I/O読み取り /書き込みとは、ディスク上のI/O読み取り /書き込み操作が、予想よりも低いレートで実行されるか、または完了するまでに長時間を必要とするシナリオを指します。
原因
NVMeドライバーのio_timeout
パラメーターには、最大I/Oタイムアウト期間を指定します。 I/O操作のレイテンシがio_timeoutパラメーターの値を超えると、NVMeドライバーはI/O操作に失敗し、エラーを返します。 その結果、NVMeディスク上のファイルシステムのステータスが読み取り /書き込みから読み取り専用に変更される場合があります。 NVMeディスクのステータスが読み取り専用に変更された場合、その後のディスクへの書き込み操作は失敗し、インスタンスのオペレーティングシステムまたはインスタンスでホストされているアプリケーションは期待どおりのサービスを提供できません。
ほとんどのLinuxディストリビューションでは、
io_timeout
パラメーターはデフォルト値の30に設定されています。 単位は秒です。 NVMeディスクでのI/O操作のタイムアウトエラーを防ぐには、io_timeout
パラメーターをサポートされている最大値に設定します。 最近のカーネルバージョンでは、サポートされているio_timeout
パラメーターの最大値は4294967295です。 単位は秒です。 以前のカーネルバージョンでは、サポートされる最大値は255です。 単位は秒です。NVMeドライバのカーネルモジュールは、カーネルのバージョンによって異なります。 NVMeドライバーには、
nvme.ko
およびnvme_core.ko
のカーネルモジュールが使用されます。 io_timeoutパラメーターのフルネームは、nvme.io_timeout
またはnvme_core.io_timeout
です。
解決策
io_timeout
パラメーターを一時的に設定する
io_timeout
パラメーターを設定するには、次の手順を実行します。 io_timeoutパラメーターに指定する値は一時的です。 Linux ECSインスタンスを再起動するたびに、io_timeoutパラメーターをリセットする必要があります。
Linux ECSインスタンスに接続します。
詳細については、「接続方法の概要」をご参照ください。
io_timeout
パラメーターを含むカーネルモジュールのパスを確認します。次のコマンドを実行して、
/sys/module/nvme_core/parameters/io_timeout
パスが存在するかどうかを確認します。 パスが存在する場合、io_timeoutパラメーターのフルネームはnvme_core.io_timeout
です。cat /sys/module/nvme_core/parameters/io_timeout
パスが存在しない場合は、次のコマンドを実行して、
/sys/module/nvme/parameters/io_timeout
パスが存在するかどうかを確認します。 パスが存在する場合、io_timeoutパラメーターのフルネームはnvme.io_timeout
です。cat /sys/module/nvme/parameters/io_timeout
次のいずれかのコマンドを実行して、前の手順で取得したパスに4294967295を書き込みます。
nvme.koカーネルモジュール
sudo sh -c 'echo 4294967295 > /sys/module/nvme/parameters/io_timeout '
nvme_core.koカーネルモジュール
sudo sh -c 'echo 4294967295 > /sys/module/nvme_core/parameters/io_timeout '
コマンドが正常に実行され、エラーが返されない場合、
io_timeout
パラメーターは4294967295に設定されます。Numerical result out of range
に似たエラーメッセージが返された場合は、この手順を繰り返してio_timeout
パラメーターを255に設定します。
io_timeoutパラメーターの設定
GRand Unified Bootloader (GRUB) 設定ファイルのio_timeout
パラメーターの値を変更するか、Cloud Assistantのecs_nvme_config
プラグインを使用して、インスタンスオペレーティングシステムでNVMe関連の設定を設定できます。 詳細については、「」をご参照ください。カスタムイメージ用のNVMeドライバをインストールするにはどうすればよいですか? io_timeoutパラメーターに指定する値は永続的であり、インスタンスの起動などの要因の影響を受けません。