Elastic Compute Service (ECS) インスタンスの永続メモリは、インスタンスタイプに基づいてメモリまたはローカルディスクとして使用できます。このトピックでは、永続メモリをローカルディスクとして設定する方法について説明します。また、永続メモリをローカルディスクとして使用できる ecs.re6p または ecs.i4p 永続メモリ最適化インスタンスで、Low-Level Persistence Library (LLPL) を使用してメモリプールを割り当てられなかった場合の解決方法についても説明します。
前提条件
永続メモリは、以下のインスタンスタイプとイメージバージョンに適しています。
インスタンスタイプ
永続メモリをメモリとして使用できるインスタンスファミリー: ecs.re6p-redis
重要インスタンスで永続メモリをメモリとして使用する場合、以下の状況が発生します。
永続メモリを初期化する必要はなく、インスタンスを購入後すぐに使用できます。
メモリとして使用される永続メモリはデータの永続性を提供しないため、インスタンスが停止または再起動されると、永続メモリに保存されているデータは失われます。
永続メモリをローカルディスクとして使用できるインスタンスファミリー: ecs.re6p および ecs.i4p
重要インスタンスで永続メモリをローカルディスクとして使用する場合、以下の状況が発生します。
インスタンスを購入した後に、永続メモリを初期化できます。詳細については、このトピックの永続メモリをローカルディスクとして設定するセクションをご参照ください。
ローカルディスクとして使用される永続メモリはデータの永続性を提供しますが、データ損失が発生する可能性があります。事前にデータをバックアップすることをお勧めします。ローカルディスクの詳細については、「ローカルディスク」をご参照ください。
イメージバージョン
Alibaba Cloud Linux 2
CentOS 7.6 以降
Ubuntu 18.04 および 20.04
背景情報
永続メモリは通常のメモリに比べてアクセスレイテンシが高くなりますが、費用対効果が高く、ローカルストレージとしての使用に適しています。永続メモリに保存されたデータは、インスタンスを停止または再起動しても保持されます。永続メモリは、メモリまたはローカルディスクとして使用できます。
永続メモリをメモリとして使用する場合、高速ストレージアクセスを必要としない非ホットデータなど、一部のデータを通常のメモリから永続メモリに移動できます。永続メモリは、GiB あたりの価格が低い大容量を提供し、メモリ GiB あたりの総所有コスト (TCO) を削減するのに役立ちます。
永続メモリをローカルディスクとして使用する場合、ブロックレベルの読み取り/書き込み操作をサポートし、超高 I/O パフォーマンスと 170 ナノ秒という低レイテンシを実現します。一貫した応答時間を必要とするコアアプリケーションデータベースに永続メモリを使用できます。NVMe (Non-Volatile Memory Express) SSD を永続メモリベースのローカルディスクに置き換えることで、より高い IOPS、より高い帯域幅、より低いレイテンシを提供し、パフォーマンスボトルネックを解消できます。
永続メモリに保存されたデータの信頼性は、永続メモリデバイスの信頼性と、これらのデバイスが接続されている物理サーバーの信頼性によって異なります。単一障害点のリスクが存在します。アプリケーションデータの信頼性を確保するために、アプリケーション層でデータ冗長性を実装し、クラウドディスクを長期データストレージに使用することをお勧めします。
永続メモリをローカルディスクとして設定する
この例では、以下の構成を持つインスタンスを使用します。
インスタンスタイプ: ecs.re6p.2xlarge
イメージ: Alibaba Cloud Linux 2.1903 LTS 64 ビット
作成したインスタンスにログオンします。
詳細については、「Workbench を使用して SSH 経由で Linux インスタンスに接続する」をご参照ください。
次のコマンドを実行して、永続メモリを管理するために使用されるユーティリティをインストールし、すべての名前空間とラベルを削除します。
sudo yum install -y ndctl daxctl sudo ndctl disable-namespace all && sudo ndctl destroy-namespace all #すべての名前空間を削除します。 sudo ndctl disable-region all && sudo ndctl zero-labels all && sudo ndctl enable-region all #すべてのラベルを削除します。
永続メモリのサイズを確認します。
ndctl list -R
次の図は、コマンド出力の例を示しています。ここで、size パラメーターは永続メモリのサイズを示します。
使用モードを fsdax に設定します。
sudo ndctl create-namespace --reconfig=namespace0.0 -m fsdax --size={region-size} --force
説明{region-size} 変数を前の手順で取得した size 値に置き換えます。
次のコマンドを実行して、永続メモリ (/dev/pmem) デバイスをフォーマットしてマウントします。
sudo mkfs -t ext4 /dev/pmem0 sudo mkdir /mnt/sdb sudo mount -o dax,noatime /dev/pmem0 /mnt/sdb
マウントされた /dev/pmem デバイスを表示します。
df -h
/dev/pmem デバイスがマウントされた後、ディスクパフォーマンステストツールを使用してデバイスのパフォーマンスをテストできます。
i4p または re6p インスタンスのローカルディスクのパフォーマンスをテストする方法については、このトピックのi4p インスタンスのローカルディスクのパフォーマンスをテストするセクションをご参照ください。
i4p インスタンスのローカルディスクのパフォーマンスをテストする
この例では、次の構成とテストツールを使用します。
インスタンスタイプ: ecs.i4p.2xlarge
イメージ: Alibaba Cloud Linux 2.1903 LTS 64 ビット
テストツール: flexible I/O tester (fio)。fio は、ランダム読み取り/書き込み操作やシーケンシャル読み取り/書き込み操作など、ブロックストレージデバイスのパフォーマンスメトリックをテストできる、オープンソースの強力な I/O パフォーマンステストツールです。
fio ツールはデータ損失を引き起こす可能性があります。ローカルディスクのパフォーマンスをテストする前に、テストするローカルディスクにデータが含まれていないことを確認してください。
データを含むローカルディスクをテストする必要がある場合は、ディスクのパフォーマンスをテストする前にディスクデータをバックアップしてください。詳細については、「ローカルディスクのデータをバックアップする」をご参照ください。
ECS インスタンスに接続します。
詳細については、「Workbench を使用して SSH 経由で Linux インスタンスに接続する」をご参照ください。
次のコマンドを実行して、fio ツールをインストールします。
sudo yum install -y ndctl daxctl ipmctl libpmem librpmem libpmemblk libpmemlog libpmemobj libpmempool pmempool fio
コマンドを実行して、ローカルディスクのパフォーマンスをテストします。
サンプルコマンドについては、このトピックのIOPS をテストする、スループットをテストする、およびレイテンシをテストするセクションをご参照ください。
重要テストを連続して実行する場合は、各テストの後に
sudo rm /mnt/sdb/* -rf
コマンドを実行して、ローカルディスク上の前のテストの残留結果を削除し、次のテストのためにクリーンな環境を準備します。次の表は、ローカル NVMe (Non-Volatile Memory Express) SSD、企業向け SSD (ESSD)、および永続メモリベースのローカルディスクのパフォーマンス比較を示しています。
説明次の表のパフォーマンスデータは参考値です。テスト結果のデータが優先されます。
メトリック
128 GiB 永続メモリ
1,788 GiB NVMe SSD
800 GiB ESSD (パフォーマンスレベル 1 (PL1))
読み取り帯域幅
8 GB/s ~ 10 GB/s
2 GB/s ~ 3 GB/s
0.2 GB/s ~ 0.3 GB/s
読み取り/書き込み帯域幅
8 GB/s ~ 10 GB/s
1 GB/s ~ 2 GB/s
0.2 GB/s ~ 0.3 GB/s
書き込み帯域幅
2 GB/s ~ 3 GB/s
1 GB/s ~ 2 GB/s
0.2 GB/s ~ 0.3 GB/s
読み取り IOPS
1,000,000
500,000
20,000 ~ 30,000
読み取り/書き込み IOPS
1,000,000
300,000
20,000 ~ 30,000
書き込み IOPS
1,000,000
300,000
20,000 ~ 30,000
読み取りレイテンシ
300 ナノ秒~ 400 ナノ秒
100,000 ナノ秒
250,000 ナノ秒
書き込みレイテンシ
300 ナノ秒~ 400 ナノ秒
20,000 ナノ秒
150,000 ナノ秒
IOPS をテストする
ローカルディスクのシーケンシャル読み取り IOPS をテストする
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=8 --iodepth=1 --rw=read --bs=4k --size=8GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
ローカルディスクのシーケンシャル書き込み IOPS をテストする
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=8 --iodepth=1 --rw=write --bs=4k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
ローカルディスクのランダム読み取り IOPS をテストする
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=8 --iodepth=1 --rw=randread --bs=4k --size=8GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
ローカルディスクのランダム書き込み IOPS をテストする
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=8 --iodepth=1 --rw=randwrite --bs=4k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
スループットをテストする
ローカルディスクのシーケンシャル読み取りスループットをテストする
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=96 --iodepth=1 --rw=read --bs=64k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
ローカルディスクのシーケンシャル書き込みスループットをテストする
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=1 --numjobs=8 --iodepth=1 --rw=write --bs=64k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
ローカルディスクのランダム読み取りスループットをテストする
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=96 --iodepth=1 --rw=randread --bs=64k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
ローカルディスクのランダム書き込みスループットをテストする
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=8 --numjobs=96 --iodepth=1 --rw=randwrite --bs=64k --size=1GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
レイテンシをテストする
ローカルディスクのシーケンシャル読み取りレイテンシをテストする
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=1 --numjobs=1 --iodepth=1 --rw=read --bs=4k --size=8GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
ローカルディスクのシーケンシャル書き込みレイテンシをテストする
sudo fio --name=test --directory=/mnt/sdb --ioengine=libpmem --direct=1 --thread=1 --numjobs=1 --iodepth=1 --rw=write --bs=4k --size=8GB --norandommap=1 --randrepeat=0 --invalidate=1 --iodepth_batch=1 --sync=1 --scramble_buffers=0 --numa_cpu_nodes=0 --numa_mem_policy=bind:0 --cpus_allowed_policy=split
インスタンスが LLPL を使用してメモリプールを割り当てられなかった問題を解決する
問題の説明
永続メモリをローカルディスクとして使用できる ecs.re7p または ecs.i4p インスタンスで、LLPL を使用してメモリプールを割り当てられませんでした。Failed to create heap. Cannot read unsafe shutdown count**
というエラーメッセージが返されます。
原因
デフォルトでは、LLPL ソースコードでunsafe shutdown detection
が有効になっています。ただし、仮想化された不揮発性メモリ (NVM) はunsafe shutdown detection
をサポートしていません。詳細については、「llpl」をご参照ください。
解決策
LLPL ソースコードで unsafe shutdown detection
を無効にするには、次の手順を実行します。
LLPL ソースコードの src/main/cpp/com_intel_pmem_llpl_AnyHeap.cpp ファイルに次のコードを追加します。
int sds_write_value=0; pmemobj_ctl_set(NULL,"sds.at_create",&sds_write_value)
次の図は、上記のコードがファイルに追加されていることを示しています。
インスタンスにログオンします。
詳細については、「Workbench を使用して SSH 経由で Linux インスタンスに接続する」をご参照ください。
次のコマンドを実行して、LLPL を使用してテストケースを実行します。
mvn clean && mvn test -Dtest.heap.path=/mnt/sdb
"Failed to create heap. Cannot read unsafe shutdown count**" というエラーメッセージが返されない場合は、メモリプールの割り当てに進むことができます。