web-dev-qa-db-ja.com

サーバーが巨大なページ(メモリページサイズ)を使用する必要があるかどうかを知る方法

クラスタ内に複数のサーバーがあり、どのような場合に巨大なページを構成する必要があるのか​​を知りたいですか?

私もいくつかのquastionsがあります

  1. 線量「メモリページサイズ」は巨大なページに等しいですか?

linuxサーバーで、次のコマンドを入力して、デフォルトのメモリページサイズを確認しました

grep Hugepagesize /proc/meminfo

Hugepagesize: 2048 kB

getconf PAGESIZE

4096
  1. しかし、ここですべて見るように、異なる結果が得られます、なぜですか?

  2. 巨大なページを使用する場合のリスクは何ですか?

  3. dose透明な巨大なページを無効にする-巨大なページオプションを無効にすることを意味しますか?

1
shalom

巨大なページは、アプリケーションがランダムアクセスを行う大きなマッピングを必要とする場合に興味深いものです。これは、トランスレーションルックアサイドバッファー(TLB)の最悪のケースであるためです。 TLBエントリのマッピング粒度をトレードオフします。

巨大ページを含むページは、同じサイズの物理メモリブロックにのみマップでき、そのサイズに揃えることができます。したがって、2 MBの巨大ページを物理RAMの2MBの境界にマップする必要があり、1GBの巨大ページを1GBの境界にマップする必要があります。これは、下位ビットがページ内のデータをアドレス指定し、ここにオフセットを追加できないためです。

つまり、巨大ページは通常、物理メモリがまだ断片化されていないシステムの起動時に予約されます。巨大ページを認識するアプリケーションは、hugetlbfsを使用してそれらを割り当てることができます。

カーネルパラメータを使用して、巨大ページのサイズを2MBにするか1GBにするかを決定する必要があります。これらを混在させることはできません。通常の4kBページはいつでも利用できます。

最も一般的な使用例は仮想マシンです(qemu/kvmはhugepagesを使用できます)。これにより、VMのメモリマッピング全体を少数のTLBエントリに保持できるため、削除されることはないため、VMゲストコンテキスト内でのみページテーブルルックアップが必要です。

一部のデータベースシステムは巨大ページもサポートしていますが、これは通常、大きなデータセットとインデックスを操作する場合にのみ役立ちます。

質問:

  1. 通常の(4kB)ページと巨大な(2MBまたは1GB)ページがあります。ページサイズを照会すると、通常のページのサイズが取得され、巨大なページサイズを照会すると、巨大なページの設定が取得されます。通常のページと巨大なページの両方を並行して使用できますが、異なる巨大なページサイズを混在させることはできません。

  2. これらは2つの異なるものであるため、異なる結果が得られます。通常のページのサイズはハードウェアで固定されているため、設定ではありません。

  3. 巨大なページは早期に割り当てる必要があり、メモリは技術的に「空き」ですが、巨大なページを認識するアプリケーション以外には使用できないため、これらのアプリケーションを除くすべてのアプリケーションで使用できるメモリが少なくなります。 VMやデータベースなどのメモリを大量に消費するアプリケーション専用のマシンでhugepageを使用するため、通常は問題ありません。

  4. 透過的なhugepagesは、メモリをバッファおよびキャッシュとして使用できるようにし(#3とは異なり)、大きなメモリブロックをマップするアプリケーションにhugepagesを提供しようとします。これにより、hugepageを認識しないアプリケーションでも、それらから利益を得ることができます。 2MB/1GBのメモリブロックを要求すると、可能であれば巨大なページが与えられます。これがパフォーマンスを向上させるか低下させるかは、アプリケーションによって異なります。巨大なページを認識するアプリがあり、メモリを手動で割り当てたい場合は、THPを無効にする必要がありますが、巨大なページを理解しないデータベースアプリを備えたシステムはおそらくメリットがあります。

4
Simon Richter

巨大なページの明らかな使用例は、PageTables(/ proc/meminfoに表示)が数十GBになる場合です。これは、メモリを追跡するだけの大きなメモリとCPUのオーバーヘッドを意味します。これは、メモリの巨大なチャンク、多数のプロセス、またはその両方で発生します。多くの場合、データベースアプリケーションで。

単一のページテーブルエントリが4KBではなく2,048KBなど、はるかに多くのメモリをアドレス指定するようになったため、巨大なページはそのオーバーヘッドを大幅に削減します。 (他のプラットフォームにはさまざまなサイズがあります。たとえば、AIX on POWERは16MBの大きなページをサポートします。)

Linuxの巨大なページはファイルのキャッシュに使用できない可能性があり、非共有メモリのmalloc()に数MBかかると、煩わしく非効率的です。したがって、管理者は、特定の目的にのみ使用できる巨大なページプールを割り当てる必要があります。これは、巨大なページを使用することの短所です。

透過的巨大ページ(THP)は、連続するメモリを巨大なページに自動的に「断片化解除」することにより、管理の煩わしさを軽減しようとします。これにより、事前に割り当てられた巨大なページがオプションになるという考えでした。利点はワークロードに非常に固有であり、CPUを使いすぎて価値がなくなる可能性があります。 THPを無効にすると、巨大なページを手動で割り当てることができます。 THPをオフにして、データベースの共有メモリセグメントを巨大なページに配置するだけの価値がある場合があります。

Linuxの巨大なページについての最後の不満:私はそれを管理するのが面倒だと思います。

  • 共有メモリは1つのインターフェイスを使用しますが、他のインターフェイスには、hugetlbfsライブラリとファイルシステムを使用します。
  • 巨大なページを割り当てすぎて、それを使用するようにアプリケーションを構成しないことで、メモリを「浪費」することができます。
  • そのページ数は、メモリのパーセンテージではなくページ数であるため、各ホストサイズに合わせてスケーリングする必要があります。
  • 多くの場合、巨大なページを割り当てる機能は1つのグループに制限されており、データベースユーザーを切り替えると、予期しないメモリの浪費につながる可能性があります。
3
John Mahowald