Mit Java können nicht mehr als 8000 TCP-Verbindungen geöffnet werdenJava

Java-Forum
Anonymous
 Mit Java können nicht mehr als 8000 TCP-Verbindungen geöffnet werden

Post by Anonymous »

Ich versuche, mehr als 10.000 Verbindungen zu einem Server zu öffnen, aber meine App stoppt bei 8.000 Verbindungen, wenn ich mir die Serverprotokolle ansehe. Bei der Verwendung von zwei Remote-Servern wird es Schwierigkeiten geben, Verbindungen zwischen 8K und 9K zu erreichen. Ich gehe davon aus, dass das Problem auf der Clientseite liegt.
Ich habe die folgenden Einstellungen auf dem Client ausprobiert:
  • Einstellen der ephemeren Ports:net.ipv4.ip_local_port_range = 32768 60999
  • Einstellen des ulimit auf 65535
Aber meine Java-Anwendung kann immer noch nicht mehr als 8K ausgehende Verbindungen öffnen.
Einige Experimente haben Folgendes gezeigt:
  • Es ist in Ordnung, etwas weniger als 8K in schneller Folge zu erledigen.
  • Das Ausführen von 8,1K-Anfragen verursacht eine Verzögerung von 30, bevor es nur noch wenig weitergeht Bursts.
  • Während der Tests geht der Maschine nie die CPU oder der Speicher aus. Während der Verzögerung läuft es wieder im Leerlauf von 1–2 %.
  • Es wird kein Fehler oder Ausnahme ausgelöst.
Der Code:

Code: Select all

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);
}
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post