Я попробовал следующие настройки на клиенте:
- Установка эфемерных портов: net.ipv4.ip_local_port_range = 32768 60999
- Установка ulimit на 65535
Некоторые эксперименты показали, что:
- Выполнение чуть меньше 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
Мобильная версия