Невозможно открыть более 8000 TCP-соединений с помощью Java.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Невозможно открыть более 8000 TCP-соединений с помощью Java.

Сообщение Anonymous »

Я пытаюсь открыть более 10 000 подключений к серверу, но мое приложение останавливается на 8 000 подключений при просмотре журналов сервера. При использовании двух удаленных серверов возникают проблемы при переходе между соединениями 8K и 9K. Это заставляет меня полагать, что проблема на стороне клиента.
Я попробовал следующие настройки на клиенте:
  • Установка временных портов: net.ipv4.ip_local_port_range = 32768 60999
  • Установка ulimit на 65535
Но мое Java-приложение все равно не может открыть исходящие соединения более 8 КБ.
Некоторые эксперименты показали, что:
  • Выполнение чуть меньше 8 КБ в быстрой последовательности — это нормально.
  • Выполнение запросов 8,1 КБ вызывает задержку в 30, прежде чем продолжить с небольшим всплески.
  • Во время тестов машина ни разу не исчерпала ресурсы процессора или памяти. Во время задержки он снова работает на холостом ходу 1–2%.
  • Никаких ошибок или исключений не возникает.
Код:
import java.io.IOException;
import java.net.URI;
import java.net.URL;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.IntStream;

public class SimpleRunner {
HttpClient client = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.followRedirects(HttpClient.Redirect.NORMAL)
.connectTimeout(Duration.ofDays(1))
.build();

public void main(String... args) throws IOException {
long pid = ProcessHandle.current().pid();
System.out.println("pid = " + pid);

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
benchmarkingMethod(executor);
}
}

private void benchmarkingMethod(ExecutorService executor) {
IntStream.range(0, 10_000).forEach(i ->
executor.submit(() -> {
try {
String response1 = fetchJavaNineStyle(URI.create("http://localhost:8080/v1/delay/0").toURL());
} catch (Exception e) {
throw new RuntimeException(e);
}
})
);
}

String fetchJavaNineStyle(URL url){
try {
return client.sendAsync(HttpRequest.newBuilder().GET().uri(url.toURI()).build(), HttpResponse.BodyHandlers.ofString()).get().body();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... -with-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»