![](https://habrastorage.org/files/ad2/ef6/b36/ad2ef6b36cfb456d9d064b186ad433f9.jpg)
カットの前に挿入する画像がわからない場合があります。 そして今日はまさにそのようなケースです。 パスは猫になります:)
歴史的に、アプリケーションは2つのレベルのメモリを使用してデータを整理します。 1つ目は高速なRAM、2つ目は比較的遅い情報の保存です。 PMEMの出現とは、第1レベルと第2レベルの間の場所を占める第3レベルのメモリの出現を意味します。
RAMの場合と同様に、新しいタイプのメモリを使用して、データをロードおよび保存するためのプロセッサ命令を使用して作業できます。
PMEMを実装するハードウェアソリューションの道はまだ始まったばかりです。 しかし、すべては、それらが広く普及している可能性があることを示しています。 新しい種類のメモリには、ソフトウェア開発への新しいアプローチが必要です。 プログラムだけではPMEMの恩恵を受けることはできませんが、このためには準備が必要です。
ハードウェアPMEMソリューションが広く普及する前であっても、できるだけ早く新しいメモリで動作するアプリケーションの作成を開始したいプログラマーであれば、エミュレーションを使用できます。 このアプローチは、既存のプロジェクトの更新にも役立ちます。
この記事では、通常のRAMを使用してPMEMエミュレーションを構成する方法を学習します。 エミュレーションに割り当てられたRAM領域は、オペレーティングシステムから永続的なメモリ領域として認識されます。 この場合、エミュレーションは通常のDRAMに基づいているため、電源をオフにすると仮想PMEMからのデータが失われることに注意してください。 ただし、エミュレートされたメモリを使用した作業の速度は非常に高速です。
ここでは、Intelプロセッサを搭載したサーバーと、カーネルバージョン4.3を搭載したLinuxファミリのオペレーティングシステムを使用します。 またはそれ以上。 ハードウェア構成、およびソリューションのソフトウェア部分の構成方法について説明します。 エミュレーションの構成後、pmem.io のNVMライブラリにあるPMEMアプリケーションの例を体験できます。
ハードウェアおよびソフトウェアコンポーネント
以下は、実験に使用されたハードウェアとソフトウェアの仕様です。
成分
| 特徴
|
CPU
| Intel Xeon E5-2699 v4(2.2 GHz、22コア、1つのコアを使用)。
|
チップセット
| Intel C610 QS(ステッピングB1)、Intel QPIシステムバス、9.6 GT / s。
|
プラットフォーム
| Intel Server System R2000WT(Wildcat Pass)、24個のDIMMスロット、2個のプロセッサソケット、1100 W電源。
BIOS-GRRFSDP1.86B.0271.R00.1510301446 ME:V03.01.03.0018.0 BMC:1.33.8932 |
RAM
| Micron MTA36ASF2G72PZ2GATESIG、256 GB(16x16 GB)DDR4 2133P
|
運転
| Western Digital WD1002FAEX、1 TB。
|
オペレーティングシステム
| カーネル4.5.3を備えたCentOS
|
Linuxカーネルの準備
作業の過程で、Linuxカーネルバージョン4.5.3が使用されました。 読み取り専用メモリおよびエミュレーションデバイスのサポートは、バージョン4.0以降のカーネルで利用可能ですが、システム構成を簡素化するために、バージョン4.2以降のカーネルを使用することをお勧めします。
エミュレーションは、公式カーネルをサポートできるLinuxディストリビューションで動作するはずです。 必要なドライバーをインストールするには、make nconfigを実行します。
図1-5は、カーネル構成メニュー(カーネル構成)でNVDIMMサポートを構成するプロセスを示しています。
$ make nconfig -> Device Drivers -> NVDIMM Support -> <M>PMEM; <M>BLK; <*>BTT
![](https://habrastorage.org/getpro/habr/post_images/042/184/eaa/042184eaa1e93a87486c3d20a9a6b21f.jpg)
図 1.デバイスドライバーを構成するための移行
![](https://habrastorage.org/getpro/habr/post_images/9d1/406/f66/9d1406f66f6da90015553b02e4547104.jpg)
図 2. NVDIMMサポートの構成
![](https://habrastorage.org/getpro/habr/post_images/1ad/482/7ae/1ad4827ae0e7cc179212bdd0cee1087b.jpg)
図 3.ダイレクトアクセステクノロジーをサポートするようにファイルシステムを構成する
![](https://habrastorage.org/getpro/habr/post_images/95b/8fa/841/95b8fa841aa693da4adf624c89a2d22a.jpg)
図 4.ダイレクトアクセス(DAX)サポートを構成する
![](https://habrastorage.org/getpro/habr/post_images/d92/3f7/35c/d923f735c78c3fe8b1509ef20c54be3f.jpg)
図 5. NVDIMMサポートオプション
カーネルは、PMEMドライバー用のメモリ領域を提供し、それらを使用して永続ストレージをエミュレートできます。 図6-7は、プロセッサとシステムの設定を示しています。
$ make nconfig -> Processor type and features <*>Support non-standard NVDIMMs and ADR protected memory
![](https://habrastorage.org/getpro/habr/post_images/e6c/4d9/1a3/e6c4d91a3022e0352d6ae92830e28324.jpg)
図 6. NVDIMMをサポートするためのプロセッサーの構成
![](https://habrastorage.org/getpro/habr/post_images/62f/d6c/5bc/62fd6c5bc64538abc7c9ccb91881c8be.jpg)
図 7.非標準NVDIMMメモリーとADR保護メモリーのサポートを有効にします
これで、以下に示すコマンドを使用してカーネルを構築する準備がすべて整いました。
$ make -jX X –
カーネルビルドの高速化
新しいカーネルは、複数のスレッドを使用してはるかに高速に構築できます。 異なる数のスレッドを使用した実験により、マルチスレッドモードではコンパイルが約95%高速化されることが示されています。 その結果、新しいカーネルのセットアップは非常に迅速です。 以下の2つの図は、プロセッサの負荷と、カーネルアセンブリ中に複数のスレッドを使用した場合のパフォーマンスへの影響を示すグラフを示しています。
![](https://habrastorage.org/getpro/habr/post_images/748/71f/ac0/74871fac0fc3fdf963e67d6dc059982f.jpg)
図 8.カーネルソースコードのコンパイル
![](https://habrastorage.org/getpro/habr/post_images/df3/319/85b/df331985b319b87ca0c6faf2012e0c25.jpg)
図 9.コンパイルパフォーマンスに対するマルチスレッドの影響
新しいカーネルをインストールして構成する
カーネルをインストールするには、次のコマンドを使用します。
# make modules_install install
![](https://habrastorage.org/getpro/habr/post_images/2c0/998/e4f/2c0998e4f8e29d34213244fec66d1c5b.jpg)
図 10.カーネルのインストール
次に、カーネルブートパラメータを変更してメモリ領域を予約します。 その結果、選択された領域は、オペレーティングシステムの読み取り専用メモリのようになります。 ここでは、この種類のコマンドを使用します。
memmap=nn[KMG]!ss[KMG]
実行の結果、ssからss + nnの範囲のメモリ領域が割り当てられます。 「KMG」は、ユニットの略語です。キロ、メガ、ギガ。
たとえば、memmap = 4G!12Gという形式のコマンドは、12ギガバイトと16ギガバイトの間に4 GBのメモリを予約します。 設定はGRUBで行われ、Linuxディストリビューションによって異なります。 CentOS 7.0のGRUB構成の例を次に示します。
# vi /etc/default/grub GRUB_CMDLINE_LINUX="memmap=nn[KMG]!ss[KMG]" On BIOS-based machines: # grub2-mkconfig -o /boot/grub2/grub.cfg
以下の図は、GRUBファイルに追加されたPMEM命令を示しています。
![](https://habrastorage.org/getpro/habr/post_images/f56/247/924/f56247924b5b679549328adafd357140.jpg)
図 11. / etc / default / grubでPMEMの領域を指定する
そして、ここにGRUB構成ビルドプロセスがあります。
![](https://habrastorage.org/getpro/habr/post_images/6fd/71b/d9b/6fd71bd9b4a9d6d82fb9d9544a9b31fa.jpg)
図 12. grubテンプレートに基づいたブート構成ファイルの作成
GRUBを構成してコンピューターを再起動した後、すべてが正しく行われた場合、エミュレートされたデバイスは/ dev / pmem0 ... pmem3として表示されます。
永続メモリをエミュレートするためにメモリの予約領域をキャプチャしようとすると、読み取り専用メモリ(タイプ12)に関連する領域が破損します。
![](https://habrastorage.org/getpro/habr/post_images/a79/ca7/e9e/a79ca7e9ed08433fd59563ad42646436.jpg)
図 13.永続メモリエミュレーションに割り当てられた領域は、(タイプ12)としてマークされます。
設定時には、4 GBを超える範囲のメモリを使用するか(memmap = nnG!4G)、メモリカードを確認し(BIOS-e820を使用)、適切な範囲を選択することをお勧めします。
目的の仮想デバイスがシステムに表示されない場合は、図5に示すように、grubファイルのmemmap設定を確認してください。 11、次に-図13に示すように、dmesgを使用してメモリステータスを分析します。すべてが正しく構成されている場合、予約済みメモリ領域が表示されます。 読み取り専用メモリとして予約される重複しない領域がここに存在する場合があります。 構成中に複数のmemmapコマンドを使用すると、複数の仮想デバイスが作成され、カーネルによって提供され、/ dev / pmem0、/ dev / pmem1、/ dev / pmem2などとして表示されます。
ファイルシステムダイレクトアクセス拡張機能
ファイルシステムへのダイレクトアクセス(DAX)拡張により、PMEMで作業できる環境が作成されます。 Fedora 24以降のバージョンなどの一部のディストリビューションには、すでに組み込みのDAX / PMEMメカニズムがあり、そこではNVMライブラリ(NVML)も利用できます。
DAXとPMEMがカーネルに組み込まれているかどうかを確認する簡単な方法を次に示します。 これを行うには、egrepユーティリティを使用してカーネル構成ファイルを処理します。これは通常、配布パッケージの/ブートフォルダーにあります。
# egrep '(DAX|PMEM)' /boot/config-`uname –r`
このようなコマンドを実行した結果、およそ次のように表示されます。
CONFIG_X86_PMEM_LEGACY_DEVICE=y CONFIG_X86_PMEM_LEGACY=y CONFIG_BLK_DEV_RAM_DAX=y CONFIG_BLK_DEV_PMEM=m CONFIG_FS_DAX=y CONFIG_FS_DAX_PMD=y CONFIG_ARCH_HAS_PMEM_API=y
次のコマンドを使用して、DAXを使用してファイルシステムをインストールできます(現在はext4およびxfsが可能です)。
# mkdir /mnt/pmemdir # mkfs.ext4 /dev/pmem3 # mount -o dax /dev/pmem3 /mnt/pmemdir
これで、新しくマウントされたパーティションにファイルを作成し、入力としてNVMLプールに転送できます。
![](https://habrastorage.org/getpro/habr/post_images/37e/ad4/f95/37ead4f959134e482c348cbb27f0b421.jpg)
図 14.読み取り専用メモリのブロック
![](https://habrastorage.org/getpro/habr/post_images/06e/12f/e0d/06e12fe0d203c3be8f131e1b5f1bc8ba.jpg)
図 15.ファイルシステムを構築する
ramdisk(つまり、/ dev / shm)を使用するか、環境変数PMEM_IS_PMEM_FORCE = 1を設定することにより、永続メモリをエミュレートすることもできます。 これにより、msyncによるパフォーマンスへの影響を回避できます。
まとめ
これで、必要なハードウェアを使用せずにPMEMで動作するアプリケーションを作成できる環境を設定する方法がわかりました。Intelアーキテクチャーを搭載したサーバーで追加のスレッドを使用すると、新しいLinuxカーネルを迅速に構築でき、永続メモリを使用した実験に対応できます。