Настройка Jetty для большого объема запросов - программирование

Настройка Jetty для большого объема запросов

В нашем приложении нам нужно обрабатывать объемы запросов более 5000 запросов в секунду. Нам сказали, что это возможно с Jetty в нашем типе приложений (где мы должны предоставить JSON-HTTP API для удаленной системы, которая затем инициирует входящие запросы и подключения к нам).

Мы получаем несколько тысяч входящих HTTP-соединений, каждый из которых является постоянным и длится около 30 секунд. Затем удаленный сервер запускает запросы у нас так быстро, как мы можем реагировать на них по каждому из этих соединений. Через 30 секунд соединение закрывается, а другой открывается. Мы должны отвечать менее чем за 100 мс (включая время транзита сети).

Наш сервер работает в EC2 с 8 ГБ оперативной памяти, 4 ГБ которого выделяется нашей виртуальной виртуальной машиной Java (предыдущие исследования предполагали, что вы не должны выделять более половины доступной ОЗУ для JVM).

Вот как мы в настоящее время инициализируем Jetty на основе различных советов, которые мы читаем в Интернете:

Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(config.listenPort);
connector.setThreadPool(new QueuedThreadPool(5120));
connector.setMaxIdleTime(600000);
connector.setRequestBufferSize(10000);
server.setConnectors(new Connector[] { connector });
server.setHandler(this);
server.start();

Обратите внимание, что у нас изначально было всего 512 потоков в нашем потоковом пуле, мы пытались увеличить до 5120, но это не помогло.

Мы обнаруживаем, что с этой настройкой мы пытаемся обрабатывать более 300 запросов в секунду. Мы не считаем, что проблема - это наш обработчик, поскольку он просто выполняет быстрые вычисления и сериализацию/десериализацию Gson.

Когда мы вручную выполняем собственный HTTP-запрос, когда он пытается обработать эту нагрузку, мы обнаруживаем, что может потребоваться несколько секунд, прежде чем он начнет отвечать.

Мы используем Jetty версии 7.0.0.pre5.

Любые предложения, как для решения, так и методы выделения узкого места, будут оценены.

4b9b3361

Ответ 1

Во-первых, Jetty 7.0.0.pre5 является ОЧЕНЬ старым. Jetty 9 теперь выключен и имеет множество оптимизаций производительности.

Загрузите более новую версию строки 7.x в https://www.eclipse.org/jetty/previousversions.html

Этот следующий совет задокументирован в

Обязательно прочитайте их.

Далее, размер threadpool предназначен для обработки принятых запросов, 512 - высокий. 5120 смешно. Выберите число выше 50 и меньше 500.

Если у вас есть EC2 node на базе Linux, убедитесь, что вы настроили сеть для максимальной выгоды на уровне ОС. (Подробности см. В документе под названием "Высокая загрузка" в вышеупомянутом списке)

Убедитесь, что вы используете недавний JRE/JDK, такой как Oracle Java 1.6u38 или 1.7u10. Кроме того, если у вас 64-разрядная ОС, используйте 64-битный JRE/JDK.

Установите счетчик акцепторов, SelectChannelConnector.setAcceptors(int), чтобы оно было значением от 1 до (number_of_cpu_cores - 1).

Наконец, настройте оптимизированную сборку мусора и включите GC Logging, чтобы узнать, есть ли у вас проблемы с причалом или с Java GC. Если вы видите через журнал GC, что массовые мероприятия GC "stop the world" занимают много времени, то вы знаете еще одну причину проблем с производительностью.