Почему производительность JVM улучшается с увеличением нагрузки? - PullRequest
1 голос
/ 03 октября 2019

Мы наблюдаем поведение, при котором производительность JVM снижается при небольшой нагрузке. В частности, при многократных запусках в тестовой среде мы замечаем, что задержка ухудшается примерно на 100%, когда скорость сообщений о заказах, закачиваемых в систему, уменьшается. Ниже приведены некоторые предыстории проблемы, и я был бы признателен за любую помощь по этому вопросу.

Упрощенно можно предположить, что исследуемое демо-приложение для торговли на Java имеет 3 важных потока: поток получателя ордеров, поток процессора, передатчик обменапоток

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

Задержка от получения заказа до выхода заказа на биржу ухудшается на 100%, когда скорость заказов, закачиваемых в системуизменяется с большего числа на низкое.

Испытанные решения:

  1. Прогрев критического пути кода в JVM путем отправки высокой частоты сообщений и заполнения системы перед уменьшениемчастота сообщений: не решает проблему

  2. Профилирование приложения: используя профилировщик, он показывает горячие точки в коде, где улучшение может быть на 10-15% за счет улучшения реализации. Но ничто в пределах 100% -ого улучшения не достигается только за счет увеличения частоты сообщений.

У кого-нибудь есть идеи или предложения по этому поводу? Может ли это быть связано с джиттером планирования в потоке.

Может ли быть так, что при низкой скорости сообщений потоки переключаются из ядра?

2 сообщения, я думаю, может бытьсвязанные ниже. Однако наши симптомы немного отличаются:

быстрее JVM под нагрузкой?

Почему JVM требует прогрева?

1 Ответ

1 голос
/ 03 октября 2019

Постоянная задержка для низкой / средней нагрузки требует специальной настройки Linux.

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

  • настроить ядро ​​ЦП на постоянную работу и максимальную частоту ( здесь - документы для RedHat)
  • настроить выделенные ядра ЦП для критических потоков приложения
    • Используйте isolcpus для исключениявыделенные ядра из планировщика
    • используют taskset для привязки критического потока к конкретному ядру
  • настройка службы для работы на одном узле NUMA (с numactl)

Планировщик Linux и выборка мощности являются ключевыми факторами, влияющими на высокую дисперсию задержки при низких / средних низких значениях.

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

Кэш ЦП является ключевым фактором производительности, если критический поток запланирован на разных ядрахose свои данные кеша. Кроме того, планирование других потоков для того же ядра приведет к тому, что кэш также увеличит задержку критического кода.

При большой нагрузке эти факторы менее важны (частота максимальна, а потоки заняты на ~ 100%, стремясь придерживаться определенных ядер). ,

Хотя при низкой / средней нагрузке эти факторы отрицательно влияют как на среднюю задержку, так и на высокий процентиль (99 процентиль может быть на порядок хуже по сравнению со случаем большой нагрузки).

Для приложений с высокой пропускной способностью (выше100 000 запросов / сек.) Также полезен усовершенствованный подход к межпотоковой связи (например, LMAX disruptor ).

...