Posts Tagged ‘passenger’

PassengerHighPerformance

June 1st, 2009 by naoya | No Comments | Filed in day

passenger を使っていて今まで知らなかったのですが、PassengerHighPerformance の設定があります。以下、意訳です。

デフォルトでは Phusion Passenger は mod_rewrite とほとんどの Apache モジュールとの互換性をもっっています。しかしながら、この互換性によって影響も少なくありません。もし PassengerHighPerformace を on にすると Phusion Passenger はすこし早く高速になるかわりに他の Apache モジュールとの互換性がなくなってしまうかもしません。

PassengerHighPerformance をオンにした箇所では、mod_rewrite ルールは正しく動作しないかもしないかもしれません。mod_autoindex も動作しないでしょう。他の Apache モジュールも動作しないかもしれません。テストをしながらこの設定をすることをおすすめします。

PassengerHighPerformance を設定できる箇所はグローバルなサーバ設定、Virtual Host 設定、Directory や Loaction ディレクティブ内、.htaccess です。

デフォルトでは off です。

けっこう影響がありそうなパラメータなので、必要な VirtualHost の中に設定を書くのがよさそうです。

どのくらい効果があるかテスト環境で動作確認して問題なかったので、パフォーマンスを計測した。ベンチマーク方法は、REE benchmark と同じ方法で行った。

まず、PassengerHighPerformane off のとき(念のため、明示的に VirtualHost ディレクティブで off を設定した)

Concurrency Level:      12
Time taken for tests:   14.426 seconds
Complete requests:      20000
Failed requests:        10801
(Connect: 0, Receive: 0, Length: 10801, Exceptions: 0)
Write errors:           0
Total transferred:      10646548 bytes
HTML transferred:       3946548 bytes
Requests per second:    1386.40 [#/sec] (mean)
Time per request:       8.656 [ms] (mean)
Time per request:       0.721 [ms] (mean, across all concurrent requests)
Transfer rate:          720.72 [Kbytes/sec] received

次に PassengerHighPerformance on のとき

Concurrency Level:      12
Time taken for tests:   13.690 seconds
Complete requests:      20000
Failed requests:        19398
(Connect: 0, Receive: 0, Length: 19398, Exceptions: 0)
Write errors:           0
Total transferred:      10646756 bytes
HTML transferred:       3946756 bytes
Requests per second:    1460.90 [#/sec] (mean)
Time per request:       8.214 [ms] (mean)
Time per request:       0.685 [ms] (mean, across all concurrent requests)
Transfer rate:          759.46 [Kbytes/sec] received

それほど多くは変わらないという印象だけれど、気持ち高速になったので設定して本番環境へ入れることにした。

Tags:

Passenger 2.1.2 リリース!

April 17th, 2009 by naoya | No Comments | Filed in day

ついに Passenger 2.1.2 がリリースされた。変更点は、次のとおり。

  • Rails 2.3 をサポート
  • 他の Apache モジュールとの互換性を高めた(RailsAllowModRewrite ディレクティブは mod_rewrite と完全互換になっている)
  • Ruby 1.9 サポート
  • NFS 経由でのインストールをサポート
  • さまざまな I/O ハンドリングと高負荷時のパフォーマンス向上とその修正(mod_xsendfile のサポートがさらに強化)
  • PassengerEnabled オプションにによる Passenger の無効化をサポート(VirtualHost で PHP アプリケーションなどと同居可能になった)
  • アプリケーション互換性を高めた
  • クロスプラッフォームのサポートを強化(OSX や 64 ビット OS)
  • 対話なしのインストーラー (コマンド一発でインストールできるようになった、これはかなりうれしい)
  • passenger-status などのコマンドラインツールを強化
  • すべてのスレッドのバックトレースを表示できるようになった
  • セキュリティの向上
  • カスタマイズオプションが増えた
  • 使い勝手の向上
  • マイナーな不具合の修正
インストールは、gem 経由でインストール可能になっている。
$ sudo gem list -r passenger
*** REMOTE GEMS ***
passenger (2.1.2)
さっそく、手元の MacBook で 2.0.6 とのパフォーマンスを ab 計測してみた。計測対象は、MySQL に接続して select するだけの簡単な merb アプリケーション。
まず、2.0.6 の結果。
Concurrency Level:      10
Time taken for tests:   0.767 seconds
Complete requests:      100
Failed requests:        10
(Connect: 0, Receive: 0, Length: 10, Exceptions: 0)
Write errors:           0
Total transferred:      70510 bytes
HTML transferred:       41310 bytes
Requests per second:    130.45 [#/sec] (mean)
Time per request:       76.660 [ms] (mean)
Time per request:       7.666 [ms] (mean, across all concurrent requests)
Transfer rate:          89.82 [Kbytes/sec] received
次に 2.1.2 の結果。
Concurrency Level:      10
Time taken for tests:   0.894 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      75100 bytes
HTML transferred:       45900 bytes
Requests per second:    111.91 [#/sec] (mean)
Time per request:       89.358 [ms] (mean)
Time per request:       8.936 [ms] (mean, across all concurrent requests)
Transfer rate:          82.07 [Kbytes/sec] received
それほどパフォーマンスは変わらない模様、やはり本番サーバで試してみないとよく分からないが開いている本番サーバがないなぁ。

Tags:

Passenger で Apache のエラーログに余計な情報を出力しない方法

January 29th, 2009 by naoya | No Comments | Filed in day

今日も、個人的に最近ホットな Passenger ネタ。

Passenger で Merb アプリケーションを動かしていると、Apache の ErrorLog に、次の初期化メッセージが表示される。

Loading init file from ./config/init.rb
Loading Rails plugins from plugins/
Loading ./config/environments/production.rb
Logging to file at ./log/production.log

この初期化メッセージは、Rails/Rack アプリケーション(今回は merb)が起動されるたびに表示されて、うざすぎるのでなんとかしたいので調査してみた。

調査したところ、stdout に出力しているメッセージは、そのまま ErrorLog へ出力されてしまうらしい。Passenger 側のソースコードを読んでみたけれど、なんとかできそうもなかったので merb の bootloader.rb を次のように変更した。

— /opt/ruby-enterprise-1.8.6-20090113/lib/ruby/gems/1.8/gems/merb-core-1.0.8.1/lib/merb-core/bootloader.rb-org 2009-01-26 16:58:43.000000000 +0900
+++ /opt/ruby-enterprise-1.8.6-20090113/lib/ruby/gems/1.8/gems/merb-core-1.0.8.1/lib/merb-core/bootloader.rb 2009-01-26 18:18:05.000000000 +0900
@@ -433,7 +433,7 @@
# If log file is given, use it and not log stream we have.
if Merb::Config[:log_file]
raise “log file should be a string, got: #{Merb::Config[:log_file].inspect}” unless Merb::Config[:log_file].is_a?(String)
– STDOUT.puts “Logging to file at #{Merb::Config[:log_file]}” unless Merb.testing?
+ #STDOUT.puts “Logging to file at #{Merb::Config[:log_file]}” unless Merb.testing?
Merb::Config[:log_stream] = File.open(Merb::Config[:log_file], “a”)
# but if it’s not given, fallback to log stream or stdout
else
@@ -487,7 +487,7 @@
# :api: private
def self.load_env_config
if env_config?
– STDOUT.puts “Loading #{env_config}” unless Merb.testing?
+ #STDOUT.puts “Loading #{env_config}” unless Merb.testing?
load(env_config)
end
nil
@@ -516,7 +516,7 @@
# :api: private
def self.load_initfile
if File.exists?(initfile)
– STDOUT.puts “Loading init file from #{initfile}” unless Merb.testing?
+ #STDOUT.puts “Loading init file from #{initfile}” unless Merb.testing?
load(initfile)
elsif !Merb.testing?
Merb.fatal! “You are not in a Merb application, or you are in ” \

それと、merb アプリケーションの init.rb も、次のように変更した。

— merb/config/init.rb-org (revision 1471)
+++ merb/config/init.rb (working copy)
@@ -54,7 +54,7 @@

# make sure we’re running inside Merb
if defined?(Merb::Plugins)
– puts “Loading Rails plugins from plugins/”
+ #puts “Loading Rails plugins from plugins/”
Dir["#{Merb.root}/plugins/*"].each do |dir|
plugin_init = dir / ‘init.rb’
plugin_lib = dir / ‘lib

さらに merb アプリケーションのログも ErrorLog で出力されてしまうので、production.rb を次のように変更した。

info にするとアクセスログが表示されてしまうので、error レベルにした。

— merb/config/environments/production.rb (revision 1471)
+++ merb/config/environments/production.rb (working copy)
@@ -2,6 +2,8 @@
Merb::Config.use { |c|
c[:exception_details] = false
c[:reload_classes] = false
+ c[:log_file ] = “./log/#{ENV['RACK_ENV']}.log”
+ c[:log_level] = :error
}

merb の bootloader.rb の方は、出力されないようなオプションを追加できないか提案してみようかな。うーむ、難しいところだ。。。

あと、merb アプリケーションを再起動するとき、httpd graceful するのではなくて tmp/restart.txt ファイルを作ると再起動する仕組みがあるとは知らなかった。

詳しくは、Developying with Passenger [Merb Wiki] を参照のこと。

Tags: ,

Passenger のリソース最適化オプション

January 28th, 2009 by naoya | No Comments | Filed in day

Passenger を使うとき、リソース最適化オプションによって大きくパフォーマンスが変わる。英文だと理解できるのが遅いので、勝手に翻訳してみる。

- PassengerMaxPoolSize <整数値>

同時に使用できる ROR あるいは Rack アプリケーションの最大数です。より大きな値を指定すると多くのメモリを消費しますが、HTTP クライアントが同時に処理できる能力を増やすことができます。

この最適な値は、あなたのシステムハードウェアやサーバの平均値ロードに依存します。異なる値を指定して実験する必要があるでしょう。しかし一般的にはこの値は少なくてもあなたのシステムの CPU 数に等しい値にするべきです。もしあなたのシステムが 2G のメモリ容量なら 30 を指定することをおすすめします。もしあなたのシステムが VPS 、256MB のメモリ容量で、MySQL のようなサービスが動作しているのなら 2 を指定することおすすめします。

もしあなたのシステムで Rails/Rack ウェブサイトのロードを処理できない(使用できるメモリ容量を上回っている)のならより小さい値を指定するべきです。(もしあなたのサイトが人気があるようなら、ハードウェアを増強したりサーバを増設することを考えるべきです。)

ポイント) Ruby Enterprise Edition を使用することを強くおすすめします。これはあなたの Ruby on Rails アプリケーションのメモリ使用容量を約 33% くらい減らすことができます。 

– PassengerMaxInstancesPerPapp <整数値>

一つのアプリケーションに同時に使用できるアプリケーションインスタンス数の最大数です。これは一つのアプリケーションがアプリケーションプールにあるすべての有効なスロットを占有させない助けとなるでしょう。

この値は PassengerMaxPoolSize 以下でなければなりません。値が 0 のときは一つのアプリケーションインタンス数を置き換えるのを無制限にします。この値は PassengerMaxPoolSize が設定されているときのみ効果があります。

– PassengerPoolIdleTime  <整数値>

アイドル状態のアプリケーションインスタンスが存在している最大秒数です。これはもしアプリケーションインスタンスが指定秒数にトラフィックを受け取らなければ、メモリを維持するために終了します。

この値を減らすとアプリケーションはスワップを多く繰り返すことになります。スワッピングしてからは相対的に操作が遅くなりますし、訪問者たちはあなたの Rails/Rack ウェブサイトを訪れたとき小さな遅延に気を遣うかもしれません。しかしながら、アプリケーションをより高速に使われるためにリソースを解放しましょう。

最適な値は、訪問者が単一の Rails/Rack ウェブページに費す平均値秒数です。我々は 2 * x の値をおすすめします、x は訪問者が単一の Rails/Rack ウェブページに費す平均秒数です。しかしあなたの効果は変わるかもしれません。

このオプションはグローバルサーバ設定の中で一つしか指定できません。デフォルト値は 300 です。

 

ということで、CentOS 5.2 x86_64、Xeon 4 Core、5GB RAM、Apache HTTPD Server 2.2.10 worker MPM、Passenger 2.0.6、Ruby Enterprise Edition 20090113、MySQL 同居の環境で、ab でベンチマークしながら試行錯誤した結果、次のような値で本番投入してみることにした。

PassengerMaxPoolSize         60

PassengerMaxInstancesPerApp  0

PassengerPoolIdleTime        1800

 

passenger に感謝の気持ちを込めて、Enterprise ライセンスを $30 で購入してみた。購入したら、NAOYA NAKAZAWA という名前がページに出ていてちょっと感動です。

August 19, 2008 Naoya Nakazawa USD 30

Enterprise Edition のキーを passenger-make-enterprisey コマンドで入力すると Passenger が Enterprise ライセンスになります。違いはというと、ヘッダが次のようになるだけです。

HTTP/1.1 200 OK
Date: Wed, 28 Jan 2009 15:00:15 GMT
Server: Apache
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 2.0.6, Enterprise Edition
Content-Length: 459
Connection: close
Content-Type: text/html; charset=utf-8

Tags:

passenger 2.0.2 を試す

July 20th, 2008 by naoya | No Comments | Filed in day

Phusion Passenger の 2.0.2 がリリースされたということで、さっそく試してみた。
マシンは DELL SC440、OS は CentOS i386 です。

まず、Passenger をインストールする前に必要な ruby のパッケージをインストールする。

  • $ sudo /usr/bin/yum -y install ruby ruby-rdoc ruby-devel
rubygems がないと困るので、前に作った SPEC ファイル(rubygems.spec)を改良したものとパッチrubygems-prefix.prefixをあてて rubygems 1.1.1 をさくっと作る。 
  • $ /bin/mv rubygems.spec ~/rpm/SPECS
  • $ /bin/mv rubygems-prefix.prefix ~/rpm/SOURCES
  • $ /usr/bin/rpmbuild -ba ~/rpm/SPECS/rubygems.spec
ついでに、ビルドした rubygems の noarch RPM も置いておきます。rubygems-1.1.1-1.noarch.rpm

gem から、rails と passenger をインストールして確認する。

  • $ /usr/bin/sudo gem install passenger
  • $ /usr/bin/gem list –local
gem list して、passenger (2.0.2) があれば OK。Apache2 用のモジュールをビルドする。
  • $ sudo /usr/bin/yum -y install httpd-devel
  • $ sudo /usr/bin/passenger-install-apache2-module
ビルド後に、次のようなメッセージが表示されれば OK。

——————————————–
The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2
PassengerRuby /usr/bin/ruby

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

Press ENTER to continue.

そして、テスト用の rails 2.1.0 のアプリケーションを作る。

  • $ /usr/bin/rails ~/sample
とりあえず、~/sample/script/server で動かして 3000 ポートでの動作確認したら、さっそく Apache の設定をする。httpd.conf に追記してもよいが、/etc/httpd/conf.d/passenger.conf をおいた。Apache は worker で動かすために /etc/sysconfig/httpd を編集して “HTTPD=/usr/sbin/httpd.worker” の行をアンコメントする。Apache の MPM を変更するときには、httpd を止めた状態で行う必要がある。動いているときに変更すると、httpd のプロセスが動いているので sudo killall httpd する必要があるっぽい。
/etc/httpd/conf.d/passenger.conf

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2/ext/apac
he2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.0.2
PassengerRuby /usr/bin/ruby
ServerName sample.example.com
DocumentRoot /home/test/sample/public
RackEnv production

 
設定して、Apache を起動したら、ローカルから動作確認する。確認がとれたら、すこしベンチマークを計測してみる。まず、ローカルから ab コマンドを計測してみる。ちなみに $HOME ディレクトリで実行するには $HOME ディレクトリのパーミッションを 755 に変更しておく必要がある。

  • $ curl localhost
  • $ ab -c 40 -n 10000 http://localhost/
結果は、次の通り。

Concurrency Level: 40
Time taken for tests: 2.458972 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 76581216 bytes
HTML transferred: 73909080 bytes
Requests per second: 4066.74 [#/sec] (mean)
Time per request: 9.836 [ms] (mean)
Time per request: 0.246 [ms] (mean, across all concurrent requests)
Transfer rate: 30413.52 [Kbytes/sec] received

 

 

そして、外部から LVS(NAT) + VRRP 経由でアクセスした結果は次のとおり。リアルサーバは、まったく同じスペック構成のサーバ2台。ab コマンドを実行しているときの、リアルサーバのロードアベレージは 0.00 だった。

 

Concurrency Level: 40
Time taken for tests: 69.353809 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 76534825 bytes
HTML transferred: 73869030 bytes
Requests per second: 144.19 [#/sec] (mean)
Time per request: 277.415 [ms] (mean)
Time per request: 6.935 [ms] (mean, across all concurrent requests)
Transfer rate: 1077.68 [Kbytes/sec] received

 

 

かなり回線の影響があることが分かった。

次に Apache の不要なモジュールをすべてはずして、ローカルから再度実験してみた。

 

Concurrency Level: 40
Time taken for tests: 2.390891 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 76565912 bytes
HTML transferred: 73894310 bytes
Requests per second: 4182.54 [#/sec] (mean)
Time per request: 9.564 [ms] (mean)
Time per request: 0.239 [ms] (mean, across all concurrent requests)
Transfer rate: 31273.28 [Kbytes/sec] received

 

 

そんなに変化はない、次に worker のパラメータを次のように変更して、同じくローカルから試してみた。worker のパラメータを変更するときは、必ず stop してから start する。

 

Concurrency Level: 40
Time taken for tests: 2.333074 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 76520000 bytes
HTML transferred: 73850000 bytes
Requests per second: 4286.19 [#/sec] (mean)
Time per request: 9.332 [ms] (mean)
Time per request: 0.233 [ms] (mean, across all concurrent requests)
Transfer rate: 32028.99 [Kbytes/sec] received

 

 

これはそんなには変わらない。

この状態で LVS 経由で外から試してみた結果は、次のとおり。

 

Concurrency Level: 40
Time taken for tests: 73.91778 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 76528276 bytes
HTML transferred: 73862686 bytes
Requests per second: 136.81 [#/sec] (mean)
Time per request: 292.367 [ms] (mean)
Time per request: 7.309 [ms] (mean, across all concurrent requests)
Transfer rate: 1022.47 [Kbytes/sec] received

 

 

そんなに変化はなかった。

しかし、試験しているときに httpd プロセスが落ちることがなかったので、passenger はかなり使えそう。
 

lighttpd との比較をしてみたかったが、今日のところはここまでにしておく。

 

さぁ、ROR をはじめよう!

Tags: