BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Google独自のC/C++用メモリアロケータTCMallocがオープンソースとして公開へ

Google独自のC/C++用メモリアロケータTCMallocがオープンソースとして公開へ

原文(投稿日:2020/02/25)へのリンク

GoogleのTCMallocCおよび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用にバイナリ形式で公開されているので、これが大きな障害になることはないはずだ。

この記事に星をつける

おすすめ度
スタイル

BT