EC2 Nitro ベースのインスタンスでホストされている EBS ボリュームで最大の I/O パフォーマンスを得るにはどうすればよいですか?

最終更新日: 2021 年 6 月 14 日

Amazon Elastic Compute Cloud (Amazon EC2) の Nitro ベースのインスタンスでワークロードを実行しています。インスタンスでホストしている Amazon Elastic Block Store (Amazon EBS) ボリュームで最大の I/O パフォーマンスを確実に得るにはどうすればよいですか?

解決方法

1.    EBS ボリュームが IOPS 上限に達していないことを確認します。ボリュームが IOPS 上限に達すると、レイテンシーが増大します。レイテンシーの増大はパフォーマンスに悪影響を及ぼします。ボリュームパフォーマンスの最適化の詳細については、Amazon EBS プロビジョンド IOPS ボリュームのパフォーマンスを最適化するにはどうすれば良いですか? を参照してください。

GP2 ボリュームを使用している場合は、ボリュームがバーストクレジットを使い果たしていないことを確認してください

2.    NVMe ストレージによって実現されるパフォーマンスの利点を活用するには、次のいずれかのオペレーティングシステムを実行する必要があります。または、カーネルのバージョンがマルチキュー機能を備えた I/O スケジューラをサポートしていることを確認してください。最も一般的に使用されるマルチキュー I/O スケジューラは、kyber、mq-deadline、bfq (バジェットフェアキュー) です。

  • Amazon Linux AMI 以降およびカーネル 4.12 以降
  • CentOS - 7.0 以降およびカーネル 3.10 以降
  • Red Hat - 7.0 以降およびカーネル 3.10 以降
  • Ubuntu 19.10 のカーネル 5.0 または Ubuntu 18.04.03 のカーネル 5.0 以降マルチキューはデフォルトで有効になっています
  • Ubuntu - 16.04 または 16.10 マルチキュースケジューラはカーネルコンパイルされず、個別のモジュールロードが必要です
  • SUSE 12 または SUSE 11 の SP3 以降
  • Windows Server 2008 R2、2012 R2、および 2016 以降

: Oracle、Linux、Debian などのオペレーティングシステムでは、マルチキュー I/O スケジューラを含む、またはサポートするカーネルバージョンを使用してください。CentOS オペレーティングシステムとそのカーネルバージョンでは、マルチキュー I/O スケジューラがサポートされています。

上記のオペレーティングシステムよりも古いオペレーティングシステムを使用している場合は、I/O パフォーマンスがわずかに低下することがあります。これは、CentOS 6 の I/O スケジューラが複数のキューをサポートしない単純なスケジューラであるためです。Nitro ベースのインスタンスでは、ホストレベルでマルチキュー処理が行われます。これにより、オペレーティングシステムとホストレベルでスケジューラが非互換になり、パフォーマンスが低下する可能性があります。

EBS ボリュームに送信された I/O (読み込みまたは書き込み) 要求は、ボリュームがそれらを傍受する前に、複数のレイヤーを通過します。これらのレイヤーには、ユーザー空間、仮想ファイルシステム、ページキャッシュ、ブロックレイヤー、スケジューラ、およびデバイスドライバーが含まれます。blktraceblkparse、および btt ツールを使用したテストとベンチマークの結果は、Nitro ベースのインスタンスで非マルチキュースケジューラを持つ古いカーネルバージョンを使用する場合、I/O スケジューラ (I2D) レイヤーにわずかな遅延を示します。

I/O スケジューラは、I/O のマージ、処理、キューイングにおいて重要な役割を果たします。Nitro ベースのシステムでは、EBS ボリュームは NVMe ブロックデバイスとして公開されます。NVME は、複数のハードウェア送信キューと完了キューをネイティブでサポートします。CentOS 7 には、デバイスドライバが I/O 要求を複数のハードウェアまたはソフトウェアキューにマッピングできるマルチキューブロック I/O キューイングメカニズム (blk-mq) があります。これにより、カーネルのマルチキュー機能のため、Nitro ベースのインスタンスでの I/O パフォーマンスが向上します。以前のカーネルバージョンにはこの機能がありません。このため、Nitro ベースのシステムで最大のパフォーマンスを得るために、最新のカーネルを搭載した最新のオペレーティングシステムを使用するのがベストプラクティスです。

CentOS 6 の I/O スケジューラ

$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 カーネルの設定ファイルは、noop スケジューラを使用しているため blk_mq を返しません

CentOS 7、カーネル 3.10 以降の I/O スケジューラ

$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

I/O スケジューラを永続的に変更するには、grub 構成を変更し、次の形式でエレベータパラメータを更新します。

注: 次の手順は 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 インスタンスが再起動された場合でも、I/O スケジューラは設定されたままです。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?