У меня есть приложение, в котором я хотел бы отправлять не менее 100 тыс. HTTP-запросов в секунду с размером сообщения около 2 КБ «отдавать или брать».Но, похоже, я не могу посылать быстрее, чем 10 тыс. В секунду.
Я предварительно собрал все запросы, чтобы убедиться, что я не ограничиваю себя на этапе построения.Вот как выглядит отправляющая часть:
CloseableHttpAsyncClient client = HttpAsyncClients
.custom()
.setMaxConnTotal(1000)
.setMaxConnPerRoute(1000)
.build();
client.start();
ArrayList<Future<HttpResponse>> futures = new ArrayList<>();
ArrayList<HttpPost> requests = new ArrayList<>();
/* ... I build 100k requests ... */
for(HttpPost request : requests) {
futures.add(client.execute(request, null));
}
/* ... record start time ... */
for(Future future : futures) {
future.get();
}
/* ... print change since start time ... */
Я настроил MaxConnTotal, и после 1000 он не работает быстрее. Я также протестировал серверы разных размеров с ядрами в диапазоне от 4до 72, а скорость сети варьируется от 5 до 10 Гбит / с.Даже на этих 72-ядерных 10-гигабитных машинах, превышающих 1000, MaxConnTotal, похоже, не помогает.
Неважно, какого размера кажется машина.Большой или маленький, для отправки 100 000 запросов всегда требуется около 10 с.
Я также пытался установить значение ulimit выше и установить nofiles
в /etc/security/limits.conf
как неограниченное для * и root (и, конечно, перезагрузить компьютер).потом).
Чего мне не хватает?Почему я не могу выполнить 100 000 запросов в секунду на всем этом оборудовании с помощью клиента NIO http?