Ошибка: запись на сервер - происходит только в ubuntu

Я использую файл jar, реализующий настраиваемые функции, который использует jersey в качестве клиента REST (версия 2.22.1). Хотя для нескольких вызовов все работает нормально, для конкретного HTTP-вызова я получаю сообщение «Ошибка: запись на сервер», но только при работе в ubuntu.

Ошибка возникает при запуске модульного теста на двух моих ПК для разработки Ubuntu. Мои ПК для разработки - это Ubuntu 16.04 с Oracle JDK:

~$ 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 не дает мне никаких ошибок. На моей машине с 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: ошибка записи на сервер org.glassfish.jersey.client.internal.HttpUrlConnector.apply (HttpUrlConnector.java:287) в org.glassfish.jersey.client.ClientRuntime. invoke (ClientRuntime.java:255) в org.glassfish.jersey.client.JerseyInvocation $ 1.call (JerseyInvocation.java:684) в org.glassfish.jersey.client.JerseyInvocation $ 1.call (JerseyInvocation.java:681) в org.glassfish.jersey.client.JerseyInvocation $ 1.call (JerseyInvocation.java:681) .glassfish.jersey.internal.Errors.process (Errors.java:315) в org.glassfish.jersey.internal.Errors.process (Errors.java:297) в org.glassfish.jersey.internal.Errors.process (Ошибки .java: 228) на org.glassfish.jersey.process.internal.RequestScope.runInScope (RequestScope.java:444) на org.glassfish.jersey.client.JerseyInvocation.invoke (JerseyInvocation.java:681) на org.glassfish. jersey.client.JerseyInvocation $ Builder.method (JerseyInvocation.java:437) в org.glassfish.jersey.client.JerseyInvocation $ Builder.put (JerseyInvocat ion.java:326)

....

Вызвано: java.io.IOException: ошибка записи на сервер на sun.net.www.protocol.http.HttpURLConnection.writeRequests (HttpURLConnection.java:666) на sun.net.www.protocol.http.HttpURLConnection.writeRequests (HttpURLConnection.writeRequests (HttpURLConnection. .java: 678) на sun.net.www.protocol.http.HttpURLConnection.getInputStream0 (HttpURLConnection.java:1534) на sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection.java:1441) на java .1441) net.HttpURLConnection.getResponseCode (HttpURLConnection.java:480) по адресу org.glassfish.jersey.client.internal.HttpUrlConnector._apply (HttpUrlConnector.java:394) по адресу org.glassfish.jerternalConnector.http: //www.connector.java:394 java: 285)

... еще 40

Я могу предположить только две причины ошибки:

  1. разница версии jvm
  2. разные сетевые настройки в двух операционных системах

Эта ошибка возникает в определенных запросах с очень большой загрузкой http. Многие коллеги в различных сообщениях предположили, что это происходит во время больших HTTP-запросов, однако я не нашел ни одного сообщения, предлагающего решение или относящегося конкретно к Ubuntu.

Есть подсказки?

Какие сетевые параметры влияют на такую ​​функциональность? Как я мог их изменить / адаптировать?

Потребуется ли конкретная конфигурация jvm?


person Pantelis Natsiavas    schedule 27.09.2016    source источник


Ответы (1)


Решение находится на уровне TCP, а не на версии или конфигурации JVM. Я изменил свои сетевые настройки ubuntu, и ошибка исчезла. Я полагаю, это происходило только с большими HTTP-запросами, потому что окна TCP были слишком маленькими или что-то в этом роде.

Я выполнил инструкции в 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

Обратите внимание, что ошибка возникла при HTTP-запросе с загрузкой около 90 Кбайт. Мне нужно было поиграть со значением окна, назначенным каждому TCP-соединению (137380), чтобы добиться успеха.

Также обратите внимание, что это может иметь другие побочные эффекты в вашей сети, которые я не могу предвидеть или объяснить. Тестирование с большими значениями окна вызвало задержки в других запросах, которые я не могу объяснить. Следовательно, увеличение размера окон TCP не подходит для всех.

person Pantelis Natsiavas    schedule 27.09.2016
comment
Ваше решение мне помогло. - person pengchy; 09.04.2018