RubyKaigi2011 スペシャルレポート

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

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

Andy Delcambreさん「Toggleable Mocks and Testing Strategies in a Service Oriented Architecture」

冒頭で日本語のわかる人は手を上げてください,という質問から入ったEngine Yard社のAndy Delcambreさんの発表です。

まず,Engine Yard社でもサービスの提供を行なっているSOAの説明から話が始まりました。

  • 単一責任の原則(UNIXの哲学)
  • それぞれの部品を別々にデプロイできる
  • 複数のチームが異なるサービスロ開発できる

Engine Yard での提供している形態では,複数のSOAサーバとその中心に置かれているユーザ情報を提供するSSOで構成されていることを言及しました。これにより,他のサービスがユーザの概念について知らなくても開発に専念できるという利点を挙げました。しかし問題点として,周囲のSOAのテストが大変である,と告げました。

まずはmockを使わない例の話を取り上げました。開発サーバに対してテストを実行する際に,開発用のSSOサーバへアクセスすることで比較的簡単にテストが可能ですが,これは致命的な問題点があり,遅いということと,テストが始まってしまうとオブジェクトの状態を戻せないという欠点を挙げました。

そこから,モックやスタブを使った場合にどのような利点があるか,という話が紹介され,スタブのライブラリの話へ移りました。 FakeWebというライブラリは「まぁまぁ悪くない」と表現するAndyさん。しかし,まだ十分ではありませんと続けました。 そしてartificeというライブラリを紹介しました。このライブラリはRackアプリケーションをnet/httpのスタブとして使うことで,HTTPレイヤーのテストを実行しているそうです。

artificeは環境設定の切り替えで,テスト環境のレイヤーの切り替えができるため,インメモリでスピードを重視したテストとインテグレーションテストの切り替えをソースコードレベルで変更せずに実行できると述べました。

質疑応答

質疑応答では,⁠正常系以外の,エラー系のテストはどのようにしているのか」という質問が出され,Andyさんは「だいたいのテストはフェイクにエラー状態を用意することでテストに使いますが,できないところはユニットテストでカバーしています」と答えていました。

画像

画像

池原潔さん「組込みシステムのための動的コンポーネント機構とVMの最適化」

日立製作所の池原潔さんは,組込みシステム向けに,主に省メモリを目指してRuby本体に手を加えてみたという話を発表しました。なぜそれをしようとしたかの背景の話から,アプローチ方法,そして結果と順を追って説明しました。

なぜ組み込みでRubyなのか

まず背景となる事実として,近年は多くの組込みシステムがインターネットに接続するようになってきたことを挙げました。このような流れに対して,組込みシステムのほとんどでCコードが使われているが,文字列処理を書くのも苦労するCで,変化の激しいWebの世界に追いつくには生産性が十分ではないのでは,という実情を述べました。そこで,組込みでもRubyを使ってWebベースで作れたらいいのでは?という発案が今回の試みへ至る発端のようです。

ただし,Rubyを組込みに使うと言っても,組込み向けVMにはそれなりの要件があるとのこと。

  • 1.メモリ効率が良いこと。多くの機能が搭載されるようになってきている組込みにおいて,メモリは貴重なリソース。
  • 2.メモリ管理が正確でなければならない。
  • 3.実行速度が十分速くなければならない。組込みのプロセッサは貧弱で,処理のオーバーヘッドも大きい。

この3つの内,最も組込みシステム特有な問題である「1.メモリ効率」にフォーカスすることにした,ということでした。そして,メモリの消費量を抑えるためにアプリ側とVM側という2通りのアプローチを取ることに決めたそうです。

アプリ側からのアプローチ

Rubyによるメモリ消費傾向の調査・検討のサンプルには,比較的シンプルで分かりやすいという理由でSinatraを選択(RubyはCRuby1.9.2⁠⁠。Sinatraを(Sinatraに限らず,ですが)を複数起動すれば,各VM毎にソフトウェアスタックが構築され,結果としてメモリ消費量は起動した分だけ嵩んでいきます。しかし,複数起動されたプロセス同士には似たデータがロード・インスタンス化されている部分があることが推測されると指摘します。

この無駄を解消する方法として:

  • 1.Dynamic Component。複数のアプリケーションを単一のVMで実行する方法(最も効率的)
  • 2.Multi-taskingVM。アプリケーションを個別のVMインスタンスで実行する方法(コードと資源の共有)
  • 3.Inter-process Sharing。共通するコードをVMプロセス間で共有する(最も基本的)

の3つがあり,今回は1番の動的コンポーネントを選ぶことにしたそうです。理由として,効率を求めたかったことと,2番や3番は静的なJavaなどと比べてどういったものが共有できるかわからずコード化が難しい,といった点を挙げていました。

そもそもコンポーネントとは,他者の機能を使ったり,他者に機能を提供したりするソフトウェアモジュールのこと。動的コンポーネントでは,文字通り実行時にコンポーネントを動的にリンク・アンリンクします。具体的には,コンポーネントフレームワークという物が各コンポーネント間のインターフェースを認識し,ソフトウェアスタック構築時に既にあるコンポーネントから選択してリンクしてくれる,といった仕組みのようです。Sinatraで言えば,自分のアプリ・Sinatra・Rackという組み合わせが複数回構築されても,コンポーネントの重複を生むことなくメモリを無駄にせず接続されるわけです。この動的コンポーネントの実装の結果,サーバを2つ起動させた場合でCRuby1.9.2と比べ4.8MiBのデータが削減が確認されたそうです(サーバ1つを単に起動させた場合,メモリ使用量は9.2MiB⁠⁠。

VM側からのアプローチ

もう一つ,VM側からのアプローチとして,VMに使われているデータ構造の最適化を試したとのことです。まずValgrindでCRuby1.9.2と1.8.7を比較してみたところ,1.8.7に比べて1.9.2はかなりメモリを消費しているように見えたそうです。これは1.9.2の方には速度を稼ぐためにメモリを消費させている部分があるからで,そこを削っていけば(速度低下を招くものの)メモリ消費が減っていくことが確認できたそうです。

具体的にはDirect Threaded Code用の命令列の生成を抑制したり,命令列を短くすること,命令に付随する余計な情報を削除することなどを試したとのことです。発表では特に命令列を短くする方法を取り上げ,使われる命令の中で比率の高い"send"と"trace"命令を特殊化したショートバージョンを作った,という手法を紹介していました。VM側アプローチ全体として,先述の状況で約2MiBの改善を見たとのことでした。

最後に,今後の課題としてオープンクラスと動的コンポーネントの相性問題や,保護ドメインのためのアクセス制御が難しいと言った点に触れ,発表を終えました。

VM作者,ささださんとの対話

質疑応答では,Ruby1.9のVMであるYARVを開発した笹田耕一さんとのやりとりがありました。⁠速度のために命令列を4バイトにしているのはその通りで,命令列を小さくすることも研究しているのだが,実際に小さくすることでキャッシュ効率は上がったか?」という笹田さんの質問には,マイクロベンチマークレベルでは効果があったという回答をしていました。また,動的コンポーネントのところで出てきた他の選択肢であるInter process sharingは笹田さんも「実際にやろうとしている」など,RubyVM作者からのレスポンスが見られた発表となりました。

画像

画像

著者プロフィール

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