28 永続的なメモリ #
この章では、1つ以上のNVDIMMで構成される「永続的なメモリ」とも呼ばれる不揮発性メインメモリとSUSE Linux Enterprise の使用に関する追加情報を記載します。
28.1 概要 #
永続的なメモリとは、新しいタイプのコンピュータストレージで、動的RAM (DRAM)に近い速度を発揮し、RAMのバイト単位のアドレス指定、およびソリッドステートディスク(SSD)のパフォーマンスを併せ持ちます。
SUSEは現在、AMD64/Intel 64およびPOWERアーキテクチャを搭載したマシン上のSUSE Linux Enterprise Serverでの永続的なメモリの使用をサポートしています。
従来のRAMと同様に、永続的なメモリはマザーボードのメモリスロットに直接設置されます。そのため、RAM、DIMMと同じ物理フォームファクタで提供されます。これらは、NVDIMM、不揮発性デュアルインラインメモリモジュールとして知られています。
ただし、永続的なメモリはいくつかの点においてRAMとは異なり、フラッシュベースのSSDに類似しています。これらは両方ともソリッドステートメモリ回路の形態に基づいていますが、それにもかかわらず、両方とも非揮発性ストレージを提供し、システムの電源がオフにされたり、再起動されてもそのコンテンツは保持されます。両方の形態のメディアについて、データの書き込みは読み取りよりも低速で、両方とも限定された回数のリライトサイクルをサポートしています。また、SSDと同様に、特定の用途でより適している場合には、永続的なメモリへのセクタレベルのアクセスが可能です。
モデルごとに、Intel 3D XPointや、NANDフラッシュとDRAMを組み合わせるなど、さまざまな形態の電子ストレージメディアを使用します。新たな形態の不揮発性RAMも開発中です。つまり、NVDIMMのさまざまなベンダーおよびモデルで、さまざまなパフォーマンスや耐久性特性が提供されることを意味しています。
含まれるストレージテクノロジーは開発の初期段階であるため、さまざまなベンダーのハードウェアに異なった制限が与えられる場合があります。この一般的な内容は次のとおりです。
永続的なメモリはDRAMより最大10倍低速ですが、フラッシュストレージより約1000倍高速です。フラッシュメモリの全セクタの消去およびリライトプロセスではなく、バイト単位でリライト可能です。つまり、リライトサイクルは限定されていますが、ほとんどの形態の永続的なメモリが、フラッシュストレージの数千サイクルと比較すると、何百万サイクルのリライトを処理することができます。
ただし、この結果次の2つの制約を受けます。
現在のテクノロジーでは、永続的なメモリのみを使用してシステムを実行し、不揮発性メインメモリを完全に得ることはできません。従来のRAMとNVDIMM両方の混在したものを使用する必要があります。オペレーティングシステムおよびアプリケーションは、非常に高速な追加のストレージを提供するNVDIMMとともに、従来のRAMで実行されます。
さまざまなベンダーの永続的なメモリのパフォーマンス特性は、使われているNVDIMM数、および装着に適したメモリスロットなど、特定のサーバのNVDIMMのハードウェア仕様をプログラマが認識している必要があるということを示しています。これは、ハイパーバイザーの使用、異なるホストマシン間のソフトウェアのマイグレーションなどに明白に影響します。
この新しいストレージサブシステムはACPI標準のバージョン6で定義されています。ただし、libnvdimm
はプレ標準のNVDIMMをサポートし、同様に使用することができます。
28.2 用語 #
- 地域
「領域」とは1つ以上の「ネームスペース」に分けることが可能な永続的なメモリのブロックです。領域の永続的なメモリにアクセスするには、まず、その領域をネームスペースに割り当てる必要があります。
- ネームスペース
NVM Express SSDネームスペース、またはSCSI論理ユニット番号(LUN)と比較可能な、非揮発性ストレージの単一の連続アドレス指定範囲。ネームスペースはサーバの
/dev
ディレクトリに個別のブロックデバイスとして表示されます。要求されるアクセス方法に従って、ネームスペースは複数のNVDIMMから大きなボリュームにストレージを混合したり、より小さなボリュームにパーティショニングしたりできます。- モード
各ネームスペースには、そのネームスペースに対して有効化されるNVDIMM機能を定義する「モード」もあります。同じ親領域の兄弟ネームスペースは常に同じタイプですが、異なるモードに設定することもできます。ネームスペースのモードは次のとおりです。
- devdax
Device-DAXモード。単一文字のデバイスファイルを作成します(
/dev/daxX.Y
).ファイルシステムの作成は必要「ありません」。- fsdax
File system-DAXモード。他のモードが指定されない場合のデフォルトです。ブロックデバイス(
/dev/pmemX [.Y]
)を作成します。これはext4
またはXFS
用のDAXをサポートします。- sector
メタデータのチェックサムを実行しないレガシーファイルシステム用。小さなブートボリュームに適しています。他のオペレーティングシステムと互換性があります。
- raw
ラベルまたはメタデータのないメモリディスク。DAXをサポートしません。他のオペレーティングシステムと互換性があります。
注記raw
モードはSUSEによってサポートされていません。raw
ネームスペースにファイルシステムをマウントすることはできません。
- タイプ
各ネームスペースおよび領域には、そのネームスペースまたは領域に関連付けられた永続的なメモリへのアクセス方法を定義する「タイプ」があります。ネームスペースは常に親領域と同じタイプを持ちます。2つの異なる方法で設定可能な永続的なメモリと、非推奨のブロックモードの2つのタイプがあります。
- 永続的なメモリ(PMEM)
PMEMストレージはRAMのようにバイトレベルのアクセスを提供します。PMEMを使用すると、単一ネームスペースに複数のインターリーブされたNVDIMMを含めることができ、すべてを単一デバイスとして使用できます。
PMEMネームスペースを設定するには2つの方法があります。
- DAXを使用したPMEM
直接アクセス(DAX)用に設定されるPMEMネームスペースとは、メモリへのアクセスがカーネルのページキャッシュをバイパスして、メディアに直接行われることを意味します。ソフトウェアはネームスペースのすべてのバイトを直接、個別に読み書きできます。
- ブロック変換テーブル(BTT)を使用したPMEM
BTTモードで動作するように設定されたPMEMネームスペースは、どちらかというとRAMのようなバイトアドレス指定可能なモデルではなく、従来のディスクドライブのようにセクタベースでアクセスされます。変換テーブルメカニズムバッチはセクタサイズのユニットにアクセスします。
BTTの利点はデータ保護です。ストレージサブシステムは、各セクタが基盤となるメディアに完全に書き込まれるようにします。セクタが完全に書き込まれない場合(すなわち、何らかの理由により、書き込み操作に失敗する場合)、セクタ全体が以前の状態にロールバックされます。したがって、指定されたセクタは部分的に書き込まれることはありません。
また、BTTネームスペースへのアクセスはカーネルによってキャッシュされます。
この欠点は、BTTネームスペースにはDAXができない点です。
- ブロックモード(BLK)
ブロックモードストレージは、各NVDIMMを個別のデバイスとしてアドレス指定します。この使用は非推奨で、サポートされなくなりました。
devdax
ネームスペースを除き、他のすべてのタイプは従来のドライブのように、ファイルシステムでフォーマットされる必要があります。SUSE Linux Enterprise Serverでは、これに対してext2
、ext4
、およびXFS
ファイルシステムをサポートしています。- 直接アクセス(DAX)
DAXでは、たとえば
mmap
システムコールを使用して、永続的なメモリをプロセスのアドレススペースに直接マップすることができます。- DIMM物理アドレス(DPA)
単一DIMMメモリへのオフセットとしてのメモリアドレス。つまりそのDIMM上で最も小さいアドレス指定可能なバイトとして0から開始します。
- ラベル
ネームスペース定義など、NVDIMMに保存されるメタデータ。これにはDSMを使用してアクセスできます。
- デバイス固有のメソッド(DSM)
NVDIMM上のファームウェアにアクセスするためのACPIメソッド。
28.3 使用例 #
28.3.1 DAXを使用したPMEM #
この形態のメモリアクセスはトランザクションが「可能ではない」ことに注意することが重要です。電源異常などのシステム障害が発生する場合には、データがストレージに完全に書き込まれない場合があります。PMEMストレージはアプリケーションが部分的に書き込まれたデータの状態を処理できる場合にのみ適しています。
28.3.1.1 バイトアドレス指定可能なストレージの大容量を活用するアプリケーション #
サーバがバイト単位の大容量高速ストレージを直接使用可能なアプリケーションをホストする場合、プログラマはmmap
システムコールを使用して、追加のシステムRAMを使用せずに、永続的なメモリのブロックをアプリケーションのアドレススペースに直接配置することができます。
28.3.1.2 カーネルページキャッシュの使用を避ける #
ページキャッシュ用のRAMの使用を節約し、代わりにそれを使用するアプリケーションに指定したい場合に、カーネルページキャッシュの使用を避けます。たとえば、非揮発性メモリを仮想マシン(VM)イメージの保持専用にすることができます。これらはキャッシュされませんが、ホスト上のキャッシュ使用率を削減し、ホストごとのVMを増やすことができます。
28.3.2 BTTを使用したPMEM #
高速ストレージのディスクのようなプールとしてNVDIMMのセットに永続的なメモリを使用したい場合に役立ちます。たとえば、BTTを使用してファイルシステムジャーナルをPMEMに配置すると、停電やその他の突然の中断後のファイルシステムの回復の信頼性が向上します(28.5.3項 「BTTを使用したPMEMネームスペースの作成」を参照)。
アプリケーションに対して、このようなデバイスは高速SSDとして認識され、他のストレージデバイスのように使用できます。たとえば、LVMは永続的なメモリの上部に階層化することができ、通常のように動作します。
BTTの利点は、セクタ書き込みの原子性が保証されるため、データ整合性に依存する高度なアプリケーションでも機能し続けるという点です。メディアエラーレポートは標準のエラーレポーティングチャネルを介して機能します。
28.4 永続的なメモリを管理するためのツール #
永続的なメモリを管理するには、ndctl
パッケージをインストールする必要があります。これをインストールすることにより、NVDIMMを設定するためのユーザスペースライブラリのセットを提供するlibndctl
パッケージもインストールされます。
これらのツールは、3タイプのNVDIMMをサポートする、libnvdimm
ライブラリを介して機能します。
PMEM
BLK
同時のPMEMとBLK
ndctl
ユーティリティには、次のコマンドを使用してアクセス可能な、便利なman
ページセットがあります。
tux >
ndctl help subcommand
使用可能なサブコマンドのリストを表示するには、次を使用します。
tux >
ndctl --list-cmds
使用可能なサブコマンドには次のものがあります。
- バージョン
NVDIMMサポートツールの現在のバージョンを表示します。
- enable-namespace
指定されたネームスペースを使用できるようにします。
- disable-namespace
指定されたネームスペースが使用されないようにします。
- create-namespace
指定されたストレージデバイスから新しいネームスペースを作成します。
- destroy-namespace
指定されたネームスペースを削除します。
- enable-region
指定された領域を使用できるようにします。
- disable-region
指定された領域が使用されないようにします。
- zero-labels
デバイスからメタデータを消去します。
- read-labels
指定されたデバイスのメタデータを取得します。
- リスト
使用可能なデバイスを表示します。
- help
ツールの使用に関する情報を表示します。
28.5 永続的なメモリのセットアップ #
28.5.1 使用可能なNVDIMMストレージの表示 #
ndctl
list
コマンドを使用して、システム内で使用可能なすべてのNVDIMMを一覧表示できます。
次の例では、システムにトリプルチャネルでインターリーブされた単一セットの3個のNVDIMMがあります。
root #
ndctl list --dimms
[ { "dev":"nmem2", "id":"8089-00-0000-12325476" }, { "dev":"nmem1", "id":"8089-00-0000-11325476" }, { "dev":"nmem0", "id":"8089-00-0000-10325476" } ]
別のパラメータ、ndctl
list
を使用して、使用可能な領域を一覧表示することもできます。
領域は番号順に表示されない場合があります。
3つのNVDIMMしかありませんが、4つの領域として表示されることに注意してください。
root #
ndctl list --regions
[ { "dev":"region1", "size":68182605824, "available_size":68182605824, "type":"blk" }, { "dev":"region3", "size":202937204736, "available_size":202937204736, "type":"pmem", "iset_id":5903239628671731251 }, { "dev":"region0", "size":68182605824, "available_size":68182605824, "type":"blk" }, { "dev":"region2", "size":68182605824, "available_size":68182605824, "type":"blk" } ]
スペースは次の2つの異なる形態で利用できます: 。BLKタイプの3つの個別の64GB領域として、または3つがインターリーブされたNVDIMM上にすべてのスペースを提供するPMEMタイプの1つに結合された189GB領域を単一のボリュームとして。
available_size
に表示される値は、size
の値と同じであることに注意してください。これは、スペースのどれもまだ割り当てられていないということを意味します。
28.5.2 DAXを使用した単一のPMEMネームスペースとしてストレージを設定する #
最初の例として、直接アクセス(DAX)を使用した単一のPMEMネームスペースに3つのNVDIMMを設定します。
最初のステップは、新しいネームスペースを作成することです。
root #
ndctl create-namespace --type=pmem --mode=fsdax --map=memory
{ "dev":"namespace3.0", "mode":"memory", "size":199764213760, "uuid":"dc8ebb84-c564-4248-9e8d-e18543c39b69", "blockdev":"pmem3" }
これにより、DAXをサポートする、ブロックデバイス/dev/pmem3
が作成されます。デバイス名の3
(この場合はregion3
)は、親地域番号から継承されます。
--map=memory
オプションにより、NVDIMM上にPMEMストレージスペースの一部が置かれ、これはstruct pages
と呼ばれる内部カーネルデータ構造を割り当てるために使用できます。これにより、新しいPMEMネームスペースがO_DIRECT I/O
やRDMA
などの機能で使用できるようになります。
カーネルデータ構造用に一部の永続的なメモリを予約するのは、生成されるPMEMネームスペースの容量がPMEM親領域よりも小さいためです。
次に、新しいブロックデバイスがオペレーティングシステムで利用可能であることを確認します。
root #
fdisk -l /dev/pmem3
Disk /dev/pmem3: 186 GiB, 199764213760 bytes, 390164480 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes
使用する前に、他のドライブのように、フォーマットする必要があります。この例では、XFSを使用してフォーマットします。
root #
mkfs.xfs /dev/pmem3
meta-data=/dev/pmem3 isize=256 agcount=4, agsize=12192640 blks = sectsz=4096 attr=2, projid32bit=1 = crc=0 finobt=0, sparse=0 data = bsize=4096 blocks=48770560, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=23813, version=2 = sectsz=4096 sunit=1 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
次に、新しいドライブを特定のディレクトリにマウントできます。
root #
mount -o dax /dev/pmem3 /mnt/pmem3
ここで、DAX対応デバイスがあることを確認できます。
root #
mount | grep dax
/dev/pmem3 on /mnt/pmem3 type xfs (rw,relatime,attr2,dax,inode64,noquota)
これで、XFSファイルシステムでフォーマットされ、DAXでマウントされたPMEMネームスペースが設定されます。
mmap()
は、ファイルに呼び出しを行い、ファイルシステムはNVDIMM上の永続的なメモリに直接マップする仮想アドレスを返し、ページキャッシュを完全にバイパスします。
そのファイルシステム内のファイルに対するfsync
またはmsync
呼び出しが行われても、変更されたデータは完全にNVDIMMに書き込まれています。これらの呼び出しはmmap
マッピングを介してユーザスペースで変更されているページに関連付けられているプロセッサキャッシュラインをフラッシュします。
28.5.2.1 ネームスペースの削除 #
同じストレージを使用する他のボリュームタイプを作成する前に、このPMEMボリュームをアンマウントしてから削除する必要があります。
まず、このボリュームをアンマウントします。
root #
umount /mnt/pmem3
次にネームスペースを無効にします。
root #
ndctl disable-namespace namespace3.0
disabled 1 namespace
そして削除します。
root #
ndctl destroy-namespace namespace3.0
destroyed 1 namespace
28.5.3 BTTを使用したPMEMネームスペースの作成 #
BTTはセクタ書き込みの原子性を提供します。これは、Ext4ジャーナルやXFSジャーナルなどのデータ保護が必要な場合に適しています。電源障害が発生した場合、ジャーナルは保護され、回復可能である必要があります。次の例は、BTTを使用したPMEMネームスペースをセクタモードで作成する方法と、このネームスペースにファイルシステムジャーナルを配置する方法を示しています。
root #
ndctl create-namespace --type=pmem --mode=sector
{ "dev":"namespace3.0", "mode":"sector", "uuid":"51ab652d-7f20-44ea-b51d-5670454f8b9b", "sector_size":4096, "blockdev":"pmem3s" }
次に、新しいデバイスが存在することを確認します。
root #
fdisk -l /dev/pmem3s
Disk /dev/pmem3s: 188.8 GiB, 202738135040 bytes, 49496615 sectors Units: sectors of 1 * 4096 = 4096 bytes Sector size (logical/physical): 4096 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes
以前に設定したDAX対応PMEMネームスペースと同様に、このBTT対応PMEMネームスペースはNVDIMM上で使用可能なすべてのストレージを消費します。
デバイス名の最後のs
(/dev/pmem3s
)は、sector
を表し、BTTを使用するように設定されるネームスペースを簡単に区別するために使用されます。
ボリュームは前の例と同様に、フォーマットし、マウントできます。
ここに表示されるPMEMネームスペースはDAXを使用することはできません。その代わりに、BTTを使用して、「セクタ書き込みの原子性」を提供します。PMEMブロックドライバからのセクタ書き込みが行われるたびに、BTTは新しいセクタを割り当てて新しいデータを受け取ります。BTT原子性により、新しいデータが完全に書き込まれた後で、その内部マッピング構造をアップデートし、新しく書き込まれたデータがアプリケーションで利用できるようにします。このプロセス中に任意のポイントで電源障害が発生した場合、書き込みは完全に消失しますが、アプリケーションはまだ存在する古いデータにアクセスできます。これにより、「tornセクタ」と呼ばれる状況が回避されます。
このBTT対応PMEMネームスペースは他の標準ブロックデバイスのようにファイルシステムでフォーマットして使用できます。DAXと併用することはできません。ただし、このブロックデバイス上のファイルのmmap
マッピングはページキャッシュを使用します。
28.5.4 PMEM/BTTにファイルシステムジャーナルを配置する #
別のデバイスにファイルシステムジャーナルを配置する場合は、ファイルシステムと同じファイルシステムブロックサイズを使用する必要があります。これは4096である可能性が高く、次のコマンドでブロックサイズを確認できます。
root #
blockdev --getbsz /dev/sda3
次の例では、別のNVDIMMデバイスに新しいExt4ジャーナルを作成し、SATAデバイスにファイルシステムを作成してから、新しいファイルシステムをジャーナルに接続します。
root #
mke2fs -b 4096 -O journal_dev /dev/pmem3s
root #
mkfs.ext4 -J device=/dev/pmem3s /dev/sda3
次の例では、SATAドライブに新しいXFSファイルシステムを作成し、別のNVDIMMデバイスにジャーナルを作成します。
root #
mkfs.xfs -l logdev=/dev/pmem3s /dev/sda3
オプションに関する詳細については、man 8 mkfs.ext4
およびman 8 mkfs.ext4
を参照してください。
28.6 詳細情報 #
このトピックの詳細については、次のリストを参照してください。
NVDIMMシステムを構成するための手順、テストに関する情報、およびNVDIMMの有効化に関連する仕様へのリンクが記載されています。LinuxのNVDIMMサポートは現在開発中のため、このサイトも構築中です。
Linuxおよび他のオペレーティングシステムの下で、非揮発性メモリを搭載したシステムを設定、使用、およびプログラミングする方法に関する情報。ユーザスペースの永続的なメモリをプログラミングするために役立つAPIを提供することを目的とした、NVMライブラリ(NVML)について説明しています。
これは、カーネル開発者を対象としており、現在のLinuxカーネルツリーのドキュメントフォルダの一部です。NVDIMM有効化に含まれている異なるカーネルモジュール、カーネル実装のテクニカル詳細、
ndctl
ツールによって使用されるカーネルへのsysfs
インタフェースについて説明しています。Linuxカーネルの
libnvdimm
サブシステムを管理するためのユーティリティライブラリ。ユーザスペースライブラリ、ユニットテスト、およびマニュアルも含まれます。