- Fullstaq Ruby: Ruby, optimized for production
- 作者は Hongli Lai
- Passengerの作者
- PassengerのEnterprise版を提供しているPhusion社のCTO
- かつてはRuby Enterprise Editionの開発もやっていた
- Passengerの作者
- Fullstaq Rubyは、Fullstaq社との協業という位置づけらしい
- Hongli LaiはPhusion社のCTOのまま
- Server Edition、Container Edition、Heroku Editionの3 Editionで提供予定
- 今公開されているのはServer Editionのみ。Container Edition、Heroku EditionはComing soon。
- Projects: fullstaq-labs/fullstaq-ruby-umbrella/projects
- オープンソースで、ソースはGitHubに公開されている
- fullstaq-labs
- Server Editionのソース: fullstaq-labs/fullstaq-ruby-server-edition
- MRIをベースにして、Less memory 、Faster、More secureを実現しているって
- コンパイル済みのバイナリを提供しており、サーバにコンパイラを入れる必要がない
- (MJITを使いたくなったら結局コンパイラいるのでは感はある
- バイナリは各OSのパッケージ(apt、yum)で提供されている
- これにより、他のライブラリ同様に、OSが提供しているパッケージマネージャーの仕組みでRubyの更新が出来る
- 各OSが標準が提供しているパッケージと異なり、Rubyのパッチバージョン毎にバイナリを提供する事を保証している
- そのため、各OSが提供しているパッケージよりもはやく安全なRubyを使用出来る
- rbenvでインストールする事も出来る
- fullstaq-labs/fullstaq-rbenv
- これは一つのマシンで複数のRubyをインストールする必要があるケースに対応する為、らしい
- jemallocとmalloc_trimを使うようにしたバージョンが提供されている
- jemallocはmalloc, free 等のメモリアロケーションAPIを実装したライブラリ
- Free BSDでは標準ライブラリ
- Linux glibcのmallocだとマルチスレッドで使用すると効率が悪い、という話がそもそもある
- 断片化がおこりやすくメモリ使用量が増大する
- jemallocではマルチスレッドプログラムのスケーラビリティの改善、断片化を減らす為の改善等が行われている
- 結果、glibcのmallocよりメモリ効率が良くなる(事もある)
- 特にマルチスレッド環境
- Firefox やRedisではjemallocが使われるようになっている
- Redisのリポジトリにjemallocのコードが含まれている antirez/redis/tree/unstable/deps/jemalloc
- 似たようなライブラリでGoogleが開発しているtcmallocというのもある
- gperftools/gperftools
- Shopifyはtcmallocを使っているらしい(今どうかはちょっとわからないが、かつてはそう)
- 他にもrpmallocとかもある
- 合わせて読みたい: SamSaffron/allocator_bench
- Ruby本体がデフォルトでjemallocを使うようにならないの? という話は当然あるのだが、特定のOSや一部ライブラリで問題があるケースがあるらしい
- 因みにRustは元々jemallocをデフォルトで使っていたのを1.32.0でやめたらしい
- Ruby本体に
--with-jemalloc
というjemallocを使用する用のオプションがあり、これを使用している - Rubyのdescriptionを表示する際に"+jemalloc"と表示されるようにする為のパッチを使用している
- このパッチ以外はRubyのコードはそのまま
- jemalloc 3系だとメモリ使用量の削減があるが、5系だとその削減が無いらしく、jemalloc 3系を使うようにしている
- ヒープから未使用メモリを解放する為の関数
- Man page of MALLOC_TRIM
- RubyのGCでこの関数を呼ぶようにすると、メモリ使用量が改善した、とのこと
- What causes Ruby memory bloat? – Joyful Bikeshedding
- Fullstaq Ruby + malloc_trimではGCでこの関数を呼び出す為のパッチを組み込んでいる
- Ruby本体への導入は議論中
- malloc_trimについての参考: Cables vs. malloc_trim, or yet another Ruby memory usage benchmark
- Fullstaq Ruby: First impressions, and how to migrate your Docker/Kubernetes Ruby apps today
- Evil Martians社の事例
- Compacting GCが全てを解決する未来を期待したい