| LVS 性能評価しました |
|
|
|
大規模なサイトだけでなく、中小規模のサイトにおいても、Webや電子メールなど、増大する一途のサービスや要求に耐え、可用性を高めるため、 負荷分散装置(ロードバランサー)を導入するのが一般的になってきています。 しかし、ベンダー各社から専用システムが販売されていますが、どれも高価です。 オープンソースで開発されているL4負荷分散システムとして、Linuxカーネル上に実装されているLVS(Linux Virtual Server)があります。 LVSは専用システムに比べてローコストであり、Linux上で動作するので、 トラブル時のパケット解析などが比較的容易にできるなどの特徴があります。 LVSの性能はどの位なのでしょうか? 残念ながら、LVSの性能を評価したものは、インターネット上には見当たりませんでした。そこで今回は、LVSの基本性能について調べるために実験をしてみました。 そもそもLVSの性能とは何でしょうか? 例えば、Webのサービスであれば、その性能の目安として、 以下のものがあります。
今回はWeb(HTTP)に限定し、WebクライアントからWebサーバーに負荷をかけ、
実験環境ネットワークの各種実験、評価用として購入した
アライドテレシスL2スイッチGS908Mを使ってVLANを切り、 二つのIPネットワークとして構成しました。 二つのIPネットワークを跨ぐ場所に、 IPルーター役またはLVS-NAT役として 構成するPCサーバー(NICは二つ)を接続しました。
![]() 図1: 実験環境概要 実験方法WEBクライアント役のマシンから、WEBサーバに負荷をかけ、 スループット(KB/s)、 単位時間当たりのコネクション数、 mpstatコマンドによるCPU Idle Time等を測定しました。 負荷を与えるプログラムとして、以下の三つを用意しました。
abは最善努力により通信を行ないます。 最大(限界)性能を測定することができます。 Webサーバー、途中のネットワーク、Webクライアントのいずれかが 飽和するまで「ブン回り」ます。 ただし、この方法では任意の負荷を生成することはできません。 「TCPコネクションの開設要求」はLVS-NAT にとって 負荷が大きい処理と思われます。 このときの性能を調べるため、 TCPコネクションを任意の周期で Open/CloseするだけのプログラムAを作成しました。 abでは任意の負荷を生成できません。 そこで任意の周期でHTTP GETを行なうプログラムBを作成しました。 実験1次の三つの条件おいて、 abを使ってファイルサイズを変えながら負荷を与えました。 abはどこかが飽和するまで全力で動作します(最善努力方式)。
ファイルサイズとデータレート(KB/s)の関係について図2に示します。 横軸はファイルサイズ(対数)、縦軸はデータレート(KB/s)です。
![]() 図2: abによる限界性能測定(データレート) この実験から次のことがわかりました。
同じ実験において、コネクション数についても調べてみました。 横軸はファイルサイズ(byte,対数)、 縦軸は一秒あたりのコネクション数を示しています。
![]() 図3: abによる限界性能測定(コネクション数) この実験から次のことがわかりました。
実験2abによる最善努力方式の負荷テスト中において、 LVS-NATまたはIPルーター上のマシンのCPU Idle Time(%)についても 測定してみました。 横軸はデータサイズ(byte, 対数)、縦軸はCPU Idle Time(%)です。
![]() 図4: CPU Idle Time, IP Router vs. LVS-NAT この実験から次のことがわかりました。
IPルーターは、IP層において中継を行ないます。 IPヘッダーのチェックサムの検算、TTLの減算、 それに伴うチェックサムの再計算などを処理が発生しています。 LVS-NATでは上記に加えて、 TCPヘッダーのチェックサムの検算、 ポート番号の変更とそれに伴うチェックサムの再計算などの処理があります。 この処理の多さが上記結果に現れているのだと思われます。 実験3TCPのOpen/Closeだけを行なうプログラムAを使って、 コネクション数/秒を変化させた場合において、 LVS-NAT役のCPU Idle Timeを測定してみました。 さらに、最善努力を行なうabではなく、 任意の周期でHTTPでGETするプログラムBを使って ファイルサイズを変えながら、 LVS-NAT役のCPU Idle Timeを測定してみました。 これらの二つのプログラムでは、 サーバー、クライアント、ネットワーク、LVS-NATが飽和しない 範囲内であれば、任意の負荷を安定して生成することができます。 上記の二つの結果を同じグラフ上に描きました(図5)。 横軸はファイルサイズ、縦軸は1秒当たりのコネクション数です。
![]() 図5: コネクション数を変化させたときのLVS-NAT役ホストのCPU Idle Time(%)
この実験から次のことがわかりました。
まとめHP ML115(AMD Athlon 3500+ 2.2GHz)を ベースとして環境を構築し実験しました。 今回の実験から次のことがわかりました。
評価用に作成したプログラムhttp://x68000.q-e-d.net/~68user/net/ ネットワークプログラミングの基礎知識 を大いに参考にさせていただきました。 この場を借りてお礼申し上げます。_o_ プログラムA: tcp-client3-timer周期的にTCPのコネクションをOpen/Closeするだけのプログラムです。 一つのプロセスで生成する負荷が足りなければ、複数のプロセスを起動することもできます。 コンパイル方法( -lrtが必要 ):$ gcc tcp-client3-timer.c -lrt -o tcp-client3-timer使用方法: 起動時の引数として Webサーバーのホスト名、ポート番号、1周期内の実行回数、その周期(単位はナノ秒)を 必ず指定してください。 周期とその周期内の実行回数は努力目標値です。 1プロセスで足りなければ、複数プロセスを起動することができます。 サーバー側、途中経路、クライアント側の処理能力が足りなければ、 目標値に達しないこともあります。 $ ./tcp-client3-timer usage: ./tcp-client3-timer hostname port times nanosec起動後、 CTRL-Cを入力すると、そのときの平均コネクション数/秒を表示します。 CTRL-Cの都度、カウンターはリセットされます。
$ ./tcp-client3-timer localhost 80 1 10000
1235376513 951280
CTRL-C
129.1
CTRL-C
43.1
CTRL-C
128.3
プログラムを終了したい場合には、CTRL-Zで一時停止させた後で
kill %(ジョブ番号)を行なってください。
プログラムB: tcp-client5-timer周期的にHTTP GETを行なうプログラムです。 一つのプロセスで生成する負荷が足りなければ、複数のプロセスを起動することもできます。 コンパイル方法( -lrtが必要 ):$ gcc tcp-client5-timer.c -lrt -o tcp-client5-timer使用方法: 起動時の引数として Webサーバーのホスト名、ポート番号、1周期内の実行回数、その周期(単位はナノ秒)、URIを 必ず指定してください。 周期とその周期内の実行回数は努力目標値です。 1プロセスで足りなければ、複数プロセスを起動することができます。 サーバー側、途中経路、クライアント側の処理能力が足りなければ、 目標値に達しないこともあります。 $ ./tcp-client5-timer usage: ./tcp-client5-timer hostname port times nanosec URICTRL-Cを入力すると、そのときの平均コネクション数/秒を表示します。 CTRL-Cの都度、カウンターはリセットされます。
$ ./tcp-client5-timer localhost 80 1 1000000 index.cgi
1235376914 35682
CTRL-C
64.0
41.4 KB/sec
CTRL-C
46.7
33.5 KB/sec
CTRL-C
50.8
35.8 KB/sec
プログラムを終了したい場合には、CTRL-Zで一時停止させた後で
kill %(ジョブ番号)を行なってください。
|
|||
| 最終更新 2009年 3月 03日(火曜日) 00:36 |






