2016-09-27 2 views
0

저지를 REST 클라이언트 (버전 2.22.1)로 사용하는 사용자 정의 기능을 구현하는 jar 파일을 사용하고 있습니다. 모든 것이 제대로 작동하는 것처럼 보이지만 특정 HTTP 호출의 경우 "오류 : 서버에 쓰기"가 이지만 우분투에서만 실행되는 경우입니다."오류 : 서버에 쓰기"- 우분투에서만 발생

두 대의 우분투 개발 PC에서 단위 테스트를 실행할 때 오류가 발생합니다. 내 개발 PC는 모두 오라클 JDK와 우분투 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) 

전체 오류의 스택 트레이스는 : 난 단지 오류에 대한 두 가지 원인을 가정 할 수

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. 의 차이 두 운영 체제 간의 서로 다른 네트워킹 설정

이 오류는 큰 HTTP로드가 발생한 특정 요청에서 나타납니다. 많은 게시물의 많은 동료는 이것이 대용량 http 요청 중에 발생한다고 제안했지만 해결책을 제안하거나 우분투와 구체적으로 관련이있는 게시물을 찾지 못했습니다.

힌트가 있습니까?

이러한 기능에 영향을 미치는 네트워킹 매개 변수는 무엇입니까? 어떻게 그들을 바꿀 수 있습니까?

특정 jvm 구성이 필요합니까?

답변

0

해결 방법은 TCP 수준이며 JVM 버전 또는 구성이 아닙니다. 내 우분투 네트워킹 설정을 변경하고 오류가 사라졌습니다. TCP 창문이 너무 작거나 크기가 컸기 때문에 큰 HTTP 요청 만 발생했습니다.

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 요청에 발생한 것을 참고 :

나는 다음 설정을 http://www.slashroot.in/linux-network-tcp-performance-tuning-sysctl 문서의 지침을 따랐다. 성공하기 위해서는 각 TCP 연결 (137380)에 할당 된 창 값으로 놀 필요가있었습니다.

네트워크에서 실제로 예상하거나 설명 할 수없는 다른 부작용이있을 수 있습니다. 큰 창 값으로 테스트하면 설명 할 수없는 다른 요청이 지연됩니다. 따라서 TCP 창 크기를 늘리는 것은 적합한 방법은 아닙니다.