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 (読み込みまたは書き込み) 要求は、ボリュームがそれらを傍受する前に、複数のレイヤーを通過します。これらのレイヤーには、ユーザー空間、仮想ファイルシステム、ページキャッシュ、ブロックレイヤー、スケジューラ、およびデバイスドライバーが含まれます。blktrace、blkparse、および 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
注: Kyber と mq-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 スケジューラは設定されたままです。