GoogleのTCMallocをCおよびC++の既定のメモリアロケータの置き換えとして使用することで、大規模プログラムでの効率の向上や並列性サポートの改善が実現する、とGoogleは述べている。
曖昧さを払拭するという意味から、Googleがメモリアロケータをオープンソースとして公開したのは今回が2回目である、ということには触れておいた方がよいだろう。事実として2005年にも、メモリプロファイラ、ヒープの一貫性を保証するヒープチェッカ、Perlベースのppro
アナライザとビジュアライザなど、多数のツールを備えたGoogle Performance Toolsの一部として、メモリアロケータも提供されていたのだ。しかしながらそれ以降、Google内で使用されている社内バージョンが、時間とともに公開バージョンから乖離してしまったことから、改めてGoogleは、CPU単位のキャッシュやサイズ削減、高速/低速パスの改善など、いくつかの改良を加えた現行バージョンのTCMallocを公開することにしたのだ。
このリポジトリはGoogleのTCMallocの現行の実装で、当社が運用しているほぼすべてのCプログラムで使用されています。公開されるコードは、メモリアロケーションの実装のみです。
上記から想像できるように、TCMallocにはCの*alloc
ファミリとC++の::operator new
および::operator delete
の実装が含まれている。CおよびC++の標準ライブラリに含まれている相当品と比較して、これらには数多くの最適化が施されている。例えばTCMallocでは、OSからのアロケーションを固定サイズの"ページ"を使って行うことで、ブックキーピングを簡略なものにしている。さらに、これらページの一部は、例えばすべて16バイトのオブジェクトというように、特定サイズのオブジェクト専用になっている。これにより、メモリの取得やリリースはさらに簡略化される。最後に、共有で使用されるオブジェクトは、オペレーション速度向上のためにキャッシュされている。
TCMallocはMallocExtension
によるテレメトリエクステンションもサポートしている。ヒープのプロファイルとスナップショットを収集して、メモリ操作を調査する場合に有効である。
多数の設定オプションが用意されていて、TCMallocのパフォーマンスをチューニングすることが可能である。例えば論理的ページサイズの定義が可能で、4KiB、8KiB、32KiB、256KiBを指定することができる。ページサイズを大きくすることで、OSへの新たなメモリアロケーション要求の可能性を削減できる反面、スピードアップの代償としてメモリ消費量は増加する。キャッシュサイズをスレッド単位またはCPUベースで設定することも可能で、デフォルトでは後者になる。ページサイズと同じく、キャッシュサイズを大きくすることでパフォーマンスが向上する。最後に、メモリ開放の積極性をチューニングすることが可能である。これもいくつかの面でパフォーマンスに関与する。
以下の図はTCMallocのアーキテクチャを示したものである。詳細は関連するドキュメントに説明されている。
TCMallocはGoogleが社内利用するビルドシステムであるBazelでのみビルド可能である。他のビルドシステムを使用している開発者にとっては嬉しくないサプライズになるかも知れない。ただしBazelはmacOS、Ubuntu、Fedora、Windows用にバイナリ形式で公開されているので、これが大きな障害になることはないはずだ。