排查 NVMe 磁盘问题


本文档列出了使用具有非易失性存储规范 (NVMe) 接口的磁盘时可能遇到的错误。

您可以将 NVMe 接口用于本地 SSD 和永久性磁盘(Persistent Disk 或 Google Cloud Hyperdisk)。只有最新的机器系列(如 Tau T2A、M3、C3、C3D 和 H3)才对 Persistent Disk 使用 NVMe 接口。机密虚拟机也使用 NVMe Persistent Disk。所有其他 Compute Engine 机器系列都为永久性磁盘使用 SCSI 磁盘接口。

I/O 操作超时错误

如果您遇到 I/O 超时错误,则延迟时间可能会超过提交到 NVMe 设备的 I/O 操作的默认超时参数。

错误消息

[1369407.045521] nvme nvme0: I/O 252 QID 2 timeout, aborting
[1369407.050941] nvme nvme0: I/O 253 QID 2 timeout, aborting
[1369407.056354] nvme nvme0: I/O 254 QID 2 timeout, aborting
[1369407.061766] nvme nvme0: I/O 255 QID 2 timeout, aborting
[1369407.067168] nvme nvme0: I/O 256 QID 2 timeout, aborting
[1369407.072583] nvme nvme0: I/O 257 QID 2 timeout, aborting
[1369407.077987] nvme nvme0: I/O 258 QID 2 timeout, aborting
[1369407.083395] nvme nvme0: I/O 259 QID 2 timeout, aborting
[1369407.088802] nvme nvme0: I/O 260 QID 2 timeout, aborting
...

解决方法

如需解决此问题,请增加超时参数的值。

  1. 查看超时参数的当前值。

    1. 确定永久性磁盘或本地 SSD 卷使用的 NVMe 控制器。
      ls -l /dev/disk/by-id
      
    2. 显示磁盘的 io_timeout 设置(以秒为单位)。

      cat /sys/class/nvme/CONTROLLER_ID/NAMESPACE/queue/io_timeout
      
      替换以下内容:

      • CONTROLLER_ID:NVMe 磁盘控制器的 ID,例如 nvme1
      • NAMESPACE:NVMe 磁盘的命名空间,例如 nvme1n1

      如果您只有一个使用 NVMe 的磁盘,请使用以下命令:

      cat /sys/class/nvme/nvme0/nvme0n1/queue/io_timeout
      

  2. 如需增加提交到 NVMe 设备的 I/O 操作的超时参数,请将以下行添加到 /lib/udev/rules.d/65-gce-disk-naming.rules 文件中,然后重启虚拟机:

    KERNEL=="nvme*n*", ENV{DEVTYPE}=="disk", ATTRS{model}=="nvme_card-pd", ATTR{queue/io_timeout}="4294967295"
    

已分离的磁盘仍出现在计算实例的操作系统中

在使用 Linux 内核版本 6.0 到 6.2 的虚拟机上,涉及 Compute Engine API 方法 instances.detachDiskgcloud compute instances detach-disk 命令的操作可能无法按预期运行。 Google Cloud 控制台将设备显示为已移除,计算实例元数据(compute disks describe 命令)将设备显示为已移除,但设备装载点以及由 udev 规则创建的任何符号链接仍会出现在客机操作系统。

错误消息

尝试从虚拟机上已分离的磁盘进行读取导致 I/O 错误:

sudo head /dev/nvme0n3

head: error reading '/dev/nvme0n3': Input/output error

问题

使用 Linux 6.0-6.2 内核但不包含 NVMe 修复的向后移植的操作系统映像在分离 NVMe 磁盘时无法识别。

解决方法

重启虚拟机以完成移除磁盘的过程。

为避免此问题,请使用具有不存在此问题的 Linux 内核版本的操作系统:

  • 5.19 或更早版本
  • 6.3 或更高版本

您可以在客户机操作系统中使用 uname -r 命令查看 Linux 内核版本。

后续步骤