Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第28章 永続メモリー: NVDIMM

永続メモリー(pmem)(ストレージクラスメモリーとも呼ばれる)は、メモリーとストレージの組み合わせです。PMEM は、ストレージの耐久性と、低アクセスレイテンシーと動的 RAM(DRAM)の高帯域幅を組み合わせます。
  • 永続メモリーはバイトアドレスであるため、CPU 負荷およびストア命令を使用してアクセスできます。従来のブロックベースのストレージへのアクセスに必要な read() または write() システムコールの他に、pmem はダイレクトロードおよびストアプログラミングモデル もサポートします
  • 永続メモリーのパフォーマンスの特徴は、アクセスレイテンシーが非常に低い DRAM と似ています。通常、数十万のナノ秒になります。
  • 永続メモリーの内容は、ストレージのように電源がオフになると保持されます。

永続メモリーの使用は、以下のようなユースケースに役立ちます。

急速な開始: データセットはすでにメモリーに存在します。
急速な開始は、ウォームキャッシュ 効果とも呼ばれます。ファイルサーバーでは、開始後、メモリーにファイルの内容はありません。クライアントがデータを接続および読み書きすると、そのデータはページキャッシュにキャッシュされます。最終的に、キャッシュには、ほとんどのホットデータが含まれます。再起動後、システムはプロセスを再度起動する必要があります。
永続メモリーにより、アプリケーションが適切に設計されている場合は、アプリケーションは再起動後も warm キャッシュを維持できます。この場合、ページキャッシュは関与しません。アプリケーションは、永続メモリーに直接データをキャッシュします。
高速書き込みキャッシュ
ファイルサーバーは多くの場合、データが永続メディアにあるまで、クライアントの書き込み要求を承認しません。永続メモリーを高速書き込みキャッシュとして使用することで、ファイルサーバーは、pmem の低レイテンシーにより書き込み要求を迅速に確認できるようになります

NVDIMMs のインターリービング

NVDIMM(Non-Volatile Dual In-line Memory Modules)は、通常の DRAM と同じ方法でインターリーブセットにグループ化できます。インターリーブセットは、複数の DIMM にまたがる RAID 0(ストライプ)と似ています。
NVDIMMS のインターリービングの利点は以下のとおりです。
  • DRAM と同様に、NVDIMM はインターリーブセットに設定するとパフォーマンスが向上します。
  • 複数の小さな NVDIMM を、1 つの大きな論理デバイスに組み合わせるために使用できます。
システムの BIOS または UEFI ファームウェアを使用してインターリーブセットを設定します。
Linux では、インターリーブセットごとに 1 つのリージョンデバイスが作成されます。
以下は、リージョンデバイスとラベル間の関係です。
  • お使いの NVDIMM がラベルに対応している場合は、リージョンデバイスを名前空間にさらに細分化することができます。
  • NVDIMM がラベルに対応していない場合は、リージョンデバイスには名前空間を 1 つだけ追加できます。この場合、カーネルは、リージョン全体に対応するデフォルトの namespace を作成します。

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

永続メモリーデバイスは、sectorfsdaxdevdax (デバイスダイレクトアクセス) または raw モードで使用できます。
sector モード
ストレージは高速ブロックデバイスとして提示されます。セクターモードの使用は、永続メモリーを使用するように変更されていないレガシーアプリケーション、またはデバイスマッパーを含む完全な I/O スタックを利用するアプリケーションに役に立ちます。
fsdax mode
これにより、Storage Networking Industry Association(SNIA) 非揮発性メモリー(NVM)プログラミングモデル仕様 で説明されているように、永続メモリーデバイスが直接アクセスプログラミングに対応します。このモードでは、I/O はカーネルのストレージスタックを回避するため、多くのデバイスマッパードライバーが使用できなくなります。
devdax モード
devdax (デバイス DAX)モードは、DAX キャラクターデバイスノードを使用して永続メモリーへの raw アクセスを提供します。CPU キャッシュのフラッシュ命令とフェンシング命令を使用して、devdax デバイスのデータを作成できます。特定のデータベースおよび仮想マシンのハイパーバイザーは、dev dax モードの利点を得られ ます。デバイス devdax インスタンスでファイルシステムを作成することはできません。
Raw モード
raw モード namespace にはいくつかの制限があるため、使用すべきではありません。

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"
      }
    ]
    
    ここで NVDIMM-N デバイスがラベルに対応していないため、Red Hat Enterprise Linux は各リージョンにデフォルトの名前空間を作成します。したがって、利用可能なサイズは 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. このスペースを使用するように、非アクティブな namespace を再設定します。たとえば、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
    }
    
    これで、同じリージョンから別の namespace を作成できます。
    # 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
    }
    
    以下のコマンドを使用して、同じリージョンから異なるタイプの namespace を作成することもできます。
    # 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 を参照してください。