The FreeBSD Release Engineering Teamは2009年5月4日、最新のリリース版となるFreeBSD 7.2-RELEASEを発表しました。7.2は従来の機能の改善や新機能が追加されたアップデート版で、いくつかの注目すべき新機能が追加されています。この記事では2回に分けて注目の新機能を紹介します。
ハードウェア進化とTLBヒット率の低下
仮想メモリアドレスと物理メモリアドレスのアドレス変換の際に、プロセッサのTLB(Translation Lookaside Buffer)が高速バッファとして使われます。TLBはシステムの性能を左右する重要な要因のひとつで、TLBにおけるヒット率の低下はシステム性能の低下につながります。しかし、PCに搭載するメインメモリの増加や大量のメモリを消費するアプリケーションが続々と登場することでTLBでマッピングするアドレス空間も広がることになり、結果としてTLBのヒット率は年々低下しています。
TLBヒット率を上げるために─4KBを組み合わせて1つの大きなページへ
FreeBSDではページサイズを4Kバイトで扱います。マッピングするアドレス空間が広がれば、TLBでのページアドレス変換のヒット率もそれだけ低下することになります。最近のプロセッサのTLBには、4Kバイトより大きなページを扱える機能が用意されています。簡単に考えれば、ページのサイズを大きくすれば、TLBで扱う対象が減ることになり、それだけヒットミスも低下することになります。しかし単純にページサイズを引き上げると、それだけ消費する物理メモリのサイズが増えることになり、メモリ枯渇も早まることになります。
大きなページを使ってTLBのヒット率を向上させつつ、従来の4Kバイトというページの仕組みも活用してメモリ消費を増やさないようにするために、4Kバイトのページをいくつか合わせてひとつの大きなページとして確保して使う方法があります。この方法では、どのタイミングでプロモート/デプロモートするか、フラグメンテーションが発生しやすくなるのをどうやって抑えるか、データの連続性をどうやって実現するか、といった課題があります。
大きなサイズのページを使う方法はこれまでもありましたが、これを活用するためにアプリケーションやユーザランド側に変更を加える必要があったり、特定の条件で性能が劣化するといった問題がありました。今回FreeBSDに追加されたSuperpagesの機能は、そうした問題を解決しつつ、完全にトランスペアレントになっており、カーネルの変更だけでユーザランドのアプリケーションには変更を加えることなくその恩恵に与ることが可能なところに特徴があります。
2003年の実証実験で性能向上を確認-Rice大学
Superpagesの研究と実証実験は最近始まったことではなく、2003年ごろ活発に取り組みが行われていました。Rice大学においてJuan Navarro氏、Sitaram Iyer氏、Peter Druschel氏、Alan Cox氏らが同研究成果を発表しており、若干劣化するアプリケーションもあるものの、ほとんどのケースで性能が向上することが確認されたという報告があります。
Alan Cox氏らが取り組んだ実験では、Alpha 21264 500MHz/512MバイトのマシンにFreeBSD 4.3を搭載した実験機で、128-entry DTLB/128-entry ITLBにおいて8Kバイト/64Kバイト/512Kバイト/4Mバイトのページサイズがテストされ、35のベンチマークのうち8つのベンチマークで30%を越える改善が確認できたと報告されています。この取り組みでは、固定サイズのページを使うのではなく複数のページサイズを柔軟に使ったこと、実装をトランスペアレントに実現できたこと、データ連続性の維持やフラグメント発生の抑制に成功したこと、多くのケースで性能の改善が確認できたこと、といった成果も報告されました。
7.2-RELEASEではデフォルトで無効
今回、FreeBSD 7.2-RELEASEにマージされたSuperpagesの機能はAlan Cox氏によって作業が行われました。同氏が取り組んできた実験成果がマージされたものと見られます。FreeBSDの仮想マシンは4系から大幅に変更が施されてきたため、HEADにマージする段階で最新の仮想マシンへの対応も行われているようです。
なお今回追加されたSuperpagesの機能はデフォルトでは無効に設定されています。vm.pmap.pg_ps_enabledを1に設定することで有効にできます。多くのケースで性能向上が期待できる機能ですので、パフォーマンスを引き上げたい場合には試してみるといいでしょう。次のリリースや8系ではデフォルトで有効になると思われます。