第28章 永続メモリー: NVDIMM

ストレージクラスメモリーとも呼ばれる永続メモリー (pmem) は、メモリーとストレージの組み合わせです。pmem は、ダイナミック RAM (DRAM) の低アクセスレイテンシーと広帯域幅をストレージの永続性を組み合わせます。
  • 永続メモリーはバイトアドレス指定可能であるため、CPUロードを使用してアクセスでき、命令を格納できます。従来のブロックベースのストレージにアクセスするのに必須の read() または write() システム呼び出しに加え、pmem はダイレクトロードにも対応しており、プログラミングモデルを格納します。
  • 永続メモリーのパフォーマンス特性は、アクセスレイテンシーが非常に低い DRAM と似ています。通常、10,000 ~ 100,000 ナノ秒です。
  • 永続メモリーの内容は、ストレージのように電源がオフになった際に保持されます。

永続メモリーを使用すると、以下のようなユースケースにメリットがあります。

高速スタート: データセットが既にメモリーに存在します。
高速スタートは、ウォームキャッシュ (warm cache) 効果とも呼ばれます。ファイルサーバーは起動すると、メモリー内にファイルコンテンツを置きません。クライアントがデータの読み書きを行うため、そのデータはページキャッシュでキャッシュされます。最終的には、キャッシュに含まれるデータはホットデータが大半になります。再起動後、システムはこのプロセスを再び起動する必要があります。
永続メモリーでは、アプリケーションが正しく設計されていれば再起動においてウォームキャッシュを維持できます。この場合、関与するページキャッシュはありません。アプリケーションは、永続メモリーで直接データをキャッシュします。
高速書き込みキャッシュ
ファイルサーバーは多くの場合、データが耐久性のあるメディアに存在するまで、クライアントの書き込みリクエストを承認しません。高速書き込みキャッシュとして永続メモリーを使用すると、pmem の低レイテンシーにより、ファイルサーバーが書き込みリクエストをすばやく承認できるようになります。

NVDIMMs インターリービング

非揮発性デュアルインラインメモリモジュール (NVDIMMs) は、通常の DRAM と同じ方法でインターリーブセットにグループ化できます。インターリーブセットは、複数の DIMM にわたる RAID 0 (ストライプ) のようなものです。
以下は、NVDIMMS インターリービングのメリットです。
  • DRAM のように、NVDIMMs は、インターリーブセットに設定するとパフォーマンス向上を図ることができます。
  • これは、複数の小さな NVDIMMs を 1 つの大きな論理デバイスに組み合わせるのに使用できます。
システム BIOS または UEFI ファームウェアを使用してインターリーブセットを設定します。
Linux では、1 つのリージョンのデバイスがインターリーブセットごとに作成されます。
以下は、リージョンデバイスとラベルの関係を説明しています。
  • お使いの NVDIMMs がラベルに対応していると、リージョンデバイスをさらに名前空間に分割できます。
  • NVDIMM がラベルに対応していない場合、リージョンデバイスは単一の名前空間のみを含めることができます。この場合、カーネルは、リージョン全体を対象としたデフォルトの名前空間を作成します。

永続メモリーアクセスモード

永続メモリーデバイスは、sectorfsdaxdevdax (デバイスダイレクトアクセス) または raw モードで使用できます。
sector モード
ストレージを高速ブロックデバイスとして示します。セクターモードは、永続メモリーを使用するように変更されていないレガシーアプリケーションや、デバイスマッパーを含むフル I/O スタックを利用するアプリケーションに使用すると便利です。
fsdax モード
このモードでは、永続メモリーデバイスがストレージネットワークインダストリーアソシエーション (SNIA) 非揮発性メモリー (NVM) プログラミングモデル仕様 で説明されているように、ダイレクトアクセスプログラミングに対応します。このモードでは、I/O がカーネルのストレージスタックをバイパスし、多くのデバイスマッパードライバーが使用できなくなります。
devdax モード
devdax (デバイス DAX) モードは、DAX キャラクターデバイスノードを使用して永続メモリーに raw アクセスを与えます。devdax デバイスのデータは、CPU キャッシュフラッシングとフェンシング命令を使用して強化できます。特定のデータベースや仮想マシンハイパーバイザーは、devdax モードからメリットを得ることができます。ファイルシステムは、デバイス devdax インスタンスでは作成できません。
raw モード
raw モード名前空間にはいくつかの制限があるため、使用すべきではありません。

28.1. ndctl による永続メモリー設定

ndctl ユーティリティを使用して永続メモリーデバイスを設定します。ndctl ユーティティをインストールするには、以下のコマンドを使用します。
# yum install ndctl

手順28.1 ラベルに対応していないデバイスの永続メモリーの設定

  1. お使いのシステム上で利用できる pmem リージョンを一覧表示します。以下の例では、このコマンドが、ラベルに対応していない NVDIMM-N デバイスを一覧表示しています。
    # ndctl list --regions
    [
      {
        "dev":"region1",
        "size":34359738368,
        "available_size":0,
        "type":"pmem"
      },
      {
        "dev":"region0",
        "size":34359738368,
        "available_size":0,
        "type":"pmem"
      }
    ]
    Red Hat Enterprise Linux は各リージョンのデフォルト名前空間を作成します。これは、NVDIMM-N デバイスがラベルに対応していないためです。つまり、利用可能なサイズは 0 バイトです。
  2. システム上に非アクティブの名前空間すべてを一覧表示します。
    # ndctl list --namespaces --idle
    [
      {
        "dev":"namespace1.0",
        "mode":"raw",
        "size":34359738368,
        "state":"disabled",
        "numa_node":1
      },
      {
        "dev":"namespace0.0",
        "mode":"raw",
        "size":34359738368,
        "state":"disabled",
        "numa_node":0
      }
    ]
  3. この容量を利用するために非アクティブな名前空間を設定します。たとえば、DAX 対応のファイルシステムに namespace0.0 を使用するには、以下のコマンドを使用します。
    # ndctl create-namespace --force --reconfig=namespace0.0 --mode=fsdax --map=mem 
    {
      "dev":"namespace0.0",
      "mode":"fsdax",
      "size":"32.00 GiB (34.36 GB)",
      "uuid":"ab91cc8f-4c3e-482e-a86f-78d177ac655d",
      "blockdev":"pmem0",
      "numa_node":0
    }

手順28.2 ラベルに対応しているデバイスの永続メモリーの設定

  1. お使いのシステム上で利用できる pmem リージョンを一覧表示します。以下の例では、このコマンドが、ラベルに対応している NVDIMM-N デバイスを一覧表示しています。
    # ndctl list --regions
    [
      {
        "dev":"region5",
        "size":270582939648,
        "available_size":270582939648,
        "type":"pmem",
        "iset_id":-7337419320239190016
      },
      {
        "dev":"region4",
        "size":270582939648,
        "available_size":270582939648,
        "type":"pmem",
        "iset_id":-137289417188962304
      }
    ]
  2. NVDIMM デバイスがラベルに対応している場合、デフォルトの名前空間は作成されません。また、--force または --reconfigure フラグなしでリージョンから 1 津以上の名前空間を割り当てることができます。
    # ndctl create-namespace --region=region4 --mode=fsdax --map=dev --size=36G
    {
      "dev":"namespace4.0",
      "mode":"fsdax",
      "size":"35.44 GiB (38.05 GB)",
      "uuid":"9c5330b5-dc90-4f7a-bccd-5b558fa881fe",
      "blockdev":"pmem4",
      "numa_node":0
    }
    これで、同じリージョンから別の名前空間を作成できるようになりました。
    # ndctl create-namespace --region=region4 --mode=fsdax --map=dev --size=36G
    {
      "dev":"namespace4.1",
      "mode":"fsdax",
      "size":"35.44 GiB (38.05 GB)",
      "uuid":"91868e21-830c-4b8f-a472-353bf482a26d",
      "blockdev":"pmem4.1",
      "numa_node":0
    }
    また、以下のコマンドを使用して、同じリージョンから別のタイプの名前空間を作成することもできます。
    # ndctl create-namespace --region=region4 --mode=devdax --align=2M --size=36G
    {
      "dev":"namespace4.2",
      "mode":"devdax",
      "size":"35.44 GiB (38.05 GB)",
      "uuid":"a188c847-4153-4477-81bb-7143e32ffc5c",
      "daxregion":
      {
        "id":4,
        "size":"35.44 GiB (38.05 GB)",
        "align":2097152,
        "devices":[
          {
            "chardev":"dax4.2",
            "size":"35.44 GiB (38.05 GB)"
          }]
      },
        "numa_node":0
    }
ndctl ユーティリティの詳細は、man ndctl を参照してください。