Архив метки: performance

Low-latency оптимизации JVM

Данная статья является частью более общей статьи об оптимизациях торговой системы на всех уровнях.

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

Не существует «волшебных» параметров, которые делают в момент ваше приложение быстрее, секретных параметров, которые подходят для всех приложений и ситуаций. Каждый выбранный параметр и измененное значение в нем следует проверять на специальной тестовой платформе. По нескольку раз. По нескольку часов. А потом долго думать, почему результаты тестов показывают снижение или улучшение производительности.

Каждая новая версия Java приносит новые параметры и удаляет другие. Каждая новая версия или билд Java может влиять на производительность в лучшую или худшую сторону. Так что при каждом обновлении версии все замеры производительности надо производить заново.

Следует отметить, что и изменения на уровне железа и операционной системы также могут сказываться на производительности JVM. Какой-то параметр JVM, который улучшал производительность приложения до изменения в ОС, может привести к ухудшению производительности после патча ядра ОС или после изменения какой-то настройки в ней. Так что при каждом обновлении ОС или изменении настройки ОС все замеры производительности надо опять производить заново.

Все приведенное ниже не гарантирует, что в конкретно в вашей ситуации ваше приложение будет работать быстрее. Не следует надеяться, что криво написанное приложение заработает автоматически быстрее при включении тех или иных «волшебных» параметров JVM или настроек ОС. Для достижения low-latency само приложение должно писаться с учетом low-latency.

Параметры приведены для Java 8 HotSpot JVM.

Все настройки JVM можно разбить условно на четыре группы:

  • настройки heap
  • настройки сборщика мусора
  • настройки JIT-компилятора
  • прочие настройки

Читать далее

Реклама

О «железе»

При настройке производительности торговой системы для достижения минимальных задержек приходится обращать внимание на все уровни системы, от программного до аппаратного. Желательно ознакомиться с железной частью компьютера, чтобы понимать, как и что работает в процессоре, в памяти и в сети. Так будет легче понять, почему именно эти настройки нужны в данном случае и вредны — в другом. С пониманием аппаратного слоя системы вы становитесь лучше как программист.

Читать далее

Достижение 4-ого уровня с помощью подогрева

Как видно из предыдущих статей JIT-компилятор на 4-ом уровне способен создавать высокопроизводительный нативный код. В некоторых случаях, благодаря сбору статистки в реальном рабочем окружении, нативный код получается даже лучше, чем код созданный статическим компилятором из исходников C/C++. Именно поэтому Java-программисты заявляют, что Java-приложение по скорости может превзойти приложение, написанное на C/C++.

Как же нам достичь этого уровня компиляции, если для его достижения требуется 15.000 исполнений?

Читать далее

JIT-компилятор и как он нам поможет победить latency

JIT-компилятор — встроенный в JVM компилятор байткода в машинный код. Проведя множество интервью с кандидатами на роль Core Java Developer, я был удивлен тем, что многие кандидаты даже не подозревали о существовании такой технологии в JVM, а те, кто краем уха что-то слышал, не могли объяснить, как она работает. Может быть для написания J2EE или веб-приложений этих знаний и не требуется, но для работы в области low-latency trading эти знания — ключевые.

Описание JIT-компилятора хорошо дано в книгах:

В данной статье я просто изложу основы, без знания которых непонятны будут другие статьи по low-latency оптимизации JVM.

Читать далее

Low-latency оптимизации на всех уровнях торговой системы

В предыдущей статье я говорил об оптимизации вообще, а теперь приведу несколько советов по low-latency оптимизациях в Java-приложениях на всех уровнях торговой системы:

  • аппаратный уровень: процессор, сетевой интерфейс, коммутация
  • операционная система
  • настройка JVM
  • оптимизации на уровне приложения

Читать далее

Linux для биржевой торговли

Операционная система играет важнейшую роль в работе торговой системы. Поэтому выбор ОС является главным этапом создания биржевой торговой системы с приемлимым уровнем latency. Исторически так сложилось, что теперь в качестве ОС чаще всего выбирают Linux.

Linux — это бесплатное ядро операционной системы общего назначения. ОС, построенная на основе ядра Linux, способна работать на обычных настольных компьютерах, на многопроцессорных серверах, лаптопах, планшетах, телефонах и встроенных устройствах. Поэтому для работы в задачах биржевой торговли, где особо высоки требования к low-latency, необходимо провести тонкую настройку ОС Linux.

Читать далее

Жил был программист Richard Rose

Жил был программист Richard Rose.

После работы на ведущие банки мира (Goldman Sachs, Morgan Stanley, Bank of America, UBS и прочее), он решил, что настало время уйти на вольные хлеба и реализовать свои идеи и наработки в коммерческом продукте. План состоял в том, чтобы создать движок, совмещавший OMS и соединение с рынком, который бы способен был перемещать сообщения с задержкой в микросекунды и даже меньше. Движок был написан на Java.

Читать далее

Java 11 и Epsilon GC

В Java 11 представлен новый экспериментальный сборщик мусора Epsilon GC. Несмотря на название, он не собирает мусор, а только аллоцирует память и не освобождает её. Соответственно, по исчерпании свободной памяти, возможен креш с OutOfMemory. Для чего такой сборшик мусора может пригодиться?

Читать далее

Что такое latency? Low latency? Ultra-low latency?

Для понимания понятия latency возьмем простой пример. Представьте себе некий «черный ящик» с одним входом и одним выходом. Вы подаете сигнал на вход и ожидаете появление сигнала на выходе. При проведении экспериментов вы замечаете, что при подаче сигнала на вход сигнал на выходе появляется через 1 секунду. Причем это происходит постоянно с отклонением +/- 10 миллисекунд. То есть выдача сигнала на выходе происходит с определенной задержкой. Это и есть latency — время задержки.

Читать далее