/proc/meminfo 上の DirectMap の表示・非表示について

こんにちは。サイオステクノロジー OSS サポート担当の山本です。

メモリ情報を確認するための /proc/meminfo について、マシンによって表示されない項目がある、
というお話がありました。「DirectMap1G」という項目なのですが、今回はこの項目についてお話したいと思います。

/proc/meminfo には他にも「DirectMap4k」や「DirectMap2M」のような、似た名前の項目が存在しています。

sample

■メモリとページとその使われ方

/proc/meminfo に存在している情報であることからもわかるとおり、DirectMap もメモリに関するデータです。DirectMap についてお話する前に、Linux でのメモリの扱われ方について先にお話します。

一般的に、コンピュータにおいてメモリは一定の単位の「仮想メモリ」として管理されています。
この「一定サイズの仮想メモリの単位」は「ページ」と呼ばれています。

ページには「その仮想メモリのデータが実際の物理メモリ上ではどこに存在しているのか」といったような情報が記録され、一般的にメモリ上に存在している「ページテーブル」上で記録・管理されています。

また、ページの情報をより高速に活用するために、「TLB (Translation Lookaside Buffer)」という領域が存在しています。
TLB は一般的に CPU 内など高速な処理を行なえる領域に設けられており、ここにページ情報を保持することで高速に実メモリへのアクセスが可能ですが、記録できるページ数はあまり多くありません。

■通常のページと考えられる問題

Linux の Kernel で管理されているページのサイズは通常 4KB です。当然、物理メモリもその単位で管理されることになります。

4kb 毎に区切られるということは、例えば 4KB を超えるメモリを使用するプロセスがあった場合、このプロセスはメモリ上の 1つのデータにアクセスするのに複数回のメモリアドレスの計算やメモリアクセスを行なう必要がある可能性があり、処理性能の低下を招く可能性が考えられます。

また、ページのサイズが 4KB である場合、例えば 4GB のメモリの領域を 4KB のページでカバーするには 1048576 個のページ情報が管理できるページテーブルが必要となります。
当然ながら、TLB でカバーできる比率は低く、高速なメモリアクセスが活きる機会が少なくなることが考えられます。

■打開策?HugePages

これらの問題を解決できる仕組みが「HugePages」です。その名のとおり、4KB を超える「大きなページ」を作成します。

HugePages ではそのサイズ分のメモリを一続きで確保できるため、4KB を超える多量のメモリを使用するようなプロセスで HugePages を使用すると、通常の 4KB のページで発生する可能性がある複数回のメモリアドレス計算などを行う必要がなくなり、その分負荷が軽減できることを見込めます。

また、HugePages を使用する場合でも一つのページは一つのページとして扱われるため、必要なページテーブルの数が減ります。これは TLB 上でも同様であるため、TLB によるメモリの高速アクセスが可能な総メモリ量が増えることを見込めます。

この「HugePages」で使用できるメモリ領域のサイズを示しているのが、DirectMap となります。
例えば、「DirectMap2M」なら 2MB の HugePages を作成できる領域サイズを示し、「DirectMap4M」なら 4MB の HugePages を作成できる領域サイズを示します。通常の 4KB のページとして使用できる領域サイズは、同様に「DirectMap4K」で示されています。

例えば、以下の例では 4KB のページが 20976個 (83904KB / 4KB) と、2MB のページが 983個 (2013184KB / 2048KB) それぞれ作成できる状態です。

[root@example ~]# cat /proc/meminfo | grep DirectMap
DirectMap4k:       83904 kB
DirectMap2M:     2013184 kB
[root@example ~]#

■結局、何故「DirectMap1G」が表示されなかったのか

もうお察しかとは思いますが、DirectMap はそのサイズの HugePages を作成できる領域のサイズを示す項目なので、「DirectMap1G」という項目は 1GB の HugePages の作成に使用できる領域のサイズを示すものとなります。

冒頭でお話した「DirectMap1G」が表示されたりされなかったりする原因は、この項目は 1GB の Hugepages が使用できない場合には表示されず、1GB の HugePages を使用するためには条件があるためでした。その条件は、以下の2つになります。

 ①、CPU が 1GB の HugePages に対応している。
  (/proc/cpuinfo の flags に「pdpe1gb」が含まれている場合、1GB の HugePages に対応しています)
 ②、カーネルの起動オプションで 1GB の HugePages を無効化していない。
  (nogbpages というオプションが該当します)

この条件に合致せず 1GB の HugePages が使用できない場合、/proc/meminfo には「DirectMap1G」が表示されない、ということでした。

■最後に

以上、「/proc/meminfo 上の DirectMap の表示・非表示について」のお話でした。
今回記載した内容につきましては基本的に設定などで変更できるものではなく、そこまで頻繁に見ることはないかと思いますが、頭の片隅に置いておくと確認できる内容が少し増え、/proc/meminfo を確認する目的を達成するための糸口になることもある…かも知れません。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

2人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です