SlideShare una empresa de Scribd logo
1 de 34
Descargar para leer sin conexión
mod_mrubyについて

京都大学 情報学研究科
   松本 亮介
今日の発表
1.   背景
2.   Apacheモジュールと機能拡張
3.   mruby
4.   mod_mruby
5.   パフォーマンス評価
6.   まとめ
1. 背景
Webサービスの高度化

  • ソーシャルネットワーキングサービスの普及
      – 様々なWebサービスが開発
      – Webサーバの利用頻度の急激な増加
      – Webサービスのチューニングが非常に重要


  • Webサーバ上でのインシデントが増加
      – セキュリティ、パフォーマンス、運用技術の問題
      – Webコンテンツの最適化だけでは対応困難
      – Webサーバソフトウェア自体の拡張で対応 [1]


[1] 松本亮介, 川原将司, 松岡輝夫, 汎用性の高い大規模共有型Webバーチャルホスティング基盤のセキュリティと運用技術の改善, インター
ネットと運用技術シンポジウム2011論文集, 2011,31-38 (2011-11-24).
Webサーバソフトウェアの拡張
• 拡張の敷居が高い(Apacheの場合)
 –   C言語で実装(生産性が課題)
 –   コンパイルや保守性の問題
 –   Apacheの内部仕様の深い理解が必要
 –   OSSであるためドキュメントが少ない(ソースが仕様)


            近年のニーズ
            C言語の高速性や軽量さ ⇒ スクリプトによる保守性や生産性


• スクリプトによる機能拡張のインターフェイスを実装
 – C言語やApacheの内部仕様の理解を吸収
 – これまでは軽量かつ高速に動作する実装が無い
本研究
• Apacheの機能拡張支援機構 mod_mruby
 – 組み込みスクリプト言語murbyを採用
   • 軽量、高速、C言語への組み込みが得意、移植性が高い
   • Rubyの記述でApacheの拡張機能を実装可能


 – mod_mrubyの特徴
   1.   拡張スクリプトのリソース消費量を低減
   2.   高速に拡張スクリプトが動作するように設計
   3.   柔軟に機能拡張可能なライブラリを設計
   4.   他のWebサーバソフトウェアでも利用可能(予定)
2. Apacheモジュールと機能拡張
Apacheモジュールとは
• Apacheモジュール
 – Apacheの内部機能を拡張するためのモジュール
 – Apacheのコアに必要な機能をモジュールで組み込む
 – C言語で実装するため高速かつ軽量に動作

                     Apache module 1

                     Apache module 2

   Apache   Apache
                     Apache module 3
    Core     API
                           ・
                           ・
                           ・
                           ・
                                       Apache module n
Apacheモジュールの問題点
• C言語による実装
 – コンパイルが必要 ⇔ 高速・軽量
 – 保守性が低い   ⇔ 高速・軽量
 – C言語の深い知識が必要
• Apache内部仕様の深い理解が必要
 – ドキュメントが少ない
 – ソースを読むのが一番の近道
• モジュール組み込み時にApache再起動が必要
 – 即時性が低い

 スクリプトによる機能拡張が提案されてきた
スクリプトによる機能拡張支援
• スクリプトで機能拡張を実現
   – 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
                                               ・
                                               ・
既存のスクリプトによる機能拡張の問題点

1. 処理が遅い
                インタプリタ方式
2. リソース消費量が多い
3. 機能拡張のためのAPIが不足
 – Webコンテンツが目的


上記の3点を同時に解決する機能拡張支援機構
を設計する必要がある
                 mrubyによる実装

         mod_mruby
3. mruby
mrubyとは
• 組み込みソフトウェア開発において
 – C言語が主流 ⇒ 生産性向上が課題 ← 本研究と問題意識が類似
      • 組み込みスクリプトとしてはLuaが中心
      • Webサービス用途ではRubyで生産性向上が進められている
 – 2010年度 経済産業省の地域イノベーション創出研究開発事業
    • 「軽量Rubyを用いた組込みプラットフォームの研究・開発」が採択

• C言語と連携が強力な組み込みスクリプト言語mruby
 1.   高速に動作
 2.   Rubyの最小限の機能でメモリフットプリントが軽量      注目
 3.   Rubyによる記述で生産性が向上
 4.   C99で規定されたC言語で高い移植性
 5.   内部構成がコンポーネント化
 6.   OSやFilesystemを必要とせず小規模な組み込みシステムで動作
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;
}
mrubyのソフトウェア構成

      mrubyアプリケーション         C アプリケーション


バイナリ入力 mrubyライブラリ C ライブラリ


  プロセス仮想マシン(RiteVM)


                 OS


              ターゲットマシン
4. mod_mruby
mod_mrubyとは
• 既存のスクリプトによる機能拡張支援機構を改善
 1. リソース消費量を低減
  • mod_perl、mod_ruby等はリソース消費量が巨大
  • mrubyの軽量さを生かすためApacheモジュールの機能拡張に特化
 2. 高速に動作
  • mrubyのアーキテクチャを生かしたApache専用の実装
  • mod_lua(既存で最も高速かつ軽量)のアーキテクチャを改善
 3. 柔軟に内部処理拡張するためのAPIを設計
  • mod_luaは軽量であるがAPIが不足
  • Apacheの内部処理として必要な機能を慎重に設計
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
                                                ・
                                                ・
mod_mruby
• Apacheの任意のフックフェーズで任意のスクリプトをフック
  – 柔軟に内部拡張するためのAPIを設計

         クライアント
                                               Apache
         accept request

             hook 1

             hook 2                            mruby script a
Apache
                             mod_mruby   API
 Core          ・
               ・
               ・
               ・

             hook n                            mruby script b

         return response
mod_luaのアーキテクチャを改善
    Luaスクリプトがフック
                         ボトルネック
状態遷移保存領域(Lua_state)の確保


     ライブラリ読み込み

                         mod_lua
    Luaスクリプト読み込み
                         アークテクチャ

      構文木を解析


      バイトコード生成


       VM上で実行
状態遷移保存領域に関するmrubyとLuaの違い
• Apacheはプロセス(スレッド)をプールして再利用する仕様
 – 1プロセス1状態遷移保存領域で使い回すのがベスト


• 状態遷移保存領域を複数のスクリプトで共有する場合
 – Luaの場合
   • 共有している他のスクリプトのfunctionを実行できる
   • Webコンテンツやモジュールスクリプトで関数が干渉
 – mrubyの場合
   • それぞれのバイトコードは状態遷移保存領域に保存
   • C側でバイトコードにアクセスするメソッドやインターフェイス
     を定義しない限りはmruby側から通常干渉する事は無い
mod_mrubyのアーキテクチャ
 mrubyスクリプトがフック

                            1サーバプロセス単位
                            1状態遷移保存領域
              状態遷移保存領域
              (mrb_state)
              とライブラリを共有

                              mod_mruby
 mrubyスクリプト読み込み
                              アーキテクチャ

    構文木を解析


   バイトコード生成


    VM上で実行
mod_mrubyのアーキテクチャ
• Apacheのサーバプロセスとmrubyの関係
 – 子サーバプロセス単位でmrb_stateとVMを保持
 – フックされたファイルをそれぞれバイトコードにコンパイルして保存


親サーバプロセス
                                 バイトコード1
                  状態遷移保存領域A                VM
     子サーバプロセスA                   バイトコード2
                   (mrb_state)              A
                                   ・
                    拡張ライブラリ        ・
                                   ・
                                   ・

                                 バイトコード1
                  状態遷移保存領域B                VM
      子サーバプロセスB    (mrb_state)   バイトコード2    B
           ・                       ・
           ・        拡張ライブラリ        ・
                                   ・
           ・                       ・
           ・
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)
5. パフォーマンス評価
実験
• クライアントから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
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.OK
Apache.return(Apache::OK)                   end
#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                        */
};
実験結果




• 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)とライブラリを共有したため
  – mod_mrubyで共有していない場合は70%程度の性能劣化
    • ただし4月時点
    • その後もmruby自体の改修は活発に進んでいる


 生産性と保守性を重視した場合の選択肢となりうる性能
6. まとめ
まとめ
• mod_mrubyを提案
 – 既存のスクリプトによる機能拡張の問題点を解決
   • 高速、軽量、柔軟な拡張ライブラリ
   • C言語でモジュールを作った場合と比べて12.1%の性能劣化
     – 生産性と保守性を優先した場合の選択肢


 – mod_luaを上回る処理速度を実現
   • 1サーバプロセスで状態遷移保存領域を共有
   • 機能拡張に特化する事で最小限のライブラリを実装
     – mrubyの軽量さを損なわない実装を意識
まとめ
• 今後の課題
  –     リソース使用量による評価
  –     バイトコードのキャッシュ機構を実装
  –     フックフェーズや拡張ライブラリを随時実装
  –     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                                ・
ご清聴ありがとうございました

Más contenido relacionado

La actualidad más candente

SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
Y Watanabe
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
Yoshinori Matsunobu
 
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
Akihiro Kuwano
 
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
土岐 孝平
 
20131208 agile samuraibasecamp
20131208 agile samuraibasecamp20131208 agile samuraibasecamp
20131208 agile samuraibasecamp
Hiroshi SHIBATA
 

La actualidad más candente (20)

SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
Using Chef for Infrastructure Automation of Ameba Pigg
Using Chef for Infrastructure Automation of Ameba PiggUsing Chef for Infrastructure Automation of Ameba Pigg
Using Chef for Infrastructure Automation of Ameba Pigg
 
Linux Server 冗長化~リアルタイム同期でラクラク運用~
Linux Server 冗長化~リアルタイム同期でラクラク運用~Linux Server 冗長化~リアルタイム同期でラクラク運用~
Linux Server 冗長化~リアルタイム同期でラクラク運用~
 
MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話MHA for MySQLとDeNAのオープンソースの話
MHA for MySQLとDeNAのオープンソースの話
 
minneで学ぶクラウド脳
minneで学ぶクラウド脳minneで学ぶクラウド脳
minneで学ぶクラウド脳
 
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
Introduction to JShell: the Java REPL Tool #jjug_ccc #ccc_ab4
 
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
 
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (前編)
 
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
 
nginx入門
nginx入門nginx入門
nginx入門
 
AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境
 
LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版LINEのMySQL運用について 修正版
LINEのMySQL運用について 修正版
 
20131208 agile samuraibasecamp
20131208 agile samuraibasecamp20131208 agile samuraibasecamp
20131208 agile samuraibasecamp
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
パタヘネゼミ 第2回
パタヘネゼミ 第2回パタヘネゼミ 第2回
パタヘネゼミ 第2回
 
JDK9 新機能 (日本語&ショートバージョン) #jjug
JDK9 新機能 (日本語&ショートバージョン) #jjugJDK9 新機能 (日本語&ショートバージョン) #jjug
JDK9 新機能 (日本語&ショートバージョン) #jjug
 
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作るEWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
EWD 3トレーニングコース#31 ewd-xpressでWebおよびRESTサービスを作る
 
Ruby In Wheezy
Ruby In WheezyRuby In Wheezy
Ruby In Wheezy
 
microPCFを使ってみよう
microPCFを使ってみようmicroPCFを使ってみよう
microPCFを使ってみよう
 

Similar a Mod mrubyについて

Backlogでの Perlのつかいかた
Backlogでの PerlのつかいかたBacklogでの Perlのつかいかた
Backlogでの Perlのつかいかた
Ryuzo Yamamoto
 
Enter the-dolphine
Enter the-dolphineEnter the-dolphine
Enter the-dolphine
Mikiya Okuno
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
Masahiro Nagano
 
Continuous delivery 6
Continuous delivery 6Continuous delivery 6
Continuous delivery 6
ShinyaOzawa
 
ポータブルコンポーネントマネージャの実装
ポータブルコンポーネントマネージャの実装ポータブルコンポーネントマネージャの実装
ポータブルコンポーネントマネージャの実装
Yosuke Matsusaka
 
OSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; OverviewOSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; Overview
irix_jp
 

Similar a Mod mrubyについて (20)

Backlogでの Perlのつかいかた
Backlogでの PerlのつかいかたBacklogでの Perlのつかいかた
Backlogでの Perlのつかいかた
 
Windows HPC Server 講習会 第2回 開発編
Windows HPC Server 講習会 第2回 開発編Windows HPC Server 講習会 第2回 開発編
Windows HPC Server 講習会 第2回 開発編
 
Enter the-dolphine
Enter the-dolphineEnter the-dolphine
Enter the-dolphine
 
目指せ1秒切り!ECサイト表示高速化のワザ
目指せ1秒切り!ECサイト表示高速化のワザ目指せ1秒切り!ECサイト表示高速化のワザ
目指せ1秒切り!ECサイト表示高速化のワザ
 
OSvの概要と実装
OSvの概要と実装OSvの概要と実装
OSvの概要と実装
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
Continuous delivery 6
Continuous delivery 6Continuous delivery 6
Continuous delivery 6
 
プロビジョニングの今 ーフルマネージド・サービスを目指してー #cmdevio2016 #E
プロビジョニングの今 ーフルマネージド・サービスを目指してー  #cmdevio2016 #Eプロビジョニングの今 ーフルマネージド・サービスを目指してー  #cmdevio2016 #E
プロビジョニングの今 ーフルマネージド・サービスを目指してー #cmdevio2016 #E
 
Isomorphic web development with scala and scala.js
Isomorphic web development  with scala and scala.jsIsomorphic web development  with scala and scala.js
Isomorphic web development with scala and scala.js
 
第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版
 
Ruby東京プレゼン 資料
Ruby東京プレゼン 資料Ruby東京プレゼン 資料
Ruby東京プレゼン 資料
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッション
 
JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)JellyBeanのソースをとりあえず眺めてみた(手抜き)
JellyBeanのソースをとりあえず眺めてみた(手抜き)
 
ポータブルコンポーネントマネージャの実装
ポータブルコンポーネントマネージャの実装ポータブルコンポーネントマネージャの実装
ポータブルコンポーネントマネージャの実装
 
Spring3.1概要x di
Spring3.1概要x diSpring3.1概要x di
Spring3.1概要x di
 
OSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; OverviewOSC2012 Nagoya - OpenStack - Storage System; Overview
OSC2012 Nagoya - OpenStack - Storage System; Overview
 
VMを改めて学んで見る
VMを改めて学んで見るVMを改めて学んで見る
VMを改めて学んで見る
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
WordPressでの制作説明
WordPressでの制作説明WordPressでの制作説明
WordPressでの制作説明
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
 

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 ・ ・
  • 19. mod_mruby • Apacheの任意のフックフェーズで任意のスクリプトをフック – 柔軟に内部拡張するためのAPIを設計 クライアント Apache accept request hook 1 hook 2 mruby script a Apache mod_mruby API Core ・ ・ ・ ・ hook n mruby script b return response
  • 20. mod_luaのアーキテクチャを改善 Luaスクリプトがフック ボトルネック 状態遷移保存領域(Lua_state)の確保 ライブラリ読み込み mod_lua Luaスクリプト読み込み アークテクチャ 構文木を解析 バイトコード生成 VM上で実行
  • 21. 状態遷移保存領域に関するmrubyとLuaの違い • Apacheはプロセス(スレッド)をプールして再利用する仕様 – 1プロセス1状態遷移保存領域で使い回すのがベスト • 状態遷移保存領域を複数のスクリプトで共有する場合 – Luaの場合 • 共有している他のスクリプトのfunctionを実行できる • Webコンテンツやモジュールスクリプトで関数が干渉 – mrubyの場合 • それぞれのバイトコードは状態遷移保存領域に保存 • C側でバイトコードにアクセスするメソッドやインターフェイス を定義しない限りはmruby側から通常干渉する事は無い
  • 22. mod_mrubyのアーキテクチャ mrubyスクリプトがフック 1サーバプロセス単位 1状態遷移保存領域 状態遷移保存領域 (mrb_state) とライブラリを共有 mod_mruby mrubyスクリプト読み込み アーキテクチャ 構文木を解析 バイトコード生成 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
  • 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.OK Apache.return(Apache::OK) end
  • 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 ・