2010年05月26日

Apache MPMをめぐる冒険 〜eventとpreforkを比べてみるよ〜

はてなブックマークに登録

Apache 2.3からMPMの切替が実行時(起動時)に設定ファイルから動的に選択できるようになる点について、以前当DSASブログ内の記事で紹介しました。このMPMの切替によってどのようなメリットを得られるのでしょうか。実際にこれを動かしてみたときのCPU使用率とネットワークI/Oの変化を見ながら、それぞれのMPMモジュールの性能・特性を比較してみたいと思います。

まずは実験です。以下のような環境を用意しました。クライアント側については、ab(Apache Bench)によって単一のURLをひたすらダウンロードする単純なものです。しかも静的ファイルなので(中身はダミー)、純粋にApacheの転送能力のみの比較になります。サーバには、CPUはAtom D510、メインメモリ4GBを用意しました。クライアントとサーバの間はGbEで繋がっており、同一セグメント(中間ノード無し)となっております。

対象となるダウンロードファイルは1kB、10kB、100kBの3種類とし、それぞれabにおけるリクエスト数の総数を下表のようにしました。

ファイルリクエスト数(-nオプション)同時接続数(-cオプション)
1k1000000100
10k1000000100
100k100000100

サーバ側ではpreforkとeventを切り替えて設定、こちらもそれぞれ下表のように設定しました。なお、MinSpareThreads/MaxSpareThreadsはMaxClientsと同値としました。プロセス/スレッド数の調整、生成および破棄によって生じる性能差を比較対象から外すためです。

MPMMaxClientsThreadsPerChild
prefork64-
event6416

Atom D510はLinuxカーネル上では4コアとして認識されます(デュアルコア、HyperThreading有)。これに合わせてevent MPMでは、MaxClientsの全体としてはpreforkと同値にしつつ、4コアを使いきるようにプロセス数を4としてスレッドはその中で分散するように設定しました。

さて、以上の環境でもって実験した結果、次のようなデータとなりました。一つずつ見て行きましょう。まずはGangliaで収集したCPU使用率とロードアベレージのグラフです。03:15の前と後でevent-1kとprefork-1k、続いて03:30の地点でevent-10k、03:35にprefork-10k、03:40にevent-100k、03:45の前にprefork-100kとなっています。

shirley_cpu_usage
shirley_load_ave

1kについては、ロードアベレージのグラフをご覧下さい。03:15の前後で差が出来ているのが分かるかと思います。1kという大変小さなファイルへのHTTPリクエストなので、preforkではリクエストが届くと同時にほぼ一気に全てのプロセスが活性化してロードアベレージおよび実行中プロセス数が急上昇しています。実行中プロセス数は、MaxClientsの上限値=64にほぼ張り付いています。一方で、event-1kの方ではあまり大きな上昇になっていません。これはそもそも処理の分散をプロセスではなくスレッドによって賄っているため、同時リクエスト数の上昇がプロセス数の上昇としては現れないようになっていることを表しています。

このように、1kファイルのテストではpreforkとeventそれぞれの特性をよく表していると言って良いのではないでしょうか。64プロセスを事前に立ち上げて用意しておくことにより、バースト時には全てのプロセスが一気に動こうとするprefork MPMと、プロセス数は抑制しつつ、スレッドで捌くことによって過負荷状態を避けるevent MPMと、はっきりと違いが現れています。

これが10kから100kへと移ってくると、次第にネットワーク転送の方が律速となってきて、実行中プロセス数の極端な上がりは無くなります。おそらくサーバの性能やネットワーク環境にもよるのでしょうが、preforkにおける負荷集中時の実行中プロセス数の急騰は、小サイズのファイルによって引き起こされる可能性が高いということになります。

次にabの結果です。それぞれ秒間リクエスト処理数、および全体転送バイト数です。

  • 1k Download
    • prefork: 4913.44 reqs/sec - 6093.82 KB/sec
    • event: 4561.75 reqs/sec - 5657.64 KB/sec
  • 10k Download
    • prefork: 3651.18 reqs/sec - 37396.49 KB/sec
    • event: 3836.81 reqs/sec - 39297.67 KB/sec
  • 100k Download
    • prefork: 848.33 reqs/sec - 85042.92 KB/sec
    • event: 853.21 reqs/sec - 85536.30 KB/sec

ネットワークI/Oとしての性能差はあまりないようです。10kと100kではeventが勝っており、ファイルが大きくなるにつれeventの方が(若干)優勢であるという仮説が立てられそうな気もしますが、決して優位な差とは言えず、より多くのデータをとって検証を行う必要があります。

ただ、1kにおいてpreforkの方が若干勝っているのは、実行中プロセス数がバーストする分少しでも多くのリクエストを捌くことが(結果として)できているということ、eventは若干CPUリソースを使い切れないでいることの傍証になるかと思います。CPU利用率のグラフを見ると、prefork-1kでは100%振り切っているのに対してevent-1kではCPU時間を98%程度までしか使いきっていませんね。

以上のように、MPMそれぞれにおいてどのような性能・特性の変化が出るかを見てみました。しかしこれはWebサービスを行う上で、極限られた一部分のみに基づいた比較になっています。JavaやPHPなど各種動的サイトではどうなのか、GbE直結じゃなくもっと高遅延低帯域のネットワーク越しではどうなのか、見るべき箇所は山ほどあります。次回以降更にさまざまなテストケースを設定しつつ、調査を進めて行こうと思います。

klab_gijutsu2 at 17:08│Comments(0)TrackBack(0)

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント