nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

RESTEasyのクライアントが遅いのを調べる

JBoss / WildFly (全部俺) Advent Calendar 2013の13日目です。

昨日のJBoss EAP 6.2でEJBのnative, IIOP, JAX-WS, JAX-RS呼び出しのパフォーマンスを計測してみるというエントリで速いことを期待していたJAX-RSがなぜか遅かったので調べます。

RESTEasy 2.3.7.Finalのドキュメントのトランスポート層を見ると、やはりデフォルトではApache Http Client 4のSingleClientConnManagerという1つのソケットを使う並列実行できない実装を使う、となっています。

とりあえずClientRequestにURLConnectionClientExecutorを渡してApache Http Client 4ではなく、java.net.HttpURLConnectionを使うように修正してみます。

$ jruby load.rb rs
  3.520000   1.570000   5.090000 (  4.404000)

nativeと遜色ない速さになりました。満足です。みなさんJAX-RS使いましょう。

Apache Http Client 4.2のThreadSafeClientConnManagerとかPoolingClientConnectionManagerも試してみたんですが15秒とか出て大して速くならなかったので見なかったことにします。ApacheのHttpClientは過去にソケットクローズ漏れだとかいろいろやっかいな目に遭っていたりしてあまり好きではありません。

追記: 言及したソケットクローズ漏れはApache Commons HtttpClient 3のReflectionSocketFactory.javaのコードが原因で発生しますが、まだなおっていないようです。もう古いバージョンだし放置でいいかなぁと思っています。Apache Http Client 4では書き直されているのでこの問題は該当しません。

今日は保育園で子供とクリスマス会です。