Amazon Elastic Compute Cloud
用户指南(适用于 Linux 实例)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

Amazon EBS 和 NVMe

基于 Nitro 的实例上,EBS 卷显示为 NVMe 块储存设备。设备名称为 /dev/nvme0n1/dev/nvme1n1,以此类推。您在块储存设备映射中指定的设备名称将使用 NVMe 设备名称 (/dev/nvme[0-26]n1) 进行重命名。块储存设备驱动程序可以使用不同于您在块储存设备映射中为卷指定的顺序来分配 NVMe 设备名称。

注意

无论块储存设备接口如何,Amazon EBS 产品详细信息中声明的 EBS 性能保证都有效。

其中一些实例类型还支持 NVMe 实例存储卷。有关更多信息,请参阅NVMe SSD 卷

识别 EBS 设备

EBS 使用单一根 I/O 虚拟化 (SR-IOV) 在使用 NVMe 规范的基于 Nitro 的实例上提供卷附加。这些设备依赖于操作系统上的标准 NVMe 驱动程序。这些驱动程序通常在实例启动期间通过扫描 PCI 总线来发现连接的设备,然后根据设备响应的顺序创建设备节点,而不是按照在块储存设备映射中指定设备的顺序。在 Linux 中,NVMe 设备名称遵循 /dev/nvme<x>n<y> 模式,其中 <x> 是枚举顺序,对于 EBS,<y> 为 1。有时候,在接下来的实例启动时,设备会以不同顺序响应发现过程,这会导致设备名称更改。

建议您在实例中为 EBS 卷使用静态标识符,例如以下之一:

  • 对基于 Nitro 的实例,您在连接 EBS 卷或者在 AttachVolumeRunInstances API 调用期间通过 Amazon EC2 控制台指定的块储存设备映射,将在 NVMe 控制器标识的供应商特定数据字段中捕获。对版本高于 2017.09.01 的 Amazon Linux AMI,我们提供了 udev 规则,该规则读取此数据并创建指向块储存设备映射的符号链接。

  • NVMe 连接的 EBS 卷在设备标识中将 EBS 卷 ID 设置为序列号。

  • 格式化设备时,将生成在文件系统的使用寿命内保持的 UUID。此时可指定设备标签。有关更多信息,请参阅使 Amazon EBS 卷可在 Linux 上使用从错误的卷启动

Amazon Linux AMI

利用 Amazon Linux AMI 2017.09.01 或更高版本(包括 Amazon Linux 2),您可以按下面所示运行 ebsnvme-id 命令以将 NVMe 设备名称映射到卷 ID 和设备名称:

[ec2-user ~]$ sudo /sbin/ebsnvme-id /dev/nvme1n1 Volume ID: vol-01324f611e2463981 /dev/sdf

Amazon Linux 还将创建从块储存设备映射中的设备名称(例如,/dev/sdf)到 NVMe 设备名称的符号链接。

其他 Linux AMI

利用内核版本 4.2 或更高版本,您可以按下面所示运行 nvme id-ctrl 命令以将 NVMe 设备映射到卷 ID。首先,使用您的 Linux 发行版的程序包管理工具安装 NVMe 命令行程序包 nvme-cli

以下示例将获取卷 ID 和设备名称。设备名称通过特定于 NVMe 控制器供应商的扩展(控制器标识的字节 384:4095)提供:

[ec2-user ~]$ sudo nvme id-ctrl -v /dev/nvme1n1 NVME Identify Controller: vid : 0x1d0f ssvid : 0x1d0f sn : vol01234567890abcdef mn : Amazon Elastic Block Store ... 0000: 2f 64 65 76 2f 73 64 6a 20 20 20 20 20 20 20 20 "/dev/sdf..."

lsblk 命令可列出可用设备及其装载点(如果适用)。这有助于确定要使用的正确设备名称。在本示例中,/dev/nvme0n1p1 作为根设备装载,/dev/nvme1n1 会附加但不会装载。

[ec2-user ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme1n1 259:3 0 100G 0 disk nvme0n1 259:0 0 8G 0 disk nvme0n1p1 259:1 0 8G 0 part / nvme0n1p128 259:2 0 1M 0 part

使用 NVMe EBS 卷

如果您使用的是 Linux 内核 4.2 或更高版本,您对 NVMe EBS 卷的卷大小进行的所有更改将自动在实例中反映。对于旧版 Linux 内核,您可能需要分离然后附加 EBS 卷或者重启实例才能反映大小更改。对于 Linux 内核 3.19 或更高版本,您可以按下面所示使用 hdparm 命令强制重新扫描 NVMe 设备:

[ec2-user ~]$ sudo hdparm -z /dev/nvme1n1

在分离 NVMe EBS 卷之前,您应该同步并卸载它。当您分离 NVMe EBS 卷时,强制执行选项会隐式启用。因此,在分离卷之前,实例没有机会刷新文件系统缓存或元数据。

I/O 操作超时

连接到基于 Nitro 系统的实例的 EBS 卷使用操作系统提供的默认 NVMe 驱动程序。大多数操作系统为提交到 NVMe 设备的 I/O 操作指定一个超时。默认超时为 30 秒,可以使用 nvme_core.io_timeout 引导参数(对于版本 4.6 之前的 Linux 内核为 nvme.io_timeout 引导参数)更改。为了进行测试,您还可以使用常用的文本编辑器,通过写入 /sys/module/nvme_core/parameters/io_timeout 来动态更新超时。如果 I/O 延迟超过了此参数的值,Linux NVMe 驱动程序会使 I/O 失败,将错误返回文件系统或应用程序。根据 I/O 操作,您的文件系统或应用程序可以重试错误。在某些情况下,您的文件系统可通过只读方式重新装载。

为了获得与附加到 Xen 实例的 EBS 卷类似的体验,我们建议将该超时设置为可能的最大值。对于当前内核,最大值为 4294967295,而对于较早的内核,最大值为 255。对于以下 Linux 发行版,nvme.io_timeout 引导参数已经设置为最大值:

  • Amazon LinuxAMI 2017.09.01 或更高版本

  • Canonical 4.4.0-1041 或更高版本

  • SLES 12 SP2(4.4 内核)或更高版本

  • RHEL 7.5(3.10.0-862 内核)或更高版本

您可以通过将高于建议最大值的值写入 /sys/module/nvme_core/parameters/io_timeout 并在尝试保存文件时检查 Numerical result out of range 错误,以此来验证您的 Linux 发行版的最大值。