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) 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 #Delete all namespaces. sudo ndctl disable-region all && sudo ndctl zero-labels all && sudo ndctl enable-region all #Delete all labels.
永続メモリのサイズを確認します。
ndctl list -R
次の図は、コマンド出力のサンプルを示しています。sizeパラメーターは、永続メモリのサイズを示します。
使用モードをfsdaxに設定します。
sudo ndctl create-namespace --reconfig=namespace0.0 -m fsdax --size={region-size} --force
説明{region-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 ビット
テストツール: フレキシブルI/Oテスター (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ギガバイト/秒10ギガバイト/秒
2ギガバイト/秒3ギガバイト/秒
0.2 GB/sから0.3ギガバイト/秒
読み取り/書き込み帯域幅
8ギガバイト/秒10ギガバイト/秒
1ギガバイト/秒から2ギガバイト/秒
0.2 GB/sから0.3ギガバイト/秒
書き込み帯域幅
2ギガバイト/秒3ギガバイト/秒
1ギガバイト/秒から2ギガバイト/秒
0.2 GB/sから0.3ギガバイト/秒
読み取り IOPS
1,000,000
500,000
30,000に20,000
読み取り/書き込み IOPS
1,000,000
300,000
30,000に20,000
書き込み IOPS
1,000,000
300,000
30,000に20,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を使用してメモリプールを割り当てることができませんでした。 ヒープの作成に失敗しました。 次の図に示すように、unsafe shutdown count **
を読み取ることができませんエラーメッセージが返されます。
原因
デフォルトでは、LLPLソースコードでunsafe shutdown detection
が有効になっています。 しかしながら、仮想化不揮発性メモリ (NVM) は、安全でないシャットダウン検出
をサポートしない。 詳細は、「llpl」をご参照ください。
解決策
LLPLソースコードで安全でないシャットダウン検出
を無効にするには、次の手順を実行します。
LLPLソースコードのsrc/main/cpp/com_intel_pmem_llpl_AnyHeap.cppファイルに次のコードを追加します。
intsds_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
"ヒープの作成に失敗した場合。 unsafe shutdown count **" エラーメッセージが返されません。メモリプールの割り当てに進むことができます。