如何从基于 EC2 Nitro 的实例上托管的 EBS 卷获得最大输入/输出性能?

上次更新时间:2021 年 6 月 14 日

我正在基于 Amazon Elastic Compute Cloud (Amazon EC2) Nitro 的实例上运行工作负载。我如何确保从托管在我的实例上的 Amazon Elastic Block Store (Amazon EBS) 卷获得最佳的输入/输出性能?

解决方法

1.    验证您的 EBS 卷没有达到 IOPS 限制。如果您的卷达到其 IOPS 限制,则延迟会增加。延迟增加会对性能产生负面影响。有关优化卷性能的信息,请参阅如何优化 Amazon EBS 预置 IOPS 卷的性能?

如果您使用的是 GP2 卷,则检查并确认您的卷尚未耗尽突增积分

2.    要从 NVMe 存储所提供的性能中获益,必须运行下列操作系统之一。或者,请确保内核版本支持具有多队列功能的输入/输出调度器。最常用的多队列输入/输出调度器是 kyber、mq-deadline 和 bfq(预算公平队列)。

  • Amazon Linux AMI 或更高版本,内核 4.12 及以上版本
  • CentOS - 7.0 或更高版本,内核 3.10 及以上版本
  • Red Hat - 7.0 或更高版本,内核 3.10 及以上版本
  • 默认情况下,使用内核 5.0 的 Ubuntu 19.10 或启用内核 5.0 及以上版本多队列功能的 Ubuntu 18.04.03
  • Ubuntu - 16.04 或 16.10 多队列调度器未编译内核,需要单独加载模块
  • SP3 或更高版本的 SUSE 12 或 SUSE 11
  • Windows Server 2008 R2、2012 R2 和 2016 或更高版本

注意:对于 Oracle、Linux、Debian 等操作系统,请确保使用包括或支持多队列输入/输出调度器的内核版本。CentOS 操作系统及其内核版本支持多队列输入/输出调度器。

如果您使用的操作系统比列出的操作系统早,则输入/输出性能可能会略有下降。这是因为 CentOS 6 上的输入/输出调度器是一个简单的调度器,不支持多队列。基于 Nitro 的实例在主机级别具有多队列处理功能。这会造成操作系统和主机级别的调度器不兼容,并可能导致性能下降。

提交给 EBS 卷的输入/输出(读取或写入)请求在卷截获之前会经过多个层传输。这些层包括用户空间、虚拟文件系统、页面缓存、数据块层、调度器和设备驱动程序。使用 blktraceblkparsebtt 工具的测试和基准测试结果显示,在基于 Nitro 的实例上使用带有非多队列调度器的旧内核版本时,输入/输出调度器 (I2D) 层略有延迟。

输入/输出调度器在输入/输出合并、处理和排队方面发挥着重要作用。在基于 Nitro 的系统中,EBS 卷显示为 NVMe 数据块设备。NVMe 本身支持多硬件提交和完成队列。CentOS 7 具有多队列数据块输入/输出排队机制 (blk-mq),允许设备驱动程序将输入/输出请求映射到多个硬件或软件队列。由于内核具有多队列功能,这提高了基于 Nitro 的实例的输入/输出性能。早期的内核版本没有此功能。因此,最佳实践是使用带有最新内核的现代操作系统,在基于 Nitro 的系统上实现最佳性能。

CentOS 6 上的输入/输出调度器

$cat /sys/block/xvdf/queue/scheduler noop anticipatory deadline [cfq]
$cat config-2.6.32-754.30.2.el6.x86_64 | grep -i blk_mq

注意:CentOS 6 内核中的配置文件不会返回 blk_mq,因为它使用 noop 调度器

CentOS 7 上的输入/输出调度器,内核 3.10 及以上版本

$cat /sys/block/nvme1n1/queue/scheduler [none] mq-deadline kyber

注意:Kybermq-deadline 是多队列调度器,仅存在于较高的内核版本中(CentOS 7 的内核 3.10 及以上版本)。

要在 EC2 实例运行期间在操作系统级别更新调度器,请使用以下命令:

#sudo echo 'kyber'> /sys/block/xvdf/queue/scheduler

要永久更改输入/输出调度器,请修改 grub 配置并按以下格式更新 elevator 参数:

注意:以下步骤适用于 CentOS 和 RHEL。

1.    运行以下命令:

#sudo vim /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet elevator=kyber"

2.    运行以下命令:

#sudo grub2-mkconfig -o /boot/grub2/grub.cfg

即使 EC2 实例已重启,输入/输出调度器仍保持设置状态。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?