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
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.
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);
}
}
}
Mobile version