mod_mrubyについて京都大学 情報学研究科   松本 亮介
今日の発表1.   背景2.   Apacheモジュールと機能拡張3.   mruby4.   mod_mruby5.   パフォーマンス評価6.   まとめ
1. 背景
Webサービスの高度化  • ソーシャルネットワーキングサービスの普及      – 様々なWebサービスが開発      – Webサーバの利用頻度の急激な増加      – Webサービスのチューニングが非常に重要  • Webサーバ上での...
Webサーバソフトウェアの拡張• 拡張の敷居が高い(Apacheの場合) –   C言語で実装(生産性が課題) –   コンパイルや保守性の問題 –   Apacheの内部仕様の深い理解が必要 –   OSSであるためドキュメントが少ない(ソー...
本研究• Apacheの機能拡張支援機構 mod_mruby – 組み込みスクリプト言語murbyを採用   • 軽量、高速、C言語への組み込みが得意、移植性が高い   • Rubyの記述でApacheの拡張機能を実装可能 – mod_mrub...
2. Apacheモジュールと機能拡張
Apacheモジュールとは• Apacheモジュール – Apacheの内部機能を拡張するためのモジュール – Apacheのコアに必要な機能をモジュールで組み込む – C言語で実装するため高速かつ軽量に動作                  ...
Apacheモジュールの問題点• C言語による実装 – コンパイルが必要 ⇔ 高速・軽量 – 保守性が低い   ⇔ 高速・軽量 – C言語の深い知識が必要• Apache内部仕様の深い理解が必要 – ドキュメントが少ない – ソースを読むのが一...
スクリプトによる機能拡張支援• スクリプトで機能拡張を実現   – mod_perl、mod_ruby、mod_python、mod_lua…                             Apache module 1       ...
既存のスクリプトによる機能拡張の問題点1. 処理が遅い                インタプリタ方式2. リソース消費量が多い3. 機能拡張のためのAPIが不足 – Webコンテンツが目的上記の3点を同時に解決する機能拡張支援機構を設計する必...
3. mruby
mrubyとは• 組み込みソフトウェア開発において – C言語が主流 ⇒ 生産性向上が課題 ← 本研究と問題意識が類似      • 組み込みスクリプトとしてはLuaが中心      • Webサービス用途ではRubyで生産性向上が進められてい...
mrubyの使用例                                                  require “mrubfromC”                                            ...
mrubyのソフトウェア構成      mrubyアプリケーション         C アプリケーションバイナリ入力 mrubyライブラリ C ライブラリ  プロセス仮想マシン(RiteVM)                 OS       ...
4. mod_mruby
mod_mrubyとは• 既存のスクリプトによる機能拡張支援機構を改善 1. リソース消費量を低減  • mod_perl、mod_ruby等はリソース消費量が巨大  • mrubyの軽量さを生かすためApacheモジュールの機能拡張に特化 2...
mod_mruby• スクリプトで機能拡張を実現    – 高速、軽量、柔軟な内部拡張のためのAPIを提供                              Apache module 1                        ...
mod_mruby• Apacheの任意のフックフェーズで任意のスクリプトをフック  – 柔軟に内部拡張するためのAPIを設計         クライアント                                            ...
mod_luaのアーキテクチャを改善    Luaスクリプトがフック                         ボトルネック状態遷移保存領域(Lua_state)の確保     ライブラリ読み込み                     ...
状態遷移保存領域に関するmrubyとLuaの違い• Apacheはプロセス(スレッド)をプールして再利用する仕様 – 1プロセス1状態遷移保存領域で使い回すのがベスト• 状態遷移保存領域を複数のスクリプトで共有する場合 – Luaの場合   •...
mod_mrubyのアーキテクチャ mrubyスクリプトがフック                            1サーバプロセス単位                            1状態遷移保存領域              状...
mod_mrubyのアーキテクチャ• Apacheのサーバプロセスとmrubyの関係 – 子サーバプロセス単位でmrb_stateとVMを保持 – フックされたファイルをそれぞれバイトコードにコンパイルして保存親サーバプロセス         ...
mod_mrubyのサンプル• 全てのアクセスに対してredirec.htmlを返すサンプル – ApacheでURLとファイル名を紐づけるフェーズでフック• Apacheの設定  LoadModule mruby_module modules...
5. パフォーマンス評価
実験• クライアントからWebサーバにアクセスして処理性能を評価  • 同一処理をApacheモジュール・mod_lua・mod_mrubyで実装して比較    • どのURLにアクセスしても“Hello World”出力する内部機能  • 同...
Apcaheモジュールでの実装と比較• Apacheモジュールmod_helloをC言語で実装した場合• mod_mrubyを介してmrubyスクリプトで実装した場合• mod_luaを介してLuaスクリプトで実装した場合           ...
#include "httpd.h"#include "http_config.h"#include "http_protocol.h"                                                      ...
実験結果• mod_mruby   平均12.1%の性能劣化(mod_helloと比較)• mod_lua     平均50.5%の性能劣化(mod_helloと比較)
考察• mod_helloで処理した場合と比較  – mod_mrubyは平均12.1%の性能劣化  – mod_luaは平均50.5%の性能劣化• mod_mrubyとmod_luaの差  – 状態遷移保存領域(mrb_state)とライブラ...
6. まとめ
まとめ• mod_mrubyを提案 – 既存のスクリプトによる機能拡張の問題点を解決   • 高速、軽量、柔軟な拡張ライブラリ   • C言語でモジュールを作った場合と比べて12.1%の性能劣化     – 生産性と保守性を優先した場合の選択肢...
まとめ• 今後の課題  –     リソース使用量による評価  –     バイトコードのキャッシュ機構を実装  –     フックフェーズや拡張ライブラリを随時実装  –     Nginxにもngx_mrubyを実装         • m...
ご清聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

Mod mrubyについて

4,092 views

Published on

第3回 松本勉強会の資料です。mod_mrubyについて。

Published in: Technology

Mod mrubyについて

  1. 1. mod_mrubyについて京都大学 情報学研究科 松本 亮介
  2. 2. 今日の発表1. 背景2. Apacheモジュールと機能拡張3. mruby4. mod_mruby5. パフォーマンス評価6. まとめ
  3. 3. 1. 背景
  4. 4. Webサービスの高度化 • ソーシャルネットワーキングサービスの普及 – 様々なWebサービスが開発 – Webサーバの利用頻度の急激な増加 – Webサービスのチューニングが非常に重要 • Webサーバ上でのインシデントが増加 – セキュリティ、パフォーマンス、運用技術の問題 – Webコンテンツの最適化だけでは対応困難 – Webサーバソフトウェア自体の拡張で対応 [1][1] 松本亮介, 川原将司, 松岡輝夫, 汎用性の高い大規模共有型Webバーチャルホスティング基盤のセキュリティと運用技術の改善, インターネットと運用技術シンポジウム2011論文集, 2011,31-38 (2011-11-24).
  5. 5. Webサーバソフトウェアの拡張• 拡張の敷居が高い(Apacheの場合) – C言語で実装(生産性が課題) – コンパイルや保守性の問題 – Apacheの内部仕様の深い理解が必要 – OSSであるためドキュメントが少ない(ソースが仕様) 近年のニーズ C言語の高速性や軽量さ ⇒ スクリプトによる保守性や生産性• スクリプトによる機能拡張のインターフェイスを実装 – C言語やApacheの内部仕様の理解を吸収 – これまでは軽量かつ高速に動作する実装が無い
  6. 6. 本研究• Apacheの機能拡張支援機構 mod_mruby – 組み込みスクリプト言語murbyを採用 • 軽量、高速、C言語への組み込みが得意、移植性が高い • Rubyの記述でApacheの拡張機能を実装可能 – mod_mrubyの特徴 1. 拡張スクリプトのリソース消費量を低減 2. 高速に拡張スクリプトが動作するように設計 3. 柔軟に機能拡張可能なライブラリを設計 4. 他のWebサーバソフトウェアでも利用可能(予定)
  7. 7. 2. Apacheモジュールと機能拡張
  8. 8. Apacheモジュールとは• Apacheモジュール – Apacheの内部機能を拡張するためのモジュール – Apacheのコアに必要な機能をモジュールで組み込む – C言語で実装するため高速かつ軽量に動作 Apache module 1 Apache module 2 Apache Apache Apache module 3 Core API ・ ・ ・ ・ Apache module n
  9. 9. Apacheモジュールの問題点• C言語による実装 – コンパイルが必要 ⇔ 高速・軽量 – 保守性が低い ⇔ 高速・軽量 – C言語の深い知識が必要• Apache内部仕様の深い理解が必要 – ドキュメントが少ない – ソースを読むのが一番の近道• モジュール組み込み時にApache再起動が必要 – 即時性が低い スクリプトによる機能拡張が提案されてきた
  10. 10. スクリプトによる機能拡張支援• スクリプトで機能拡張を実現 – mod_perl、mod_ruby、mod_python、mod_lua… Apache module 1 Apache module 2 ・ Apache module n ・ ・Apache Apache Core API script 1 script 2 mod_perl API ・ ・ script n ・ ・
  11. 11. 既存のスクリプトによる機能拡張の問題点1. 処理が遅い インタプリタ方式2. リソース消費量が多い3. 機能拡張のためのAPIが不足 – Webコンテンツが目的上記の3点を同時に解決する機能拡張支援機構を設計する必要がある mrubyによる実装 mod_mruby
  12. 12. 3. mruby
  13. 13. mrubyとは• 組み込みソフトウェア開発において – C言語が主流 ⇒ 生産性向上が課題 ← 本研究と問題意識が類似 • 組み込みスクリプトとしてはLuaが中心 • Webサービス用途ではRubyで生産性向上が進められている – 2010年度 経済産業省の地域イノベーション創出研究開発事業 • 「軽量Rubyを用いた組込みプラットフォームの研究・開発」が採択• C言語と連携が強力な組み込みスクリプト言語mruby 1. 高速に動作 2. Rubyの最小限の機能でメモリフットプリントが軽量 注目 3. Rubyによる記述で生産性が向上 4. C99で規定されたC言語で高い移植性 5. 内部構成がコンポーネント化 6. OSやFilesystemを必要とせず小規模な組み込みシステムで動作
  14. 14. mrubyの使用例 require “mrubfromC” def test a = getfromC(string) C言語 mruby : pushtoC(a) end test()#include “mruby.h” :int main(){ mrb_state *mrb = mrb_open(); // 状態遷移保存領域の初期化 struct mrb_parser_state *p = mrb_parse_file(mrb, mrb_file); // 構文木解析 int n = mrb_generate_code(mrb, p->tree); // バイトコードにコンパイル mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value()); //VM上で実行 mrb_close(mrb); return 0;}
  15. 15. mrubyのソフトウェア構成 mrubyアプリケーション C アプリケーションバイナリ入力 mrubyライブラリ C ライブラリ プロセス仮想マシン(RiteVM) OS ターゲットマシン
  16. 16. 4. mod_mruby
  17. 17. mod_mrubyとは• 既存のスクリプトによる機能拡張支援機構を改善 1. リソース消費量を低減 • mod_perl、mod_ruby等はリソース消費量が巨大 • mrubyの軽量さを生かすためApacheモジュールの機能拡張に特化 2. 高速に動作 • mrubyのアーキテクチャを生かしたApache専用の実装 • mod_lua(既存で最も高速かつ軽量)のアーキテクチャを改善 3. 柔軟に内部処理拡張するためのAPIを設計 • mod_luaは軽量であるがAPIが不足 • Apacheの内部処理として必要な機能を慎重に設計
  18. 18. mod_mruby• スクリプトで機能拡張を実現 – 高速、軽量、柔軟な内部拡張のためのAPIを提供 Apache module 1 Apache module 2 ・ Apache module n ・ ・Apache Apache Core API mruby script 1 mruby script 2 mod_mruby API ・ ・ mruby script n ・ ・
  19. 19. mod_mruby• Apacheの任意のフックフェーズで任意のスクリプトをフック – 柔軟に内部拡張するためのAPIを設計 クライアント Apache accept request hook 1 hook 2 mruby script aApache mod_mruby API Core ・ ・ ・ ・ hook n mruby script b return response
  20. 20. mod_luaのアーキテクチャを改善 Luaスクリプトがフック ボトルネック状態遷移保存領域(Lua_state)の確保 ライブラリ読み込み mod_lua Luaスクリプト読み込み アークテクチャ 構文木を解析 バイトコード生成 VM上で実行
  21. 21. 状態遷移保存領域に関するmrubyとLuaの違い• Apacheはプロセス(スレッド)をプールして再利用する仕様 – 1プロセス1状態遷移保存領域で使い回すのがベスト• 状態遷移保存領域を複数のスクリプトで共有する場合 – Luaの場合 • 共有している他のスクリプトのfunctionを実行できる • Webコンテンツやモジュールスクリプトで関数が干渉 – mrubyの場合 • それぞれのバイトコードは状態遷移保存領域に保存 • C側でバイトコードにアクセスするメソッドやインターフェイス を定義しない限りはmruby側から通常干渉する事は無い
  22. 22. mod_mrubyのアーキテクチャ mrubyスクリプトがフック 1サーバプロセス単位 1状態遷移保存領域 状態遷移保存領域 (mrb_state) とライブラリを共有 mod_mruby mrubyスクリプト読み込み アーキテクチャ 構文木を解析 バイトコード生成 VM上で実行
  23. 23. mod_mrubyのアーキテクチャ• Apacheのサーバプロセスとmrubyの関係 – 子サーバプロセス単位でmrb_stateとVMを保持 – フックされたファイルをそれぞれバイトコードにコンパイルして保存親サーバプロセス バイトコード1 状態遷移保存領域A VM 子サーバプロセスA バイトコード2 (mrb_state) A ・ 拡張ライブラリ ・ ・ ・ バイトコード1 状態遷移保存領域B VM 子サーバプロセスB (mrb_state) バイトコード2 B ・ ・ ・ 拡張ライブラリ ・ ・ ・ ・ ・
  24. 24. mod_mrubyのサンプル• 全てのアクセスに対してredirec.htmlを返すサンプル – ApacheでURLとファイル名を紐づけるフェーズでフック• Apacheの設定 LoadModule mruby_module modules/mod_mruby.so mrubyTranslateNameMiddle /path/to/mapper.mrb• mrubyのコード require “Apache” r = Apache::Request.new() Apache.rputs(“Redirecting your access!!”) r.filename = "/var/www/html/redirect.html“ Apache.return(Apache::OK)
  25. 25. 5. パフォーマンス評価
  26. 26. 実験• クライアントからWebサーバにアクセスして処理性能を評価 • 同一処理をApacheモジュール・mod_lua・mod_mrubyで実装して比較 • どのURLにアクセスしても“Hello World”出力する内部機能 • 同時接続数100総接続数3000(予備実験で決定)で10回評価 • プロセス数やサーバの設定に影響を受けないパラメータを決定 クライアント CPU Intel Core2Duo E8400 3.00GHz Memory 4GB NIC Realtek RTL8111/8168B 1Gbps OS CentOS 5.6 Webサーバ CPU Intel Xeon X5355 2.66GHz Memory 8GB NIC Broadcom BCM5708 1Gbps OS CentOS 5.6 Middle Ware Apache 2.2
  27. 27. Apcaheモジュールでの実装と比較• Apacheモジュールmod_helloをC言語で実装した場合• mod_mrubyを介してmrubyスクリプトで実装した場合• mod_luaを介してLuaスクリプトで実装した場合 Apache module (mod_hello) Apache Apache API mruby script 1 mod_mruby Core API mod_lua API Lua script 1 require "apache2"require “Apache” function uri2file(r)Apache.rputs(“Hello World”) r:puts(“Hello World") return apache2.OKApache.return(Apache::OK) end
  28. 28. #include "httpd.h"#include "http_config.h"#include "http_protocol.h" mod_hello#include "ap_config.h"static int hello_handler(request_rec *r){ if (strcmp(r->handler, "hello")) { return DECLINED; } r->content_type = "text/html"; if (!r->header_only) ap_rputs("The sample page from mod_hello.c¥n", r); return OK;}static void hello_register_hooks(apr_pool_t *p){ ap_hook_handler(hello_handler, NULL, NULL, APR_HOOK_MIDDLE);}module AP_MODULE_DECLARE_DATA hello_module = { STANDARD20_MODULE_STUFF, NULL, /* create per-dir config structures */ NULL, /* merge per-dir config structures */ NULL, /* create per-server config structures */ NULL, /* merge per-server config structures */ NULL, /* table of config file commands */ hello_register_hooks /* register hooks */};
  29. 29. 実験結果• mod_mruby 平均12.1%の性能劣化(mod_helloと比較)• mod_lua 平均50.5%の性能劣化(mod_helloと比較)
  30. 30. 考察• mod_helloで処理した場合と比較 – mod_mrubyは平均12.1%の性能劣化 – mod_luaは平均50.5%の性能劣化• mod_mrubyとmod_luaの差 – 状態遷移保存領域(mrb_state)とライブラリを共有したため – mod_mrubyで共有していない場合は70%程度の性能劣化 • ただし4月時点 • その後もmruby自体の改修は活発に進んでいる 生産性と保守性を重視した場合の選択肢となりうる性能
  31. 31. 6. まとめ
  32. 32. まとめ• mod_mrubyを提案 – 既存のスクリプトによる機能拡張の問題点を解決 • 高速、軽量、柔軟な拡張ライブラリ • C言語でモジュールを作った場合と比べて12.1%の性能劣化 – 生産性と保守性を優先した場合の選択肢 – mod_luaを上回る処理速度を実現 • 1サーバプロセスで状態遷移保存領域を共有 • 機能拡張に特化する事で最小限のライブラリを実装 – mrubyの軽量さを損なわない実装を意識
  33. 33. まとめ• 今後の課題 – リソース使用量による評価 – バイトコードのキャッシュ機構を実装 – フックフェーズや拡張ライブラリを随時実装 – Nginxにもngx_mrubyを実装 • mrubyで複数のWebサーバソフトウェアの機能拡張を吸収 mruby script 1Nginx Nginx ngx_mruby mruby script 2Core API mruby API mruby script 3 for Web mruby script n ・Apache Apache ・ mod_mruby ・ Core API ・
  34. 34. ご清聴ありがとうございました

×