Más contenido relacionado
La actualidad más candente (20)
Similar a Mod mrubyについて (20)
Mod mrubyについて
- 2. 今日の発表
1. 背景
2. Apacheモジュールと機能拡張
3. mruby
4. mod_mruby
5. パフォーマンス評価
6. まとめ
- 4. Webサービスの高度化
• ソーシャルネットワーキングサービスの普及
– 様々なWebサービスが開発
– Webサーバの利用頻度の急激な増加
– Webサービスのチューニングが非常に重要
• Webサーバ上でのインシデントが増加
– セキュリティ、パフォーマンス、運用技術の問題
– Webコンテンツの最適化だけでは対応困難
– Webサーバソフトウェア自体の拡張で対応 [1]
[1] 松本亮介, 川原将司, 松岡輝夫, 汎用性の高い大規模共有型Webバーチャルホスティング基盤のセキュリティと運用技術の改善, インター
ネットと運用技術シンポジウム2011論文集, 2011,31-38 (2011-11-24).
- 5. Webサーバソフトウェアの拡張
• 拡張の敷居が高い(Apacheの場合)
– C言語で実装(生産性が課題)
– コンパイルや保守性の問題
– Apacheの内部仕様の深い理解が必要
– OSSであるためドキュメントが少ない(ソースが仕様)
近年のニーズ
C言語の高速性や軽量さ ⇒ スクリプトによる保守性や生産性
• スクリプトによる機能拡張のインターフェイスを実装
– C言語やApacheの内部仕様の理解を吸収
– これまでは軽量かつ高速に動作する実装が無い
- 6. 本研究
• Apacheの機能拡張支援機構 mod_mruby
– 組み込みスクリプト言語murbyを採用
• 軽量、高速、C言語への組み込みが得意、移植性が高い
• Rubyの記述でApacheの拡張機能を実装可能
– mod_mrubyの特徴
1. 拡張スクリプトのリソース消費量を低減
2. 高速に拡張スクリプトが動作するように設計
3. 柔軟に機能拡張可能なライブラリを設計
4. 他のWebサーバソフトウェアでも利用可能(予定)
- 8. Apacheモジュールとは
• Apacheモジュール
– Apacheの内部機能を拡張するためのモジュール
– Apacheのコアに必要な機能をモジュールで組み込む
– C言語で実装するため高速かつ軽量に動作
Apache module 1
Apache module 2
Apache Apache
Apache module 3
Core API
・
・
・
・
Apache module n
- 9. Apacheモジュールの問題点
• C言語による実装
– コンパイルが必要 ⇔ 高速・軽量
– 保守性が低い ⇔ 高速・軽量
– C言語の深い知識が必要
• Apache内部仕様の深い理解が必要
– ドキュメントが少ない
– ソースを読むのが一番の近道
• モジュール組み込み時にApache再起動が必要
– 即時性が低い
スクリプトによる機能拡張が提案されてきた
- 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. 既存のスクリプトによる機能拡張の問題点
1. 処理が遅い
インタプリタ方式
2. リソース消費量が多い
3. 機能拡張のためのAPIが不足
– Webコンテンツが目的
上記の3点を同時に解決する機能拡張支援機構
を設計する必要がある
mrubyによる実装
mod_mruby
- 13. mrubyとは
• 組み込みソフトウェア開発において
– C言語が主流 ⇒ 生産性向上が課題 ← 本研究と問題意識が類似
• 組み込みスクリプトとしてはLuaが中心
• Webサービス用途ではRubyで生産性向上が進められている
– 2010年度 経済産業省の地域イノベーション創出研究開発事業
• 「軽量Rubyを用いた組込みプラットフォームの研究・開発」が採択
• C言語と連携が強力な組み込みスクリプト言語mruby
1. 高速に動作
2. Rubyの最小限の機能でメモリフットプリントが軽量 注目
3. Rubyによる記述で生産性が向上
4. C99で規定されたC言語で高い移植性
5. 内部構成がコンポーネント化
6. OSやFilesystemを必要とせず小規模な組み込みシステムで動作
- 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. mrubyのソフトウェア構成
mrubyアプリケーション C アプリケーション
バイナリ入力 mrubyライブラリ C ライブラリ
プロセス仮想マシン(RiteVM)
OS
ターゲットマシン
- 17. mod_mrubyとは
• 既存のスクリプトによる機能拡張支援機構を改善
1. リソース消費量を低減
• mod_perl、mod_ruby等はリソース消費量が巨大
• mrubyの軽量さを生かすためApacheモジュールの機能拡張に特化
2. 高速に動作
• mrubyのアーキテクチャを生かしたApache専用の実装
• mod_lua(既存で最も高速かつ軽量)のアーキテクチャを改善
3. 柔軟に内部処理拡張するためのAPIを設計
• mod_luaは軽量であるがAPIが不足
• Apacheの内部処理として必要な機能を慎重に設計
- 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
・
・
- 20. mod_luaのアーキテクチャを改善
Luaスクリプトがフック
ボトルネック
状態遷移保存領域(Lua_state)の確保
ライブラリ読み込み
mod_lua
Luaスクリプト読み込み
アークテクチャ
構文木を解析
バイトコード生成
VM上で実行
- 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. 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)
- 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
- 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. 実験結果
• mod_mruby 平均12.1%の性能劣化(mod_helloと比較)
• mod_lua 平均50.5%の性能劣化(mod_helloと比較)
- 30. 考察
• mod_helloで処理した場合と比較
– mod_mrubyは平均12.1%の性能劣化
– mod_luaは平均50.5%の性能劣化
• mod_mrubyとmod_luaの差
– 状態遷移保存領域(mrb_state)とライブラリを共有したため
– mod_mrubyで共有していない場合は70%程度の性能劣化
• ただし4月時点
• その後もmruby自体の改修は活発に進んでいる
生産性と保守性を重視した場合の選択肢となりうる性能
- 32. まとめ
• mod_mrubyを提案
– 既存のスクリプトによる機能拡張の問題点を解決
• 高速、軽量、柔軟な拡張ライブラリ
• C言語でモジュールを作った場合と比べて12.1%の性能劣化
– 生産性と保守性を優先した場合の選択肢
– mod_luaを上回る処理速度を実現
• 1サーバプロセスで状態遷移保存領域を共有
• 機能拡張に特化する事で最小限のライブラリを実装
– mrubyの軽量さを損なわない実装を意識
- 33. まとめ
• 今後の課題
– リソース使用量による評価
– バイトコードのキャッシュ機構を実装
– フックフェーズや拡張ライブラリを随時実装
– Nginxにもngx_mrubyを実装
• mrubyで複数のWebサーバソフトウェアの機能拡張を吸収
mruby script 1
Nginx Nginx
ngx_mruby mruby script 2
Core API
mruby
API mruby script 3
for Web mruby script n
・
Apache Apache ・
mod_mruby ・
Core API ・