Я использую сервер Finatra (https://github.com/capotej/finatra), вдохновленный Sinatra веб-фреймворк для scala, построенный поверх Finagle (асинхронная система RPC). Приложение должно быть рассчитано на получение от 10 до 50 запросов одновременно. Каждый запрос довольно интенсивно использует ЦП, в основном из-за синтаксического анализа и сериализации больших JSON и операций с массивами, таких как сортировка, группировка и т. д.
Теперь мне интересно, как влияют на производительность следующие параметры и как их комбинировать:
- ОЗУ сервера
- Количество ядер сервера
- Размер кучи JVM
- Количество потоков, работающих параллельно в моем будущем пуле
В качестве частичного ответа скажу:
- Размер кучи JVM должен быть настроен в зависимости от оперативной памяти
- Наличие нескольких ядер повышает производительность при одновременной нагрузке, но не ускоряет обработку одного запроса.
- Наличие большой оперативной памяти, наоборот, может заметно ускорить выполнение одного запроса.
- Количество потоков в моем будущем пуле должно быть настроено в соответствии с моим количеством ядер.
ИЗМЕНИТЬ
Я хочу сравнить производительность независимо от кода, сосредоточив внимание только на аппаратной/поточной модели. Предположим, код уже оптимизирован. Дополнительная информация :
- Я создаю API отчетности данных. Время обработки запроса во многом зависит от набора данных, с которым я работаю. Для больших наборов данных это может достигать максимум 10 секунд.
- Я получаю большую часть данных из стороннего API, но я также обращаюсь к базе данных MySQL с помощью механизма объединения соединений c3po. Выполнение запроса дополнительно делегируется будущему пулу для предотвращения блокировки.
- Нет дискового ввода-вывода, за исключением MySQL
- Я не хочу ничего кэшировать на стороне сервера, потому что мне нужно работать со свежими данными.
Спасибо !!!