Transparent Huge Page という hugepage が Linux 2.6.37 から使用することができます。
とはいっても、Transparent Huge Page は default で always 設定(すべて hugepage 上に確保)になっているので、CentOS6, Fedora15 あたりの OS を使用している場合、知らず知らずのうちにその恩恵を授かっていると思われます。
本来 Linux は 4KB のページと呼ばれる block でメモリを扱うことになっていますが、この場合 virtual address から 4 段階の変換テーブルを参照して目的の物理メモリにアクセスすることができます。この 4KB ごとの TLB miss を軽減するには、大きなサイズのページ hugepage を採用することが有効です。2MB の hugepage を採用するとメモリアクセスは 1 段減り、TLB miss も約 1/512 となります。その代わり、小さなメモリ要求に対しても 2MB ごとの割り当てになってしまいメモリ量を有効活用できなくなります。
最適化系の数値計算を行う場合、大量のメモリを使用することになるので、hugepage による性能向上の効果は非常に大きいと言えます。最短路問題では 10% ほどの性能向上を確認しました。しかしながら、hugepage の確保は面倒な手順が必要です。Linux では「共有メモリ経由でのメモリ確保」と「hugetlbfs という特殊な file system に対する anonymous memory mapping によるメモリ確保」の 2 種類がありますのが、いずれもソースコードの変更が必要になります。簡単に利用する方法としては「libhugetlbfs ライブラリによる malloc/new 関数の hook」という荒業もありますが、すべての領域が hugepage 上に乗ってしまうので少々使いづらいと言えます。また、いずれの方法でも予め必要なメモリ領域を hugepage 専用として確保しなければなりません。
それに対して Transparent Huge Page では、予め必要な領域を確保する必要がなく、名前の通り透過的に hugepage を扱えるようになる機構です。
◯ Transparent Huge Page で確保したサイズの確認(例:never 設定なのほぼhugepageは0)
% grep Anon /proc/meminfo
◯ node 毎の Transparent Huge Page で確保したサイズの確認(例:never 設定なのでほぼhugepageは0)
% grep Anon /sys/devices/system/node/node*/meminfo
◯ Transparent Huge Page を使用するかどうかの設定
/sys/kernel/mm/transparent_hugepage/enabled
・[always] madvise never
常に THP を使用する設定。
・always [madvise] never
madvise 関数を用いて MAD_HUGEPAGE によって指定された領域のみを Transparent Huge Page に配置させる設定。※ 試していないので推測した情報です。
#include <sys/mman.h>
int madvise(void *addr, size_t length, int advice);
・always madvise [never]
常に THP を全く使用しない使用する設定。
【参考】
Transparent Hugepage Support / Red Hat Inc. @ KVM Forum 2010 Boston
www.linux-kvm.org/wiki/images/9/9e/2010-forum-thp.pdf
記事: より広大なメモリ領域を効率よく利用する -Transparent Hugepage- / Red Hat Inc.
http://www.jp.redhat.com/magazine/jp/201008/rhel.html
とはいっても、Transparent Huge Page は default で always 設定(すべて hugepage 上に確保)になっているので、CentOS6, Fedora15 あたりの OS を使用している場合、知らず知らずのうちにその恩恵を授かっていると思われます。
本来 Linux は 4KB のページと呼ばれる block でメモリを扱うことになっていますが、この場合 virtual address から 4 段階の変換テーブルを参照して目的の物理メモリにアクセスすることができます。この 4KB ごとの TLB miss を軽減するには、大きなサイズのページ hugepage を採用することが有効です。2MB の hugepage を採用するとメモリアクセスは 1 段減り、TLB miss も約 1/512 となります。その代わり、小さなメモリ要求に対しても 2MB ごとの割り当てになってしまいメモリ量を有効活用できなくなります。
最適化系の数値計算を行う場合、大量のメモリを使用することになるので、hugepage による性能向上の効果は非常に大きいと言えます。最短路問題では 10% ほどの性能向上を確認しました。しかしながら、hugepage の確保は面倒な手順が必要です。Linux では「共有メモリ経由でのメモリ確保」と「hugetlbfs という特殊な file system に対する anonymous memory mapping によるメモリ確保」の 2 種類がありますのが、いずれもソースコードの変更が必要になります。簡単に利用する方法としては「libhugetlbfs ライブラリによる malloc/new 関数の hook」という荒業もありますが、すべての領域が hugepage 上に乗ってしまうので少々使いづらいと言えます。また、いずれの方法でも予め必要なメモリ領域を hugepage 専用として確保しなければなりません。
それに対して Transparent Huge Page では、予め必要な領域を確保する必要がなく、名前の通り透過的に hugepage を扱えるようになる機構です。
◯ Transparent Huge Page で確保したサイズの確認(例:never 設定なのほぼhugepageは0)
% grep Anon /proc/meminfo
◯ node 毎の Transparent Huge Page で確保したサイズの確認(例:never 設定なのでほぼhugepageは0)
% grep Anon /sys/devices/system/node/node*/meminfo
◯ Transparent Huge Page を使用するかどうかの設定
/sys/kernel/mm/transparent_hugepage/enabled
・[always] madvise never
常に THP を使用する設定。
・always [madvise] never
madvise 関数を用いて MAD_HUGEPAGE によって指定された領域のみを Transparent Huge Page に配置させる設定。※ 試していないので推測した情報です。
#include <sys/mman.h>
int madvise(void *addr, size_t length, int advice);
・always madvise [never]
常に THP を全く使用しない使用する設定。
【参考】
Transparent Hugepage Support / Red Hat Inc. @ KVM Forum 2010 Boston
www.linux-kvm.org/wiki/images/9/9e/2010-forum-thp.pdf
記事: より広大なメモリ領域を効率よく利用する -Transparent Hugepage- / Red Hat Inc.
http://www.jp.redhat.com/magazine/jp/201008/rhel.html
※コメント投稿者のブログIDはブログ作成者のみに通知されます