すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:永続メモリの使用モードを設定する

最終更新日:Jan 06, 2025

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 ビット

  1. 作成したインスタンスにログインします。

    詳細については、「Workbenchを使用したSSH経由のLinuxインスタンスへの接続」をご参照ください。

  2. 次のコマンドを実行して、永続メモリの管理に使用されるユーティリティをインストールし、すべての名前空間とラベルを削除します。

    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.
  3. 永続メモリのサイズを確認します。

    ndctl list -R

    次の図は、コマンド出力のサンプルを示しています。sizeパラメーターは、永続メモリのサイズを示します。

    查询持久内存大小

  4. 使用モードをfsdaxに設定します。

    sudo ndctl create-namespace --reconfig=namespace0.0 -m fsdax --size={region-size} --force
    説明

    {region-size} 変数を前の手順で取得したサイズ値に置き換えます。

    11.png

  5. 次のコマンドを実行して、永続メモリ (/dev/pmem) デバイスをフォーマットおよびマウントします。

    sudo mkfs -t ext4 /dev/pmem0
    sudo mkdir /mnt/sdb
    sudo mount -o dax,noatime /dev/pmem0 /mnt/sdb
  6. マウントされている /dev/pmemデバイスを表示します。

    df -h

    pmem-as-ssd

    /dev/pmemデバイスをマウントした後、ディスクパフォーマンステストツールを使用してデバイスのパフォーマンスをテストできます。

    i4pインスタンスまたはre6pインスタンスのローカルディスクのパフォーマンスをテストする方法については、このトピックの「i4pインスタンスのローカルディスクのパフォーマンスのテスト」をご参照ください。

i4pインスタンスのローカルディスクのパフォーマンスをテストする

この例では、次の設定とテストツールを使用しています。

  • インスタンスタイプ: ecs.i4p.2xlarge

  • イメージ:Alibaba Cloud Linux 2.1903 LTS 64 ビット

  • テストツール: フレキシブルI/Oテスター (fio) 。 fioはオープンソースの強力なI/Oパフォーマンスベンチマークツールで、ランダムな読み書き操作やシーケンシャルな読み書き操作など、ブロックストレージデバイスのパフォーマンス指標をテストできます。

  1. fioツールはデータ損失を引き起こす可能性があります。 ローカルディスクのパフォーマンスをテストする前に、テストするローカルディスクにデータが含まれていないことを確認してください。

  2. データを含むローカルディスクをテストする必要がある場合は、ディスクのパフォーマンスをテストする前にディスクデータをバックアップしてください。 詳細については、「ローカルディスクへのデータのバックアップ」をご参照ください。

  3. ECS インスタンスに接続します。

    詳細については、「Workbenchを使用したSSH経由のLinuxインスタンスへの接続」をご参照ください。

  4. 次のコマンドを実行してfioツールをインストールします。

    sudo yum install -y ndctl daxctl ipmctl libpmem librpmem libpmemblk libpmemlog libpmemobj libpmempool pmempool fio
  5. コマンドを実行して、ローカルディスクのパフォーマンスをテストします。

    • サンプルコマンドの詳細については、このトピックの「テスト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ソースコードで安全でないシャットダウン検出を無効にするには、次の手順を実行します。

  1. LLPLソースコードのsrc/main/cpp/com_intel_pmem_llpl_AnyHeap.cppファイルに次のコードを追加します。

    intsds_write_value=0;
    pmemobj_ctl_set(NULL,"sds.at_create",&sds_write_value)

    次の図は、上記のコードがファイルに追加されていることを示しています。

    AnyHeap

  2. インスタンスにログインします。

    詳細については、「Workbenchを使用したSSH経由のLinuxインスタンスへの接続」をご参照ください。

  3. 次のコマンドを実行して、LLPLを使用してテストケースを実行します。

    mvn clean && mvn test -Dtest.heap.path=/mnt/sdb

    "ヒープの作成に失敗した場合。 unsafe shutdown count **" エラーメッセージが返されません。メモリプールの割り当てに進むことができます。