X

オラクルエンジニア通信では、オンプレミスからクラウドまで、オラクルテクノロジーの最新情報をお届けします

永続メモリー入門

※本ページは、"Persistent Memory Primer"の翻訳です
 

永続メモリー(Persistent Memory :PMEM)の導入は、コンピューティング業界における革命の始まりを示しています。コンテンツがエフェメラル(揮発性、短期間の継続)でバイト・アドレス指定可能なシステム・メモリーと、データが永続的でブロック指向のストレージとの間には常に分離がありました。永続メモリー (Intel Optane DC Persistent Memory など)は、バイト・アドレス可能であると同時に永続的であるため、ストレージとメモリーの間の境界線を曖昧にします。

 

この新しいクラスの不揮発性メモリーは、DIMM ( Dual Inline Memory Module ) フォーム・ファクターで従来の(揮発性)DRAMと一緒に動作するのに十分な速度です。DIMMスロットのシステムに統合することは、永続メモリーが、ハードディスク・ドライブ(HDD)やソリッド・ステート・ディスク(SSD)などの従来のブロック指向ストレージとは大きく異なる役割を果たすことができることを意味します。

永続メモリーに関する連載シリーズのこの最初の連載回では、永続メモリーの基礎と、このテクノロジーがどのように機能するかについて説明します。

3D XPoint不揮発性メモリ
3D XPointは、Intel Optane製品の基盤となるシリコンであり、ストレージ製品で普及しているフラッシュ・ベースのソリューションとは異なる新しい形式の不揮発性メモリです。NAND論理ゲートにちなんで、NANDフラッシュ、ないしは単にフラッシュと呼ばれます。主にメモリカード、USBフラッシュドライブ、および汎用ストレージ用のソリッド・ステート・ドライブ(SSD)で使用されます。3D XPointは、メモリDIMMとしても、Intel Optane SSDとしてブランド化されたSSD形式でも利用できます。

3D XPointはNANDフラッシュより高速ですが、DRAMより低速です。3D XPointは、フラッシュよりも(容量で)高価ですが、DRAMよりも安価です。コストと速度のこれら2つの要因により、3D XPointはフラッシュとDRAMの間に配置されます。3D XPoint以外の他の不揮発性(NV)メモリー・テクノロジをサポートする、永続メモリーのAPIおよびプログラミング標準のセットもあります。永続メモリーのドキュメントはhttp://pmem.ioで公開されています。

このブログ投稿はIntel Optane DC Persistent Memoryに焦点を当てていますが、前述のように、Intel OptaneはSSD形式でも利用できます。Optane SSDはNANDフラッシュSSDよりも高速であり、ストレージとして従来の方法で使用できます。Optane SSDの詳細については、詳細については、インテル社のページを参照してくださいここに。

速度!
簡単に言えば、永続メモリーは高速です!回転ディスクやフラッシュSSDよりも劇的に高速ですが、揮発性メモリー(DRAM)よりも少し低速です。これを概観するために、次の時間測定を考慮してください。

ミリ秒= 1/1,000秒
マイクロ秒= 1/1,000,000秒
ナノ秒= 1/1,000,000,000秒
現世代のDRAMのデータ・アクセス時間(多くの場合、レイテンシーと呼ばれます)は80〜100ナノ秒の範囲ですが、適切に構成された場合の回転ディスクは1桁(1〜9)ミリ秒の範囲で実行されます。64バイトの永続メモリ−・アクセス時間は約300ナノ秒です。これはDRAMの約3倍遅いですが 、回転するディスクの3,000倍以上高速です。

図:CPUレジスタ、CPUキャッシュ、DDRメモリー、永続メモリー、フラッシュ、ディスク、テープなどのストレージ階層を示す図。 永続メモリは、フラッシュメモリとDDRメモリの中間に収まります。

フラッシュSSDのパフォーマンスは、これら2つの両端の中間にあり、構成とワークロードによって異なります。たとえば、サーバーに直接接続されたローカルフラッシュSSDは、複数のサーバーで共有することはできませんが、ストレージアレイに搭載されるフラッシュSSDにアクセスするサーバーよりもレイテンシーが短くなります(アクセスが速くなります)。パフォーマンスは、システム負荷の量(ユーザー数など)やアプリケーションの種類(OLTPアクセスか、ないしはデータ分析など)にも依存するため、パフォーマンスの結果は異なります。

200マイクロ秒のI/Oレイテンシー(0.2ミリ秒)を提供するフラッシュSSD共有ストレージ構成では、データアクセスは回転するディスクよりも少なくとも5倍高速です(1ミリ秒のディスクアクセス時間を想定)。ただし、レイテンシーが300ナノ秒の永続メモリーへのデータアクセス(64バイト)は 、フラッシュSSD(オールフラッシュアレイなど)よりも600倍以上高速にアクセス出来ます。

PMEMとディスクのパフォ​​ーマンス比較
従来のディスク(HDD)をベースラインとして使用すると、新しいテクノロジーによって劇的なパフォーマンスの向上が見られ、共有ストレージと直接接続ストレージの違いがはっきりとわかります。次の表は、さまざまなテクノロジでの一般的なI/O応答(またはレイテンシー)を示しています。特定のシステムでの特定のパフォーマンスは異なりますが、この表は一般的なパフォーマンス特性を示しています。

メモリーのパフォーマンスはナノ秒(10億分の1秒)で測定されますが、ハードディスクドライブのパフォーマンスは通常ミリ秒(1,000分の1秒)で測定され、パフォーマンスに10,000倍の違いがあることに注意してください。また、メモリはバイト・レベルでアクセスされますが、ストレージ(HDDおよびSSD)は通常、ブロック(この例では8K)でアクセスされることに注意してください。

永続メモリーはブロック指向のアプリケーションでも使用される可能性がありますが、これがパフォーマンス上の利点を十分に活用していないことは容易に理解できます。PMEMの完全なパフォーマンス上の利点を確認できるのは、アプリケーションがバイト・レベルで動作するように特別に設計されている場合のみです。PMEMを使用するアプリケーション(データベースなど)を開発する際の主な課題は、アトミック性(不可分性)の粒度です。これは、後で説明するように、PMEMがデータを保持する方法を意味します。もちろん、書き込みが発生する順序も、データの整合性を確保するために重要です。詳細を掘り下げる前に、利用可能な複数の構成オプションを理解することが重要です。

PMEM構成オプション
永続メモリーは複数の構成で使用でき、それぞれが特定のニーズに適合します。PMEMを構成するための2つの主要な構成オプションは、"App Direct Mode"と"Memory Mode"として知られており、App Direct Modeには複数のオプションがあります。

Memory Mode

永続メモリーは、システムがPMEMとDRAMの組み合わせを使用し、O/Sが「ホット」ブロックをより高速なDRAMに、「コールド」ブロックをより大容量で、より低速なPMEMに自動的に移行するMemory Modeと呼ばれるモードで使用できます。PMEMは基本的に、データの永続性を目的とするのではなく、メモリーの容量を大きくするために使用されます。Memory Modeはアプリケーションに対して透過的に動作し、Oracleデータベースの実行でサポートされています。このブログの大部分はApp Direct Modeに焦点を当てています。App Direct Modeでは、アプリケーションは永続メモリーをより大きなシステム・メモリーとして使用するのではなく、アプリケーションから直接使用できます。

App Direct Mode
App Directモードで構成されたPMEMは、Namespace構成で始まります。これは、永続メモリの論理ボリュームマネージャーに似ています。Namespaceは、"ndctl"ユーティリティを使用してLinuxシステムで構成され、fsdax、sector、devdax、およびrawの4つのオプションがあります。その後、ファイルシステムをfsdaxまたはセクターのNamespaceにマウントできます。理解すべき2つのレイヤーがあります。それは、Namespaceまたはデバイス構成と、デバイスの上にマウントされるファイルシステム・レイヤーです。

Namespaceの構成
ndctlユーティリティは、Linuxプラットフォームで不揮発性メモリ−・デバイスを構成するために使用されます。コマンド"ndctllist -N"は、構成されたNamespaceのリストを表示します。次の図は、fsdaxとセクターの名前空間とそれらの構成の詳細を示しています。

ダイレクトアクセス(またはDAX)とは、DRAMのバッファにデータをコピーせずに、永続メモリーの内容に直接アクセスする機能を指します。fsdax構成は8バイトのアトミック性を使用しますが、セクターは512バイトまたは4,096バイトのアトミック性を使用できます。デバイス・レベルを設定すると、ファイルシステムをデバイスにマウントできます。

ファイルシステムの構成
Linuxプラットフォームでは、mountコマンドの "-o dax"オプションを使用して、fsdaxまたはセクターNamespaceでのDAX操作用にXFSおよびext4ファイルシステムをマウントできます。名前空間の上にあるファイルシステムには、次の3つの構成オプションがあります。

  • DAXファイルシステムを使用したfsdax Namespace(8バイトのアトミック性)
  • non-DAXファイルシステム(8バイトのアトミック性)を持つfsdax Namespace
  • non-DAXファイルシステムを使用したセクター Namespace(512バイトまたは4,096バイトのセクターアトミック性)

ダイレクトアクセス(DAX)操作はパフォーマンスにとって重要であり、アプリケーションは永続メモリー・デバイスによって提供されるアトミック性のレベルを許容する必要があります。

8バイトのアトミック性
永続メモリー(Intel Optane DC Persistent Memoryなど)は、従来のストレージのようにデータのブロックではなく、バイトごとにネイティブに動作します。データは、最大で8バイトのチャンクで永続メモリーに永続化されます(ここでも、デフォルトの動作を使用します)。ブロック構造に基づくアプリケーション(データベースなど)の場合、永続メモリの8バイトのアトミック性が問題になる可能性があります。8,192バイトのデータ(8Kブロック)の書き込みは、それぞれ8バイトの1,024チャンクで永続化されます。電源障害またはその他の異常な状態により、データのブロックが「壊れた(fractured)」または「破れた(torn)」状態になり、ブロックの一部に古いデータが含まれ、他の部分に新しいデータが含まれる可能性があります。この種のブロックの破砕や破損に耐えられるように、アプリケーション(データベースなど)を変更する必要があります。それ以外の場合、これらは事実上破損したデータブロックです。 

セクターの親和性
永続メモリーは、"sector"オプションを使用してNamespaceを定義することにより、セクター・レベルのアトミック性を構成できます。これは、BTT(ブロック変換テーブル)モードとも呼ばれます。アプリケーション(つまりデータベース)のブロックサイズが名前空間で定義されたブロックサイズと一致しない場合、またはデータベースブロックと永続メモリセクターの境界の間に不整合がある場合でも、ブロックのティアリングが発生する可能性があります。従来のディスクおよびフラッシュSSDデバイスのブロックサイズはアプリケーションとは異なる場合がありますが、多くの場合、ブロックの破壊の問題を排除するバッテリー・バックアップのコントローラー・キャッシュがあります。

アプリケーションでは「ブロック」という単語がよく使用され、従来のディスクデバイスでは「セクター」(回転するディスクのセクター)と呼ばれるものが使用されますが、OSのコンテキストでは、ストレージまたはメモリーの単位として、「ページ」という単語を使用して参照することがよくあります。これらはすべて本質的に同じ概念を指す3つの用語であり、永続メモリーについて話しているときに収束します。アプリケーション(またはデータベース)内のデータのブロックは、OSページにマップされ、ストレージ上のセクターにマップされます。

アプリケーションのブロックサイズとNamespaceのセクターサイズが一致しない場合でも、コントローラーキャッシュがないため、ある程度のブロックのフラクチャリング(またはPMEMの用語でのティアリング)が予想されます。理想的には、アプリケーション(データベースなど)は8バイトのアトミック性を許容する必要があります。これは、アプリケーションのブロックサイズとNamespaceのセクターサイズを誤って構成したり、ブロックがセクターにずれて破損や破損が発生したりすることが非常に簡単だからです。 オラクルなどの企業にとってデータの整合性は最優先事項であるため、詳細についてはこの記事を読み続けてください。

アプリケーション層:ブロックベースの従来型ストレージI/O
ディスクやフラッシュSSDなどの永続ストレージは常にブロック指向であり、アプリケーション(データベースなど)はこのように機能するように開発されています。アプリケーションは、従来、ストレージ内のデータのブロックを読み書きするために開発されてきました。アプリケーション(またはシステムソフトウェア)は、データが使用および操作されるメモリーへのデータのバッファリングを処理し、次の図に示すように、アプリケーションの使用が完了すると、ブロックとしてストレージに保存(または永続化)されます。

ブロック指向のアプリケーション(データベースなど)は通常、C / C ++のread() およびwrite() システムコールを使用して、ブロック指向のストレージ内のデータにアクセスします。ブロック指向のアプリケーションは、ストレージから完全なブロックを読み取ることを想定しており、ブロック全体をストレージに書き込むように設計されています。ストレージは通常、ブロック全体の書き込みのアトミック性(成功または失敗)を保証します。これは通常、最新のシステムのディスク・コントローラーの不揮発性キャッシュによって支えられています。

アプリケーション層:バイト指向のアプリケーション
メモリは基本的にバイト指向であり、永続メモリー (Intel Optane DC Persistent Memory) は、アプリケーションがバイト指向で使用するように設計されています。アプリケーションは、アプリケーションによってDRAMに配置されたデータと同じように、永続メモリを使用してデータに直接(インプレースで)アクセスできます。LinuxのC/C++関数mmap()は、永続メモリ内のファイルをアプリケーションのアドレス空間にマップします。次の図に示すように、ファイルシステムがDAXオプション ( mount -o dax ) を使用してマウントされている場合、システム・バッファーは削除され、アプリケーションは永続メモリにあるデータを直接操作します。

ファイルの内容をアプリケーションのアドレス空間にマッピングし、永続メモリでデータに直接アクセスすると、memcpy() などのC/C++関数を使用してデータをコピーする必要がなくなり、データ処理のコードパスがなくなり、パフォーマンスが向上します。たとえば、データベースは通常、システム上の複数のユーザーがアクセスできるように、データを共有メモリセグメント(Oracle SGAなど)にコピーします。データのコピーを排除することは、明らかにデータアクセスの速度に影響を及ぼしますが、アトミック性の処理にも関連します。これについては後で説明します。

DAX:PMEMへの直接アクセス
永続メモリーの最高レベルのパフォーマンスは、次の図に示すように、データをコピーせずにデータに対して直接動作するようにアプリケーションが設計されている場合に得られます。64バイトのデータへのアクセスには約300ナノ秒かかります。これは、ソリッドステートディスク(SSD)からの読み取りよりも劇的に高速です。

ブロック指向の処理
ブロック指向のデータ・アクセス用に設計されたアプリケーションは、次の図に示すようにデータをメモリーにコピーします。永続メモリーのユーザーは、通常、8Kのデータに対して約6,000ナノ秒のアクセス時間を確認する必要があります。これはローカルに接続されたフラッシュSSDよりもはるかに高速ですが、DRAMやPMEMでのバイト指向のデータアクセスほど高速ではありません。

この図では、ブロック全体がPMEMからDRAMに読み込まれています。これは、READの観点からはフラッシュSSDまたは回転ディスクと機能的に同じです。ただし、データの書き込みは、ブロック指向のアプリケーションにビッグデータの整合性に影響を及ぼします。もちろん、データベースは伝統的にブロック指向であり、これは確かにOracleデータベースに当てはまります。

ブロック指向のアプリケーションへの影響
永続メモリーは、データの書き込み(または永続化)の方法が異なるため、HDDやSSDとは根本的に異なります。アプリケーションはデータのブロックを書き込む場合がありますが、このwrite() 操作は分割して実行されます。書き込み中に障害が発生すると(電源障害、システムカーネルパニック、異常シャットダウンなど)、次の図に示すブロックが破損または破損(つまり破損)します。

部分的に書き込まれたデータのブロックは、通常、ブロック指向のアプリケーションのデータ破損を意味します。アプリケーション(データベースなど)は、ストレージが部分的に完了したままになるのではなく、書き込み操作全体が成功または失敗することを期待しています。ストレージのこの動作は「アトミック性」と呼ばれ、アトミック性の粒度が重要です。書き込みのサイズとアトミック性の粒度に不一致があると、破損が発生します。従来のディスク・ストレージは通常、ブロック・レベルのアトミック性を保証するディスク・キャッシュを使用してこの問題を回避していました。

警告:PMEM上のファイルシステムとデバイス
この記事の執筆時点でのOracle Databaseの現在のすべてのバージョンは、このMy Oracle Support Noteで概説されているように、これらの構成で破損する可能性があります。( File Systems and Devices on Persistent Memory (PMEM) in Database Servers May Cause Database Corruption (Doc ID 2608116.1 ) このドキュメントの根底にある問題は、Memory Mode またはSSD・フォーム・ファクタで動作する永続メモリーには適用されません。 

Oracle Databaseの今後の機能は、PMEMのパフォーマンス上の利点を最大限に活用するとともに、上記のデータ破損の問題に対処します。さらに、Oracle Database 19cへの今後のバックポートでは、このMOS Note 2608116.1 の主題であるデータ破損の問題に対処します。このデータ破損の問題に対する既知のファイルシステム、デバイスドライバー、またはその他の解決策はありません。

ソフトウェア・エンジニアリングの課題
上記で見たように、永続メモリーの潜在的なパフォーマンスの向上は、3,000倍以上高速なデータアクセスで非常に驚くべきものですが、これらのパフォーマンスの向上を利用すると、いくつかの固有のソフトウェア・エンジニアリングの課題が発生します。データベースの主な「存在理由」はデータの整合性であるため、これらの課題を解決することは、Oracle開発組織にとって絶対に不可欠です。永続メモリーを既存の環境に後付けすることは可能ですが、このアプローチには、上記で見たようにデータの整合性の問題も含まれます。オラクルでは、Oracle DatabaseおよびExadata System Software を設計して、永続メモリーと完全に統合し、パフォーマンスを最大限に向上させ、顧客データを保護するという主要な目標を達成することが最善のアプローチであると考えています。

Exadata X8Mの永続メモリー
Exadata X8Mは、ストレージ層の永続メモリーを使用して、データベース・ブロックのI/Oを高速化し、データベース・トランザクション・ログのコミット関連プロセスを高速化します。永続メモリーはExadataのApp Direct Modeで使用され、Exadataソフトウェアは、永続メモリーの8バイトのアトミック性と互換性のあるソフトウェアロジックを組み込むことにより、上記のデータ整合性の問題に対処するように設計されています。Exadata Storageは、耐障害性のために、ストレージサーバー全体ですべてのデータの2つまたは3つの冗長コピー(冗長構成に応じて)も保持します。 

まとめ
永続メモリーは、Oracle Databaseに依存するワークロードなど、データ集約型の処理で驚異的なパフォーマンスの向上を約束する革新的なテクノロジーです。このブログで見たように、永続メモリーはデータベースのパフォーマンスを大幅に向上させる可能性を示しますが、Oracleなどの開発者にとってソフトウェアエンジニアリングの課題も数多くもたらします。このシリーズの次のブログで説明するように、OracleはExadataでこれらの課題をすでに解決しており、Oracle Databaseについても技術的な進歩が進んでいます。

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.