本文介紹Linux系統的ECS執行個體中NVMe磁碟IO逾時參數配置不當,導致NVMe磁碟不可用時的問題原因及解決方案。
問題描述
Linux系統的ECS執行個體使用NVMe系統硬碟後,出現非預期的慢I/O讀寫,導致系統或者應用程式對於NVMe磁碟的I/O操作失敗。NVMe磁碟上的檔案系統從原來掛載的可讀、寫的狀態,切換為唯讀不可寫的狀態,後續的寫操作均失敗,從而導致系統和應用程式異常或者業務中斷。
慢I/O讀寫是指在磁碟讀寫過程中,輸入/輸出操作的執行速度低於期望或需要的時間。
問題原因
NVMe驅動中的 io_timeout
參數控制了最大能夠容忍的I/O逾時時間,如果I/O讀寫操作的延遲過高,超過了該參數的配置值,則NVMe驅動會返回I/O失敗,可能導致NVMe磁碟上的檔案系統從原來掛載的可讀、寫的狀態,切換為唯讀不可寫的狀態,後續的寫操作均失敗,從而導致系統和應用程式異常或者業務中斷。
大部分Linux發行版本中
io_timeout
參數預設配置為30秒。為了減少NVMe磁碟的IO操作逾時出現的異常情況,通常需要將io_timeout
參數設定為最大值。在新版本的核心中,io_timeout
參數的最大值為4,294,967,295秒,較早版本中為255秒。不同的版本核心中,NVMe驅動的核心模組也不同,部分核心模組為
nvme.ko
,部分核心模組為nvme_core.ko
,所以完整的逾時參數名稱存在nvme.io_timeout
和nvme_core.io_timeout
兩種可能。
解決方案
配置io_timeout
參數(臨時配置)
您可以通過以下操作臨時配置NVMe驅動的io_timeout
參數。該方式僅單次生效,重啟執行個體後需要重新設定。
遠端連線ECS執行個體。
具體操作,請參見串連方式概述。
檢查
io_timeout
參數所在的核心模組路徑。執行以下命令,檢查
/sys/module/nvme_core/parameters/io_timeout
路徑是否存在,如果存在則表示完整的參數名稱為nvme_core.io_timeout
。cat /sys/module/nvme_core/parameters/io_timeout
如果不存在以上路徑,請執行以下命令,檢查
/sys/module/nvme/parameters/io_timeout
路徑是否存在,如果存在則表示完整的參數名稱為nvme.io_timeout
。cat /sys/module/nvme/parameters/io_timeout
執行以下命令,嘗試將最大值4,294,967,295寫入到核心模組路徑。
核心模組為
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
參數的最大值修改為4,294,967,295。如果出現類似於
Numerical result out of range
的錯誤,重新執行該步驟,將io_timeout
參數的最大值修改為255。
手動修改GRUB中的核心啟動參數(永久配置)
您也可以手動在GRUB中修改io_timeout
參數或通過雲助手的ecs_nvme_config
外掛程式協助您快速完成作業系統內NVMe相關的配置。具體操作,請參見如何為已有自訂鏡像安裝NVMe驅動?該方式永久生效,不受執行個體啟動等因素影響。