ErlangなWebサーバyawsを速くする方法
Erlangで書かれたyawsがある.
一般的なWebサーバの機能の他,HTMLにErlangで書かれたコードを埋め込んで動的に処理させることが出来るようになっている.(JSPやPHPのように)
このWebサーバは,サーバのコードがほぼすべてErlangで書かれているのだけども,十分な処理速度を持っている.
Erlangベースということで,接続数に対しても十分スケールするので,動的コンテンツの環境としてはなかなか優秀.
しかし,デフォルトでは Erlang VM をそのままの状態で利用するため,最近のSMP・マルチコア環境では性能を十分発揮できない.
以下の2つのことをすれば,それだけでかなり性能を上げることが出来る.
1.SMP・マルチコア環境では,yaws を実行する Erlang 環境に,-smp オプションを渡す(-erlarg '-smp')
2.yaws本体を,HiPEでコンパイルし直す(+nativeオプション付きでコンパイル)
実際にどの程度優秀なのか,上記を試しつつ,簡単にベンチマークを取ってみた.
環境は,SuSE Linux 9.2,Xeon 3.0GHz (Cache 2M) HyperThreading × 2,メモリ4GB.
別のマシンから,Apache1.3付属の ab を使って,並列度を 1, 10, 100 と変えながら測定を行った.
結果の数値はすべて req/sec.従って数が大きいほど優秀.
静的コンテンツ(1406bytesの画像 /favicon.ico)
次は,簡単な内容を表示する arg2.yaws でベンチを取ってみた.
Apache1.3の方は,環境変数をテキストですべて表示するスクリプトをPerlで書いて,FastCGIで実行するようにしてみた.
(処理内容は異なるので,あくまで参考程度ということで)
動的コンテンツ(軽い処理 /arg2.yaws)
次は重たいトップページ.
対策を取ってもかなり遅いです.
おそらく,ファイルを遅い方法でアクセスしているため.
Erlangのファイルアクセスは,標準だとローカルのファイルを直接見に行くのではなく,ファイルを管理するサーバプロセスを経由してアクセスするために,そのオーバーヘッドがかなりかかっているのではないかと思う.
ローカルのファイルであることを前提に,高速に処理するオプションを指定すれば,速くなるはず….(試していない)
動的コンテンツ(重い処理 /)
具体的な対策の方法は以下の通り
1.SMP・マルチコア環境では,yaws を実行する Erlang 環境に,-smp オプションを渡す(-erlarg '-smp')
2.yaws本体を,HiPEでコンパイルし直す(+nativeオプション付きでコンパイル)
yaws の src/Makefile の ERLC_FLAGS の行を以下のように変更
実行時は1の対策も同時に行う必要があります.
2の対策のみ行う場合は,-smp オプションを削ってください.
(nativeコンパイル時の-smp有無と,実行時の-smp有無は一致していないと,nativeコンパイル結果が利用されないため)
一般的なWebサーバの機能の他,HTMLにErlangで書かれたコードを埋め込んで動的に処理させることが出来るようになっている.(JSPやPHPのように)
このWebサーバは,サーバのコードがほぼすべてErlangで書かれているのだけども,十分な処理速度を持っている.
Erlangベースということで,接続数に対しても十分スケールするので,動的コンテンツの環境としてはなかなか優秀.
しかし,デフォルトでは Erlang VM をそのままの状態で利用するため,最近のSMP・マルチコア環境では性能を十分発揮できない.
以下の2つのことをすれば,それだけでかなり性能を上げることが出来る.
1.SMP・マルチコア環境では,yaws を実行する Erlang 環境に,-smp オプションを渡す(-erlarg '-smp')
2.yaws本体を,HiPEでコンパイルし直す(+nativeオプション付きでコンパイル)
実際にどの程度優秀なのか,上記を試しつつ,簡単にベンチマークを取ってみた.
環境は,SuSE Linux 9.2,Xeon 3.0GHz (Cache 2M) HyperThreading × 2,メモリ4GB.
別のマシンから,Apache1.3付属の ab を使って,並列度を 1, 10, 100 と変えながら測定を行った.
結果の数値はすべて req/sec.従って数が大きいほど優秀.
静的コンテンツ(1406bytesの画像 /favicon.ico)
並列 | 標準 | 対策1 | 対策1+2 | Apache1.3 |
---|---|---|---|---|
並列 1 | 1270.65 | 1326.26 | 1278.77 | 961.54 |
並列 10 | 2066.12 | 1924.19 | 3232.06 | 3167.56 |
並列 100 | 2039.36 | 2421.01 | 3161.22 | 3338.53 |
次は,簡単な内容を表示する arg2.yaws でベンチを取ってみた.
Apache1.3の方は,環境変数をテキストですべて表示するスクリプトをPerlで書いて,FastCGIで実行するようにしてみた.
(処理内容は異なるので,あくまで参考程度ということで)
動的コンテンツ(軽い処理 /arg2.yaws)
並列 | 標準 | 対策1 | 対策1+2 | Apache1.3 |
---|---|---|---|---|
並列 1 | 776.40 | 793.02 | 1062.70 | 615.01 |
並列 10 | 918.19 | 2243.16 | 3571.43 | 1846.04 |
並列 100 | 820.65 | 2464.88 | 3347.84 | 1857.36 |
次は重たいトップページ.
対策を取ってもかなり遅いです.
おそらく,ファイルを遅い方法でアクセスしているため.
Erlangのファイルアクセスは,標準だとローカルのファイルを直接見に行くのではなく,ファイルを管理するサーバプロセスを経由してアクセスするために,そのオーバーヘッドがかなりかかっているのではないかと思う.
ローカルのファイルであることを前提に,高速に処理するオプションを指定すれば,速くなるはず….(試していない)
動的コンテンツ(重い処理 /)
並列 | 標準 | 対策1 | 対策1+2 |
---|---|---|---|
並列 1 | 27.01 | 24.57 | 43.75 |
並列 10 | 26.93 | 65.30 | 96.45 |
並列 100 | 25.58 | 58.80 | 90.05 |
具体的な対策の方法は以下の通り
1.SMP・マルチコア環境では,yaws を実行する Erlang 環境に,-smp オプションを渡す(-erlarg '-smp')
yaws --erlarg '-smp' --daemonのように,yaws起動時に -smp オプションを渡します.
2.yaws本体を,HiPEでコンパイルし直す(+nativeオプション付きでコンパイル)
yaws の src/Makefile の ERLC_FLAGS の行を以下のように変更
ERLC_FLAGS+=-W $(DEBUG_FLAGS) -pa ../../yaws -smp +nativeこの修正を行ってから,make すればOKです.
実行時は1の対策も同時に行う必要があります.
2の対策のみ行う場合は,-smp オプションを削ってください.
(nativeコンパイル時の-smp有無と,実行時の-smp有無は一致していないと,nativeコンパイル結果が利用されないため)
The comments to this entry are closed.
Comments