本文分享自天翼云开发者社区《Centos系统云主机中nvme盘不可用解决方法》,作者:P**n

问题描述
Linux系统的云主机使用NVMe盘后,出现非预期的慢IO读写,导致系统或者应用程序对于NVMe磁盘的IO操作失败。系统将nvme盘踢出,在系统中通过lsblk查看不到nvme盘,后续的读写操作均失败,从而导致系统和应用程序异常或者业务中断。
问题原因
NVMe驱动中的 io_timeout参数控制了最大能够容忍的IO超时时间,在大部分Linux发行版本中默认配置为30秒。如果IO读写操作的延迟过高,超过了该参数的配置值,则NVMe驱动会返回IO失败。在特定情况下,系统或者应用程序可以对IO操作进行重试。但在某些情况下,可能导致系统或者应用程序对于NVMe磁盘的IO操作失败。系统将nvme盘踢出,在系统中通过lsblk查看不到nvme盘,后续的读写操作均失败,从而导致系统和应用程序异常或者业务中断。
为了减少NVMe磁盘的IO操作超时出现的异常情况,通常会将 io_timeout参数设置为可能的最大值,提高对于IO延迟的容忍度。在新版本的内核中,io_timeout参数的最大值为4,294,967,295,较早版本中为255。不同的版本的内核中,NVMe驱动的内核模块也有所不同,部分内核模块为nvme.ko ,或者部分内核模块为nvme_core.ko,从而完整的参数名称也存在nvme.io_timeout和nvme_core.io_timeout两种可能。
解决方案
1、远程连接CentOS云主机。
2、执行以下命令,查看系统内核是否已经加载了NVMe驱动。
cat /boot/config-uname -r | grep -i nvme | grep -v "^#"
系统显示类似如下,如果存在CONFIG_BLK_DEV_NVME=y,则表示该镜像已经加载NVMe驱动。
CONFIG_NVME_CORE=m
CONFIG_BLK_DEV_NVME=y
CONFIG_BLK_DEV_NVME_SCSI=y
CONFIG_NVME_FABRICS=m
CONFIG_NVME_RDMA=m
CONFIG_NVME_FC=m
CONFIG_NVME_TARGET=m
CONFIG_NVME_TARGET_LOOP=m
CONFIG_NVME_TARGET_RDMA=m
CONFIG_NVME_TARGET_FC=m
CONFIG_NVME_TARGET_FCLOOP=m
CONFIG_NVMEM=y
3、在GRUB中添加NVMe相关的nvme timeout参数。
1)执行以下命令,打开grub文件。
vi /etc/default/grub
2)按i键进入编辑模式,确认io_timeout参数的完整参数名称和所能接受的最大值。例如,完整参数名称为nvme_core.io_timeout,所能接受的最大值为 4,294,967,295。则请在GRUB_CMDLINE_LINUX=一行中,添加nvme_core.io_timeout=4294967295 nvme_core.admin_timeout=4294967295参数信息。 添加参数后,文件内容如下图所示:

3)按Esc键退出编辑模式,输入:wq并按Enter键,保存退出文件。
4)根据操作系统的启动方式不同,执行以下适用于您的操作系统的命令,使配置的GRUB生效:
Legacy启动方式
grub2-mkconfig -o /boot/grub2/grub.cfg
UEFI启动方式
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
5)执行以下命令,重启实例,使配置生效。
reboot
6)执行以下命令,确认相关配置已正确传递给内核。
cat /proc/cmdline
系统显示类似如下。
... nvme_core.io_timeout=4294967295 nvme_core.admin_timeout=4294967295
7)执行以下命令,确认NVMe驱动参数已正确配置IO超时参数。
cat /sys/module/nvme_core/parameters/io_timeout
系统显示类似如下。
4294967295


天翼云开发者社区
91 声望2 粉丝

天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。


引用和评论

0 条评论