萌えハッカーニュースリーダー

2025/04/12 22:15 Battle of the Mallocators

出典: http://smalldatum.blogspot.com/2025/04/battle-of-mallocators.html
hakase
博士

やあ、ロボ子。今日のITニュースは、RocksDBのメモリ管理についてじゃ。

roboko
ロボ子

RocksDBですね。どのような内容でしょうか?

hakase
博士

RocksDBを使うときは、メモリ不足(OOM)を避けるために、glibc mallocじゃなくてjemallocかtcmallocを使うのがおすすめらしいぞ。

roboko
ロボ子

glibc mallocだと何か問題があるんですか?

hakase
博士

RocksDBは、データを読み込むときにmallocをたくさん呼んで、不要になったらfreeするから、アロケータに負担がかかりやすいんじゃ。glibc mallocだと、ブロックのキャッシュ期間が長くなって、予想以上にメモリを食っちゃうらしい。

roboko
ロボ子

なるほど。jemallocとtcmallocはその点、優れているんですね。

hakase
博士

そうじゃ。jemallocとtcmallocは、メモリを無駄遣いせずに、このアロケーションパターンに対応できるってわけじゃ。

roboko
ロボ子

記事によると、InnoDBでは事情が異なるようですね。

hakase
博士

InnoDBは起動時にバッファプール用に大きなメモリを確保するから、RocksDBみたいに頻繁にmalloc/freeを繰り返さないんじゃ。だから、同じ問題は起こりにくい。

roboko
ロボ子

MySQLの専門家であるDimitri Kravtchukさんの主張も紹介されていますね。

hakase
博士

Dimitriさんは、InnoDBとjemallocを使うとメモリが大きくなりすぎると言ってるみたいじゃが、この記事の筆者は再現できなかったらしいぞ。

roboko
ロボ子

VSZ(仮想メモリサイズ)が大きくなるのはjemallocの特性によるもの、と。

hakase
博士

そういうことじゃ。問題ないって言ってるぞ。RSS(実メモリ使用量)はtcmallocと同程度らしい。

roboko
ロボ子

実際にOOMが発生したケースも紹介されていますね。

hakase
博士

glibc mallocを使ったとき、RocksDBのバッファプールが50GBで、128GBのRAMを積んだサーバーでOOMになったらしい。バッファプールを小さくすれば回避できたかもじゃが。

roboko
ロボ子

MyRocksでは通常、jemallocと100GBのバッファプールを使用しているんですね。

hakase
博士

ピーク時のRSSについても比較があるぞ。InnoDBだと、どのアロケータを使ってもほぼ同じくらいじゃが、MyRocksだとjemallocが一番小さくて、glibc mallocがめちゃくちゃ大きくなる。

roboko
ロボ子

MyRocksでglibc mallocを使うと、バッファプールの3.62倍もメモリを消費するんですね。

hakase
博士

そういうことじゃ。パフォーマンスはどうじゃろう?

roboko
ロボ子

jemallocとtcmallocを使った方が、glibc mallocより少しQPS(1秒あたりのクエリ数)が良いみたいです。

hakase
博士

InnoDBだと2.5%から3.5%くらい、MyRocksだと3%から5.1%くらいQPSが向上するみたいじゃな。

roboko
ロボ子

マイクロベンチマークの結果も興味深いですね。

hakase
博士

細かい条件によって、jemallocとtcmallocの優劣が入れ替わるみたいじゃな。でも、全体的にはjemallocの方が良い結果が出てるみたいじゃ。

roboko
ロボ子

今回の記事から、RocksDBを使う際はjemallocかtcmallocを検討することが重要だとわかりました。

hakase
博士

そういうことじゃ。メモリ管理をしっかりして、快適なデータベースライフを送るのじゃ!

roboko
ロボ子

はい、博士! ちなみに、博士の部屋のメモリもそろそろ整理が必要かもしれませんね。

hakase
博士

む、うるさいぞ! 私の部屋は最適化されているんじゃ! たぶん…。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search