GCアルゴリズムのほうがRailsよりカンタン!?
電子書籍に特化したオンラインの出版社、達人出版会から、『徹底解剖「G1GC」 アルゴリズム編』(中村成洋著、600円)が6月末に出ました。Java7(OpenJDK7)で採用されたG1GCアルゴリズムを、豊富な図を使って丁寧に解説した本です。A4換算で60ページほどです。
島根在住の中村さんに、Skypeでお話を伺いました。
GCアルゴリズムを網羅的に解説した前著とも言える『ガベージコレクションのアルゴリズムと実装』と併せて読むのがオススメだそうですが、私は中村さんが管理している「GCアルゴリズム詳細解説」のWikiと併せて読みました。GCの各種アルゴリズムって並行処理時の整合性確保のための実装や性能評価は難しいのでしょうけど、アイデア自体は、そこまで複雑じゃないものが多いですよね。ヒープメモリという部屋をどう区分けして、そこにどういう性質(生存期間や生き死に)のオブジェクト群を、どう配置し、どういうタイミングで再配置したり、廃棄するかという戦略の話なので、図を見ながら「へー、なるほど」と頷く程度なら、門外漢でも案外楽しめます。
図が豊富で分かりやすい解説
CRubyコミッタで、『徹底解剖「G1GC」 アルゴリズム編』の著者、中村成洋氏
nari3のidで知られる中村さんは、CRubyのコミッタ(Ruby開発チームのコアメンバ)です。CRubyのコミッタには大きく2タイプがいます。Ruby全体を見ていて、あらゆる種類のパッチを書く人と、ある特定ジャンルをカバーする人です。中村さんは後者で、8月26日にリリースされる予定のRuby 1.9.3に搭載される新しいGC(Garbage Collector)のパッチを作成されました。これまでのRubyでは、GCにマーク&スイープと呼ばれるアルゴリズムを使っていて、オブジェクトの参照のツリーをたどっていきながら参照がないオブジェクトを確定し、続いてメモリを一気に開放(スイープ)する仕組みでした。新たに中村さんが実装した「Lazy Sweep GC」では、この開放のプロセスを複数回に分けることによって、GC動作時の最大停止時間が短くできるそうです。
アイスクリーム工場からRubyコミッタに
中村さんは、もともとアイスクリーム工場で流れ作業をやっていたそうです。ソフトウェア開発者という現在のお仕事からすると、ちょっと信じがたい経歴です。
工場で働いていたある時、半年でプログラミングができるようになるという広告を目にして学校に通い、JavaでWebアプリを作る仕事を得て、プログラミングの世界に転身したそうです。その頃、Rubyistの間では有名な『Rubyソースコード完全解説』(青木峰郎著、まつもとゆきひろ監修)を読んだことがきっかけで、GCの世界に目覚めたそうです(Rubyソースコード完全解説は2002年刊行で、すでに絶版ですが、HTML版としてオンラインで読めます)。現在はRubyの生みの親であるまつもとゆきひろさんと同じく、島根県のネットワーク応用通信研究所にお勤めです。日頃はRailsを中心にWebアプリ開発をしていて、CRuby関連の仕事は基本的に業務外で取り組んでらっしゃるそうです。
最大停止時間を“ほぼ”一定に抑える「G1GC」
さて、G1GCですが、これはメモリ容量が大きい最近のサーバ環境で、最大停止時間をなるべく一定時間に抑えたいというニーズに応えるアルゴリズムです。いわゆる組み込みなどでいうリアルタイム処理とは異なり、最大停止時間を超えることが“ほぼ”ない、というソフト・リアルタイム性を実現しているのが特徴だそうです。サーバアプリケーションで電話の着信をさばくようなケースを想定しているとのことです。
G1GCでは、このソフト・リアルタイム性を実現するために、ヒープを小さなリージョン(領域)に分けて、それぞれのリージョンごとに小さなGCを走らせます。このとき、それぞれのリージョンのGCにかかる予測時間が、各リージョンごとに管理されています。中村さんの本の中では、「並行マーキング」と、リージョン内のオブジェクトのうち生きているものだけを空いている別リージョンに「退避」する仕組みについて詳しく解説されています。
そんなG1GCですが、本書を読めばJava開発者なら今後チューニングに役立つ知識が身に付くかもしれません。残念ながらG1GCは特許が成立しているそうで、Rubyに搭載される見込みはありませんが、純粋に読み物としても面白いのでRubyistにもオススメです。
ところで、中村さんはGCが本当に好きで、今や日本でも上から数えたほうがいいぐらいにGCに詳しいエンジニアですが、意外にも「Rails開発は難しい」と言います。
「Webアプリケーションって、いい加減にやればすぐ作れちゃうでしょうけど、セキュリティとかチューニングとかちゃんとやろうと思うと幅広い知識が求められますよね。GCだったらGCだけ、あるいはOSの泥臭いところを勉強すればいいだけですけど、Webアプリは全然違う分野を勉強しないといけなくて大変すぎるなー、という印象があります」
GCとWebアプリだと難しさの質が違うのでしょうか。