Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.
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...
ご清聴ありがとうございました
Nächste SlideShare
Wird geladen in …5
×

Mod mrubyについて

11.991 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Technologie
  • Loggen Sie sich ein, um Kommentare anzuzeigen.

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. ご清聴ありがとうございました

×