研究日誌。

大規模なグラフ処理に対してメモリ階層構造を考慮した高性能なソフトウェアを開発。

大容量 RAM 搭載計算サーバでの huge page の利用

2012-06-05 17:23:28 | Weblog
大容量 RAM を搭載した計算機で大規模なメモリを扱った実験を行うと、TLB ミスにより性能低下が起こってしまうという現象に遭遇することになる。例えば TLB の大きさは一般的なプロセッサでは 1MB であるので、以下のように 1MB / sizeof(void *) = 128K 個のエントリとなる。

ここで page size が 4096 byte である場合には、TLB に保持できるのは以下のように 128K x 4096B = 0.5 GB 分のポインタとなり、頻繁に TLB ミスが発生してしまうことが予測される。

そこで登場するのが huge page である。これまでの linux では hugetlbfs や共有メモリ経由でメモリ確保を行っていたので利用が少々手間であった。CentOS6 からは default で transparent huge page が enable となっていて、文字通り透過的に(自動的に) huge page を利用することができるようになった。huge page を利用すると、2MB の page 単位でメモリ確保を行うので、以下のようにTLB ミスを約 1/512 (2MB / 4KB = 512 から)と大きく減らすことができる。page size は OS やプロセッサに応じて異なる。

page size が 2MB では、理想的なメモリアロケーションであっても TLB に保持できるのは以下のように 256 GB 分のポインタとなっている。128K x 2MB = 256 GB というのは理想的にメモリアロケーションである場合であり、小さなアロケーションを繰り返した際には 256 GB よりも随分小さくなる。といっても十分に大きいため一般的な計算機実験では問題になることが少ない。しかしながら 256 GB 以上の大規模メモリを用いた実験ではやはり TLB ミスによる性能低下が予測される。例えばグラフ関係のアルゴリズムはストリーミング処理のように1度きりしか使用しないデータアクセスが多発する数値実験では、やはり TLB ミスによる性能低下で性能が引き出すことできないといった状況に出くわすことが多い。

ここで page size を大きく変更する方法を紹介する。まず default の page は 4KB で、default の huge page は 2MB となっているが、それに対し redhut 系の OS で x86-64 では 1GB の huge page に対応している。page size が 1GB になると以下のように 128K x 1GB = 128 TB 分のポインタを扱うことができるため、TLB ミスの回数を激減させることができる。しかしながらアロケーションの単位が 1GB となるので注意が必要になる。

1G の huge page の使用方法にあたっての設定は非常に簡単で、kernel の boot option で「hugepagesz=1GB default_hugepagesz=1GB」を追加するだけである。/boot/grub/grub.conf 内で現在選択されている kernel の末尾に追加し、reboot するのが簡単である。これを用いた数値実験結果については次回のエントリーとする。

最新の画像もっと見る

コメントを投稿