第28章 永続メモリー : NVDIMMs
永続メモリー(
pmem
)は、ストレージクラスメモリーとしても呼び出され、メモリーとストレージの組み合わせです。PMEM
は、ストレージの耐久性と低アクセスレイテンシー、動的 RAM (DRAM)の高帯域幅を組み合わせたものです。
- 永続メモリーはバイト単位でアドレスを指定できるため、CPU 読み込みおよびストア命令でアクセスできます。従来のブロックベースのストレージへのアクセスに必要な
read()
またはwrite()
システムコールに加えて、pmem
はダイレクトロードおよびストアプログラミングモデルもサポートします。 - 永続メモリーのパフォーマンス特性は、アクセスレイテンシーが非常に低い (通常、数十から数百ナノ秒) DRAM と似ています。
- 永続メモリーの内容は、ストレージと同様に、電源が切れても保持されます。
永続メモリーの使用は、以下のようなユースケースで利点があります。
- 高速な起動: データセットはすでにメモリーにあります。
- 高速な起動は、ウォームキャッシュ効果とも呼ばれます。起動後、ファイルサーバーのメモリーにファイルの内容はありません。クライアントがデータを接続して読み書きすると、そのデータはページキャッシュにキャッシュされます。最終的に、キャッシュには、ほとんどのホットデータが含まれます。システムを再起動したら、プロセスを再起動する必要があります。永続メモリーを使用すると、アプリケーションが適切に設計されていれば、システムの再起動後もアプリケーションのウォームキャッシュを維持できます。この例には、ページキャッシュは含まれません。アプリケーションは、永続メモリーに直接データをキャッシュします。
- 高速書き込みキャッシュ
- ファイルサーバーは多くの場合、耐久性のあるメディアにデータが存在するまで、クライアントの書き込み要求を承認しません。永続メモリーを高速書き込みキャッシュとして使用すると、
pmem
のレイテンシーが低くなるため、ファイルサーバーは書き込み要求をすばやく確認できます。
NVDIMMs のインターリーブ
Non-Volatile Dual In-line Memory Modules (NVDIMMs) は、通常の DRAM と同じ方法でインターリーブセットにグループ化できます。インターリーブセットは、複数の DIMM にわたる RAID 0 (ストライプ) のようなものです。
NVDIMMS のインターリーブには、以下の利点があります。
- DRAM と同様に、NVDIMMs もインターリーブセットに設定するとパフォーマンスが向上します。
- これを使用すると、複数の小規模な NVDIMMs を、1 つのより大きな論理デバイスに統合できます。
システム BIOS または UEFI ファームウェアを使用して、インターリーブセットを設定します。
Linux では、1 つのインターリーブセットに 1 つのリージョンデバイスが作成されます。
リージョンデバイスとラベルの関係は次のとおりです。
- NVDIMMs がラベルに対応している場合は、リージョンデバイスを名前空間にさらに細かく分けることができます。
- NVDIMMs がラベルに対応していない場合、リージョンデバイスは、単一の名前空間しか含むことができません。この場合、カーネルは、リージョン全体に対応するデフォルトの namespace を作成します。
永続メモリーアクセスモード
永続メモリーデバイスは、
セクター
、fsdax
、devdax
(デバイスダイレクトアクセス)または raw
モードで使用できます。
sector
モード- ストレージは高速ブロックデバイスとして提示されます。セクターモードの使用は、永続メモリーを使用するように変更されていない従来のアプリケーションや、デバイスマッパーを含む完全な I/O スタックを利用するアプリケーションに役立ちます。
fsdax
モード- これにより、Storage Networking Industry Association (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 ラベルをサポートしないデバイスの永続メモリーの設定
- システムで利用可能な
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 バイトです。 - システムでアクティブでない名前空間のリストを表示します。
#
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 } ] - この領域を使用できるように、非アクティブの名前空間を再設定します。たとえば、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 ラベルをサポートするデバイスの永続メモリーの設定
- システムで利用可能な
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 } ] - 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 を参照してください。