目次にジャンプページナビゲーションにジャンプ: 前のページ[アクセスキーp]/次のページ[アクセスキーn]
documentation.suse.com / SUSE Linux Enterprise Serverマニュアル / 管理ガイド / システム / 永続的なメモリ
適用項目 SUSE Linux Enterprise Server 15 SP2

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では、これに対してext2ext4、および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

使用可能なサブコマンドには次のものがあります。

version

NVDIMMサポートツールの現在のバージョンを表示します。

enable-namespace

指定されたネームスペースを使用できるようにします。

disable-namespace

指定されたネームスペースが使用されないようにします。

create-namespace

指定されたストレージデバイスから新しいネームスペースを作成します。

destroy-namespace

指定されたネームスペースを削除します。

enable-region

指定された領域を使用できるようにします。

disable-region

指定された領域が使用されないようにします。

zero-labels

デバイスからメタデータを消去します。

read-labels

指定されたデバイスのメタデータを取得します。

list

使用可能なデバイスを表示します。

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/ORDMAなどの機能で使用できるようになります。

カーネルデータ構造用に一部の永続的なメモリを予約するのは、生成される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 その他の情報

このトピックの詳細については、次のリストを参照してください。

  • 永続的なメモリのWiki

    NVDIMMシステムを構成するための手順、テストに関する情報、およびNVDIMMの有効化に関連する仕様へのリンクが記載されています。LinuxのNVDIMMサポートは現在開発中のため、このサイトも構築中です。

  • 永続的なメモリのプログラミング

    Linuxおよび他のオペレーティングシステムの下で、不揮発性メモリを搭載したシステムを設定、使用、およびプログラミングする方法に関する情報。ユーザスペースの永続的なメモリをプログラミングするために役立つAPIを提供することを目的とした、NVMライブラリ(NVML)について説明しています。

  • LIBNVDIMM: 不揮発性デバイス

    これは、カーネル開発者を対象としており、現在のLinuxカーネルツリーのドキュメントフォルダの一部です。NVDIMM有効化に含まれている異なるカーネルモジュール、カーネル実装のテクニカル詳細、ndctlツールによって使用されるカーネルへのsysfsインタフェースについて説明しています。

  • GitHub: pmem/ndctl

    Linuxカーネルのlibnvdimmサブシステムを管理するためのユーティリティライブラリ。ユーザスペースライブラリ、ユニットテスト、およびマニュアルも含まれます。