2016-09-27 38 views
0

jerseyをRESTクライアント(バージョン2.22.1)として使用するカスタム機能を実装しています。特定のHTTP呼び出しに対しては、すべてがうまくいくようですが、ubuntuで実行している場合にのみ、「エラー:サーバーへの書き込み」が発生します。"エラー:サーバに書き込む" - ubuntuでのみ発生する

私の2台のubuntu開発用PCでユニットテストを実行しているときにエラーが発生します。私の開発PCは両方のOracle JDKとUbuntuの16.04です:Windowsマシンから同じテストを実行

~$ java -version 
java version "1.8.0_101" 
Java(TM) SE Runtime Environment (build 1.8.0_101-b13) 
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode) 

$ java -version 
java version "1.8.0_66" 
Java(TM) SE Runtime Environment (build 1.8.0_66-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode) 

、私にエラーを与えません。私のWindowsマシン上:

java -version 
java version "1.8.0_102" 
Java(TM) SE Runtime Environment (build 1.8.0_102-b14) 
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode) 

完全なエラーのスタックトレースは次のとおりです。私は、エラーのために2つの原因を想定することができます

javax.ws.rs.ProcessingException: java.io.IOException: Error writing to server at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:287) at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:255) at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:684) at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:681) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297) at org.glassfish.jersey.internal.Errors.process(Errors.java:228) at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444) at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:681) at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:437) at org.glassfish.jersey.client.JerseyInvocation$Builder.put(JerseyInvocation.java:326)

....

Caused by: java.io.IOException: Error writing to server at sun.net.www.protocol.http.HttpURLConnection.writeRequests(HttpURLConnection.java:666) at sun.net.www.protocol.http.HttpURLConnection.writeRequests(HttpURLConnection.java:678) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1534) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441) at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:480) at org.glassfish.jersey.client.internal.HttpUrlConnector._apply(HttpUrlConnector.java:394) at org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:285)

... 40 more

  1. JVMのバージョン
  2. の違い2つのオペレーティングシステム間の異なるネットワーク設定

このエラーは、大きなHTTP負荷が発生した特定の要求に発生します。さまざまな投稿の多くの同僚が、これが大規模なhttpリクエスト中に発生することを示唆していますが、解決策を提案している投稿やUbuntuに具体的に関連する投稿は見つかりませんでした。

ヒント

このような機能に影響するネットワークパラメータはどれですか?どのように私はそれらを変更/適応することができますか?

具体的なjvm設定が必要ですか?

答えて

0

解決策は、TCPレベルであり、JVMのバージョンまたは構成ではありません。私は私のubuntuのネットワーク設定を変更し、エラーがなくなった。私は、TCPのウィンドウが小さすぎるか何かだったので、大きなHTTPリクエストにのみ発生したと思います。

私は、以下の設定がhttp://www.slashroot.in/linux-network-tcp-performance-tuning-sysctl記事の手順に従っ:

net.ipv4.tcp_window_scaling = 1 
net.core.rmem_max = 16777216 
net.ipv4.tcp_rmem = 4096 137380 16777216 
net.ipv4.tcp_wmem = 4096  137380 16777216 

誤差はおよそ90kbytesの負荷にHTTPリクエストに発生しますのでご注意ください。私は、成功するために、各TCP接続(137380)に割り当てられたウィンドウの値で遊ぶ必要がありました。

これは、私が実際に予見したり説明することができないネットワーク上の副作用を引き起こす可能性があることにも注意してください。大きなウィンドウ値でテストすると、説明できない他のリクエストの遅延が発生しました。したがって、TCPウィンドウのサイズを大きくすることは、すべての解決策ではありません。

関連する問題