Friday, September 08, 2006

JMeter のリモート実行で java.rmi.ConnectException: Connection refused to host: 127.0.0.1 が発生する場合

JMeter は Jakarta プロジェクトで開発が進められているパフォーマンス計測用のツール。

クライアントマシンで実行することもできるが、多くのスレッドを起動したり、大量のリクエストを飛ばすので、テスト対象のサーバが限界に達する前にクライアントマシンやネットワークが過負荷になったり、会社などで実行するとネットワークを管理している部署から苦情が来たりする。

こういう場合、JMeter のリモート実行機能を使えばいい。テスト計画を手元の PC 上の JMeter で作成し、それをリモートのおそらく PC よりも処理能力の高いサーバ上にある JMeter で実行する。リモートの JMeter は手元の PC の JMeter で管理する。

このために、JMeter を実行するリモートサーバで次のようにする。


$ export CLASSPATH=$CLASSPATH:$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-1.0.1.jar

$ rmiregistry

$ jmeter -n -s


リモート実行では、RMI を使う。rmiregistry は、ネットワークオブジェクトの位置を登録したり問い合わせたりするサービス。これは、JDK に付属しているツールで、デフォルトで 1099 ポートをオープンする。-n で非 GUI モード、-s でサーバモードで JMeter を起動する。現在、非 GUI モードでも X-Window 関係のライブラリは必要となっている。

クライアント PC では、jmeter.properties ファイルの remote_hosts でリモートサーバを指定してから、JMeter を起動する。

そのようにしてから、JMeter のリモート実行を開始したのだが、うまくいかなかった。PC の jmeter.log を確認してみると、


java.rmi.ConnectException: Connection refused to host: 127.0.0.1


が発生していた。これは、rmiregistry がネットワークオブジェクトのメソッドコール用のアドレスとして自分のローカルアドレス 127.0.0.1 をクライアント PC に通知しているために起こっていると考えられる。リモートサーバの /etc/hosts ファイルを調べてみると、


127.0.0.1 localhost mail


というエントリがあった。mail が DNS にも登録されている名前なのだが、これをこのエントリから削除すると、さっきの例外は発生しなくなった。rmiregistry がネットワークオブジェクトのメソッドコール用として使うポートは 1099 ではなく、ランダムに選んでいるようなので、もし、リモートサーバで Firewall を実行しているなら、クライアント PC からの接続に関してはすべてのポートを許可するようにしておかなくてはならない。

実は、このようにしてもリモート実行はうまくいかなかった。jmeter.log を見ると、リモートサーバがソケットをクローズしてしまうらしい。仕方ないので、リモートサーバにテスト計画(.jmx ファイル)をコピーし、そこで直接 JMeter を実行して、テスト結果のログ(.jtl ファイル)をクライアント PC の JMeter の Listener に指定して表示させた。


$ jmeter -n -t TestPlan.jmx -l Log.jtl


-t オプションでテスト計画のファイルを指定し、-l オプションでログファイルを指定する。このログファイルをクライアント PC の JMeter のリスナーで読み込んで表示する。

ただ、テスト計画ファイルに日本語が含まれていると、ログファイルが文字化けしてしまう。これが原因となってリスナーで読み込むときにエラーになるときもあるので、テスト計画ファイルを作成するとき、テスト計画名などはすべて英語にし、メニューバーのオプションで言語も英語にした方がいい。

No comments: