RubyKaigi2011 スペシャルレポート

日本Ruby会議2011 1日目レポート[更新終了]

この記事を読むのに必要な時間:およそ 19 分

田辺浩介さん「日本の図書館はどのようにRubyを使っているか ―「Next-L Enju」「国会図書館サーチ」」

慶應義塾大学とオープンソース図書館システム開発プロジェクト Project Next-Lに所属する田辺浩介さんによる発表です。 オープンソース化された図書館システムの事例紹介から始まり,自らがRailsで作製した図書館システムについての話や,Rubyで作られたシステムの事例について語りました。

Next-Lプロジェクトについて

Next-Lプロジェクトは,図書館関係者で図書館システムをつくろうという意志のもと結成されたものであり,田辺さん自身は結成当時からずっと開発に携わっていると言います。

なぜNext-Lプロジェクトで,Enjuを作ろうと思ったのか

職場の図書館がシステム化されておらず,すべて紙での処理に嫌気が差したため,自分で図書館システムを作ることを決意したのがきっかけと語ります。最初はPHPで作り始めましたが,うまく動作しないために挫折してしまったとのこと。そしてWebフレームワークという便利なものがあることを知り,Railsに出会ったとのこと。

『ライド・オン・Rails』という書籍で全文検索を知り,図書館システム実現への大きな一歩となりました。⁠ライド・オン・Rails』に掲載されていたPostgreSQLやMySQLを使い,全文検索を実現するサンプルが期待通り動いたためRailsで製作することを決意したと振り返ります。

また,図書館システムと検索機能の間には特殊なつながりがあると言及しました。これは,利用者向けには簡単に使える検索機能を提供し,司書向けには複雑な検索機能を提供するという要求があるからとのこと。 例として利用者向けの検索インターフェイスとしてGoogleの検索窓を,司書向けの検索インターフェイスとして,実際の図書館システムの検索インターフェイスを示しました。

Railsを使っていてよかったこと

RailsのよかったところとしてRestfulであることを挙げました。新着資料のRSSなど,RestAPIを備える図書館システムが増加しており,図書館システムの方向性とマッチしていたという背景があったそうです。

構築で苦労した点

苦労した点については,画面表示が遅いことを挙げました。職場の蔵書数が少ないことから大規模なシステムになることは想定していなかったのですが,あっという間に重たいシステムになってしまった過去があったそうです。この時は,テンプレートキャッシュを用いることで画面表示の遅さを解消したという話です。

事例紹介

物質・材料研究図書館や笹川スポーツ財団へNext-L Enjuを導入した事例を紹介しました。

また,Rubyを使用した図書館システムは最近になって出てきたように見えますが,実は10年程前から事例が存在することを挙げました。 神戸市図書館情報ネットワークでは,公共の図書館と大学の図書館を一緒に扱うシステムを保有しているのですが,実は公共向け図書館業務と大学向け図書館業務を一緒に扱えるパッケージは存在しなかったそうです。そこで,神戸市図書館情報ネットワークでは47万人のユーザーをRuby1.8.5とgtkで作ったインターフェイス,Oracleなどで支えていることを紹介しました。なぜRubyを導入したかと言うと,多少の改修であれば図書館員が自ら行えるように,日本語のサポートを受けられる言語でかつ可読性の高いRubyが選ばれたとのことです。

なお,この神戸市図書館情報ネットワークの動作デモ動画が上映されたのですが,図書目録機能はEmacs lispが使われており,おもむろにEmacs上にて業務を行う様子が上映された際には,会場からどよめきが起こりました。

画像

画像

nariさん「CRubyGCの並列世界」

CRubyコミッタのnariさんによるGCの並列化の発表です。現在のCRubyのGCはコアを一つしか使わないようになっているそうです。WALL-Eの画像を表示しながら,大量のゴミを一人で集めるのは大変であり,問題があると述べました。その解決策として,並列にGCを行なえば効率化できるとのことです。

マーキングを並列に

現在のCRubyのGCはマーク&スイープというアルゴリズムを採用しており,このアルゴリズムはルートを辿って生きていけるオブジェクトに印つけ(マーク⁠⁠,マークついてないのを削除(スイープ)するというものであることを紹介しました。特徴として,シングルスレッド実装なので,Stop The World,つまりGC中は他のスレッドはすべて停止してしまうことを挙げました。

最近のマシンはマルチコアがあたりまえになっており,GC中に他のコアが遊んでしまうのは問題だと言います。CRubyはGVLがあるので一コアになっていますが,GCまで一コアにする必要はないと言います。

今回nariさんが実装したGCは,マーク&スイープのマークの部分を並列に行なうそうです。この際にネイティブスレッドを利用しているとのこと。そして4コアぐらいから効果を発揮するのではないかと紹介しました。GC中のStop The Worldは変わらないらしく,シングルスレッド同様,GC中はアプリケーションスレッドはすべて停止するとのことですが,マーキングを並列に行なう分スループットの向上が望めるそうです。マーキングだけを並列にし,スイープにしない理由は笹田さんの調査の結果,スイープはそこまで遅くないというのが分かっているからとのことでした。

実装内容

実装の内容として各スレッドへの仕事の分配方法とLock-Freeについて説明しました。仕事の分配はルートから生えている枝葉に対して個別にスレッドを割り当てていくと,枝葉の大きさに偏りがあった場合に小さい枝葉のスレッドから仕事が終わってしまうため,結果的にコアに遊びができてしまうそうです。そこで,手が空いたスレッドは別のスレッドからタスクを盗んでくるTask Stealingという手段を採用したとのことでした。Lock-Freeはスレッドがロックせず進行が保証されることですが,nariさんはアムダールの法則を持ち出し,なぜLock-Freeが重要かを語りました。

具体的な実装については,Rubyによく似た疑似コードを用いて主にLock-FreeなThe deque(topとbottomを持つデータ構造)について説明しました。この実装でベンチマークをはかったら実は通常のGCより遅くなってしまったそうです。理由としてはdequeに実装されているpop_bottomなどの処理コストが高く,並列しても補えないコストになってしまったためとのことでした。そこで,dequeの各要素を固定長スタックにしたところ,今度は総GC時間が30%減ったそうです。

速度は上がったものの,まだいくつか問題があるとし,メモリの使用量が増えてしまったことや,SEGV,Windowsで動かないこと,テスト環境がないことを挙げていました。

最後に発表のまとめとして,並列GCはnariさんの手持ちの環境では一応改善したと改めて述べ,今まではRubyKaigiにあわせて一年に一つGCを実装してきたがRubyKaigiは今年で最後なのでGCの実装も今年で終わりかもと話していました。

画像

画像

江森真由美さん「Rubyで作った "critical mission" システムについて」

大江戸Ruby会議01でもお話をしてくださった江森さんの発表です。

江森さんとRuby

2004年に,仕事の都合でRubyを使う必要が出てきました,という出だしから始まりました。当時のRubyのバージョンは1.6.8だったそうです。 Rubyでの開発として,

  • CGIkit
  • Ruby on Rails1 等を使用していたと振り返りました。

mission criticalなシステム

mission criticalなシステムの定義として,

  • 24時間
  • 365日

上記の条件で可動し続ける,ということを挙げました。

また,江森さんのケースでは,デーモンの開発をしたとのことです。 2004年の段階ではプロトタイプとしての開発だったそうですが,Rubyが起因しているものやそれ以外のもの含めて様々な問題に出会ったそうです。

ファイルディスクリプタの上限値の設定数が足らず,1,000プロセス立ち上がらない問題や,UDPのTimeout処理を実装しようとしたところ,Timeoutモジュールではうまく実装できず,組込み関数のselectを使用した,という話を紹介しました。 また,Thread が突然止まってしまう問題を解決するため,ヘルスチェックを行い,応答が無かったら再起動させる仕組みなども作ったそうです。

2009年のリニューアルを行う際には,計算処理が追いつかない部分をC言語で実装することになった点や,3種類だけだったプロセスが230種類に増えてしまったことに対して,Rubyで開発していてだいぶ楽に開発が進められた,という話を紹介しました。 最後に,Rubyで開発していて良かった点として,

  • 直感的なプログラミングができる
  • UDP/TCPといったソケットプログラミングが容易
  • シンプルに記述できるので,その分バグの混入の可能性が少なくなる
  • 異常系や無限Loopのテストも比較的楽に実装できる

と言ったことを挙げました。最後に,⁠大規模システムでもRubyを使えてます」とアピールをして発表を終えました。

画像

画像

ささだこういちさん「並列世界のRuby処理系」

一日目の小ホール最後は,YARVの作者であるささださんの発表です。ささださんは,発表の冒頭でDaveThomasの言葉である「FORK RUBY」を言葉をだし,Rubyがどうあると楽しいかを語りました。

昔は,SmalltalkやC++,Rubyで実装されたRubyができるなんて,誰もが思っていませんでした。また,RubyのJIS化なんて不可能だと思われていました。RubyのVM化や型推論,GCの並列化など想像もできませんでした。当然,昼間の仕事してRubyのプログラミングや,Rubyのコミッターが仕事として成り立つとも思えない状態でした。しかし,ここ10年で状況は変わり,これらのことは実現されていると言います。

10年前では夢のようなことが現実になった今,Rubyに対してこれからどのようなことができるかということを,実際の研究事例を交じえて紹介しました。

まず行なえることとして,スピードの改善をあげました。Ruby本体に対する改善として ,VMがコードを処理する際に,簡単な解析をすることでオブジェクト作成を抑制し,高速化を狙う手法を紹介しました。また,Rubyアプリケーションの速度向上のため,Rubyのコードに型情報を付与することで,半自動的にCのコードに変換して高速化を図るやり方を紹介しました。このやり方は,ささださんの研究室の学生が研究をしており,RDocを対象として実験したところ,2割の高速化に成功しているそうです。 また,マイクロソフトの支援のもと,64ビットWindows用のRails環境NougakuDoを使用し,マイクロソフトのOS上での性能の改善が行なわれていることが報告されました。

スピードの改善のターゲットとして,GCも対象であると言及しました。GCの手法として世代別GCを導入したいが,今作られているC拡張との兼ね合いで導入するのが難しいと述べました。GCの手法変更による改善以外に,GCに対してはデータ構造やVMのエスケープ解析を行なうことで速度改善が見込めるのではないかと提案しました。

使用されるメモリ量の削減として,Rubyの内部リソースをシェアし軽量化することや,電力消費量の削減として,午後一のセッションで述べていたTimerThreadの改善だけでは不十分なため,もっと改善をしたいと意欲を語りました。

また,Rubyプログラムのポータビリティを高めるため,一度Rubyコードコンパイルし,メソッド毎に共有ライブラリ化するという,現在行なっている研究の紹介がありました。

最後にできる改善方法として,並列化について,MVM(MultiVM)という手法を紹介しました。MVMは,一つのプロセス内に,複数のRubyVMを起動させ並列プログラミングの性能改善を狙う手法です。VMごとのデータ通信にはChannelというものを使用することで,VM間でデータを送りあう際にオブジェクトを作成しなくてすむとのことです。実際に,データベースへアクセスするアプリに用いた場合,MVMを使ったRubyだと,旧来のRubyでforkとTCPによる通信を使った方法より性能が改善されたそうです。MVMの将来への構想としては,同一プロセスだけでなく,違う計算機ノードで複数のプロセス間もChannelで通信できることを実現したいと述べていました。

最後に,ささださんは「Rubyは15年かけて良くなってきたけど,まだまだやることがある。私たちは,どうRubyをよくできるかを日々研究している。もっとよりよりRubyを作れると思っている」と述べ,発表を終えました。

画像

画像

著者プロフィール

KaigiFreaks レポート班

KaigiFreaksとは,会場に来れなかった人にも,雰囲気や内容を楽しんでもらえるように動画収録や配信を行うことをミッションに,RubyKaigi2008で結成された特別編成チーム。

RubyKaigi2009からはgihyo.jpを中心にテキストと写真で現場の様子を伝えるレポート班が加わり,現在のKaigiFreaksは配信班とレポート班の2班編成。


三村益隆(みむらみつたか)

(株)永和システムマネジメントサービスプロバイディング事業部所属。Asakusa.rb & Rails勉強会@tokyo。このところRailsのお仕事をしています。言語好き。

blog:http://d.hatena.ne.jp/takkan_m
twitter:http://twitter.com/takkanm


すがわらまさのり

ハンドルネームはsugamasao。

Mitaka.rb や 若手IT勉強会に参加しています。仕事では自社プロダクトのデーモンの開発あたりでRubyを使ったりしています。伊坂幸太郎さんと荒木飛呂彦さんが好きです。

blog:http://d.hatena.ne.jp/seiunsky/
twitter:https://twitter.com/sugamasao


小松崎典之(こまつざきのりゆき)

ハンドルネームはO-Show。

RubyKaigi2010に参加したことで触発されRubyistを自称するようになる。ブログでRubyやGit関連記事の翻訳をあげています。もっとRubyとGitの情報の流通増えろ!と願ってやまない。

blog:http://keijinsonyaban.blogspot.com/
twitter:http://twitter.com/oshow


菅井祐太朗(すがいゆうたろう)

仕事でも Ruby を使えたらいいなぁと考えている新社会人LOCAL 所属。この春からAsakusa.rbにjoin。

twitter:http://twitter.com/hokkai7go


赤松祐希(あかまつゆうき)

2010年よりRuby on RailsでのWebアプリケーションの開発を中心にフリーランスのRubyプログラマとして活動中。最近はHaskellに興味を持ち出し、勉強しはじめている。

blog:http://ukstudio.jp/
twitter:http://twitter.com/ukstudio