スポンサーサイト

  • 2013.05.03 Friday

一定期間更新がないため広告を表示しています

  • 0
    • -
    • -
    • -

    Apache2.4新機能 〜MPMのevent〜 その2

    • 2013.03.30 Saturday
    • 15:07
    mod_event君の説明の続きです。

    mod_eventとは
    mod_eventは前回説明したkeepaliveにある無駄な時間をなくせることができるモジュールです。
    すなわち、タイムアウトの待ち時間の間に別のユーザーからのリクエストを処理できます。
    これにより、KeepAliveの最中のApacheの処理の中の無駄な待ち時間が無くなり、効率よく処理ができるわけです。
    mod_eventは、worker版と同じ、マルチプロセスマルチスレッドモデルです。

    mod_eventの制約
    ただし、mod_eventのこのkeepaliveの恩恵を受けられるのはHTTP通信の時だけです。
    SSL通信を行う場合は、worker坂と同じになります。すなわちHTTPSとしてApacheをサービス提供するときは、mod_eventを使ってもkeepaliveの待ち時間は他の人からのリクエストを処理できません。

    まとめ
    mod_eventはkeepAliveを使う際に有効なマルチプロセスマルチスレッド(worker版)Apache。KeepAliveを使わないのであれば別にmod_eventである必要無し。mod_eventを使うからにはKeepAliveを有効にしましょう。
    ただし、SSL環境では意味無し。「SSLEnable on」の環境ではmod_eventを使ってもworker坂とまったく一緒となるので注意しましょう。


    mod_eventの仕組み(自分用メモ)
    どのようにKeepAliveの待ち時間を処理できるようにしたか。
    ソースコードを見て、mod_eventだと何が変わってkeepAliveの待ち時間に処理できるようになったか見てみる。

    http_core.c
        225 static int ap_process_http_connection(conn_rec *c)
        226 {
        227     if (async_mpm && !c->clogging_input_filters) {
        228         return ap_process_http_async_connection(c);
        229     }
        230     else {
        231         return ap_process_http_sync_connection(c);
        232     }
        233 }

    各mpmでaccept(2)で接続を抜けて、コネクション確立後に来る処理のところ。       
    Apache2.2の頃の、一つのコネクションでKeepAliveの間はap_read_request()でぐるぐる回る処理となるのがap_process_http_sync_connection(c)の方。       
    一方、KeepAlive中でもぐるぐる回らず、MPMに処理を返し、workerスレッドを解放するのがap_process_http_async_connection(c)       
     →mod_event用に用意されたのがap_process_http_sync_connection()
       async_mpmは、mod_eventが読み込まれていると1がセットされる。
      c->clogging_input_filtersはmod_sslを使っているとSSLネゴシエーションの間で
      1がセットされるためmod_eventを使っていてもap_process_http_sync_connection(c)に
      なるので、従来どおりkeepalive中は待ちのコード(従来の処理)となる。


    ちょっとはまったこと(自分用メモ)
    プロセス数、スレッド数の定義をLoadModuleより前に書くと効かない・・・。
    今までのhttpd.confを移行ということでApache2.2のhttpd.confのようにLoadModuleより前にプロセス数系のディレクティブを書いたら見事に設定値が摘要されなくて
    最初「なぜじゃ?」とハテナマークが頭をよぎった。

    これはダメ
    <IfModule mpm_prefork_module>
        StartServers             1
        MinSpareServers          3
        MaxSpareServers          4
        MaxRequestWorkers        1
        MaxConnectionsPerChild   0
    </IfModule>
    LoadModule mpm_prefork_module modules/mod_mpm_prefork.so


    これならOK
    LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
    <IfModule mpm_prefork_module>
        StartServers             1
        MinSpareServers          3
        MaxSpareServers          4
        MaxRequestWorkers        1
        MaxConnectionsPerChild   0
    </IfModule>


    これは気をつけなければー




    スポンサーサイト

    • 2013.05.03 Friday
    • 15:07
    • 0
      • -
      • -
      • -
      コメント
      最新のmod_eventではhttpsも使えるようです。
      • leokim
      • 2018/12/10 1:21 PM
      コメントする








          

      PR

      calendar

      S M T W T F S
          123
      45678910
      11121314151617
      18192021222324
      25262728293031
      << August 2019 >>

      selected entries

      categories

      archives

      recent comment

      recommend

      links

      profile

      search this site.

      others

      mobile

      qrcode

      powered

      無料ブログ作成サービス JUGEM