全部產品
Search
文件中心

:Linux系統的ECS執行個體中NVMe磁碟IO逾時參數配置不當, 導致NVMe磁碟不可用如何處理?

更新時間:Jul 17, 2024

本文介紹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_timeoutnvme_core.io_timeout兩種可能。

解決方案

配置io_timeout參數(臨時配置)

您可以通過以下操作臨時配置NVMe驅動的io_timeout參數。該方式僅單次生效,重啟執行個體後需要重新設定。

  1. 遠端連線ECS執行個體。

    具體操作,請參見串連方式概述

  2. 檢查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
  3. 執行以下命令,嘗試將最大值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驅動?該方式永久生效,不受執行個體啟動等因素影響。