Важность оборудования для производительности асинхронного сервера JVM

Я использую сервер Finatra (https://github.com/capotej/finatra), вдохновленный Sinatra веб-фреймворк для scala, построенный поверх Finagle (асинхронная система RPC). Приложение должно быть рассчитано на получение от 10 до 50 запросов одновременно. Каждый запрос довольно интенсивно использует ЦП, в основном из-за синтаксического анализа и сериализации больших JSON и операций с массивами, таких как сортировка, группировка и т. д.

Теперь мне интересно, как влияют на производительность следующие параметры и как их комбинировать:

  • ОЗУ сервера
  • Количество ядер сервера
  • Размер кучи JVM
  • Количество потоков, работающих параллельно в моем будущем пуле

В качестве частичного ответа скажу:

  • Размер кучи JVM должен быть настроен в зависимости от оперативной памяти
  • Наличие нескольких ядер повышает производительность при одновременной нагрузке, но не ускоряет обработку одного запроса.
  • Наличие большой оперативной памяти, наоборот, может заметно ускорить выполнение одного запроса.
  • Количество потоков в моем будущем пуле должно быть настроено в соответствии с моим количеством ядер.

ИЗМЕНИТЬ

Я хочу сравнить производительность независимо от кода, сосредоточив внимание только на аппаратной/поточной модели. Предположим, код уже оптимизирован. Дополнительная информация :

  • Я создаю API отчетности данных. Время обработки запроса во многом зависит от набора данных, с которым я работаю. Для больших наборов данных это может достигать максимум 10 секунд.
  • Я получаю большую часть данных из стороннего API, но я также обращаюсь к базе данных MySQL с помощью механизма объединения соединений c3po. Выполнение запроса дополнительно делегируется будущему пулу для предотвращения блокировки.
  • Нет дискового ввода-вывода, за исключением MySQL
  • Я не хочу ничего кэшировать на стороне сервера, потому что мне нужно работать со свежими данными.

Спасибо !!!


person Benoit Guigal    schedule 23.10.2013    source источник


Ответы (1)


Производительность и общее поведение по-прежнему будут зависеть от вашего собственного кода вне используемой вами структуры. Другими словами, вы правильно перечислили основные факторы, которые будут влиять на производительность, но ваш собственный код будет иметь такое значительное влияние на нее, что почти невозможно сказать заранее.

Навскидку, я бы сказал, что вам нужно более подробно охарактеризовать некоторые вещи о вашем приложении:

  • Вы говорите, что каждый запрос будет интенсивно использовать процессор, но что вы имеете в виду? Будет ли каждый запрос занимать 1 мс? 10 мс? 100 мс?
  • У вас есть доступ к базе данных? Каковы характеристики вашей базы данных?
  • Либо с базой данных, либо без нее, у вас есть дисковый ввод-вывод? Насколько это важно?

... но если ваше приложение действительно простое, не сильно попадает на диск (или вообще... ваш запрос может быть только для чтения, и все кэшируется), и вы привязаны к ЦП, просто вставьте достаточное количество ядер ЦП в свой сервер будет самым важным, что вы можете сделать.

person Ivan Voras    schedule 23.10.2013