Написание Java с низкой задержкой [закрыто]

30

Существуют ли какие-либо специфичные для Java методы (вещи, которые не относятся к C ++) для написания кода с низкой задержкой в ​​Java? Я часто вижу роли Java с низкой задержкой, и они просят опыта написания Java с низкой задержкой, что иногда кажется немного оксюмороном.

Единственное, о чем я могу думать, - это опыт работы с JNI, аутсорсингом вызовов ввода / вывода для нативного кода. Также возможно использование шаблона разрушения, но это не настоящая технология.

Существуют ли какие-либо конкретные советы по написанию кода с низкой задержкой?

Я знаю, что есть спецификация Java в реальном времени, но меня предупреждают, что в реальном времени это не то же самое, что низкая задержка ....

user997112
источник
я не думаю, что нужно создавать слишком много объектов, которые могли бы вызвать цикл сбора
ratchet freak
@ratchet, я предполагаю, что все, что связано с сетью или диском, тоже будет JNI?
user997112
Для получения дополнительных ссылок и презентаций вас может заинтересовать группа пользователей Performance Java plus.google.com/u/1/communities/107178245817384004088
Питер Лоури,
Я бы добавил использование sun.misc.Unsafe, прямо или косвенно полезно. Многие небезопасные методы рассматриваются как внутренние, что означает, что они заменяются машинным кодом, что позволяет избежать любого JNI.
Питер Лори
Основной метод заключается в том, чтобы полностью избежать каких-либо накладных расходов GC. Вы можете прочитать больше об этом в этой статье. Разработка Java без GC
rdalmeida

Ответы:

35

В дополнение к комментариям Мартина добавлю:

  1. Разогрей свою JVM. Байт-код начинается с интерпретации для Hotspot, а затем компилируется на сервере после 10K наблюдений . Многоуровневая компиляция может быть хорошим пробелом.

  2. Загрузка классов - это последовательный процесс, который включает ввод-вывод на диск. Убедитесь, что все классы для ваших основных потоков транзакций загружены заранее и что они никогда не будут выселены из поколения perm.

  3. Следуйте « Принципу единого писателя », чтобы избежать споров и последствий для очередного эффекта закона Литтла, а также изучите закон Амдала о том, что может быть параллельным и стоит ли оно того.

  4. Смоделируйте свой бизнес-домен и убедитесь, что все ваши алгоритмы имеют O (1) или хотя бы O (log n). Это, наверное, самая большая причина проблем с производительностью в моем опыте. Убедитесь, что у вас есть тесты производительности, чтобы охватить основные случаи.

  5. Низкая задержка в Java не ограничивается только Java. Вы должны понимать весь стек, на котором выполняется ваш код. Это будет включать настройку ОС, выбор подходящего оборудования, настройку программного обеспечения систем и драйверов устройств для этого оборудования.

  6. Быть реалистичным. Если вам нужна низкая задержка, не работайте на гипервизоре. Убедитесь, что у вас достаточно ядер для всех потоков, которые должны быть в работоспособном состоянии.

  7. Промахи в кеше - ваша самая большая потеря производительности. Используйте алгоритмы, которые удобны для кэширования и устанавливают сродство к ядрам процессора с помощью набора задач или numactl для JVM или JNI для отдельных потоков.

  8. Рассмотрим альтернативную JVM, например Zing from Azul, с сборщиком мусора без пауз.

  9. Самое главное привлечь кого-то с опытом. Это сэкономит вам много времени в долгосрочной перспективе. Бесстыдная вилка :-)

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

Мартин Томпсон
источник
2
+1 за отличный ответ. Как кто-то, кто интересуется такими постами, может стать хорошей отправной точкой для исследований.
Макфинниган,
23

Есть много вещей, о которых нужно знать, да. Сейчас я на Крите с ограниченным доступом к сети, так что это будет (довольно) коротко. Кроме того, я не эксперт с малой задержкой, но несколько моих коллег играют одного в реальной жизни :-).

  1. Вы должны ценить Механическую Симпатию (термин, придуманный Мартином Томпсоном ). Другими словами, вы должны понимать, что делает ваше базовое оборудование. Знание того, как центральные процессоры загружают строки кэша, какова их пропускная способность для чтения / записи, скорость основной памяти и многое другое, очень важно. Зачем? Потому что вам нужно подумать, как ваш исходный код Java влияет на OperatingSystem / Hardware через JVM времени выполнения. Например, способ размещения переменных вашего поля в исходном коде приводит к вытеснению строк кэша (стоит ~ 150 тактов), хммм ... :-).

  2. Как правило, вы хотите блокировать алгоритмы и ввод / вывод. Даже наиболее хорошо спроектированное параллельное приложение (использующее блокировки) подвергается риску блокировки, блокирование с низкой задержкой обычно плохо :-).

  3. Понимать распределение объектов и сборку мусора. Это серьезная тема, но в основном вы хотите избежать пауз GC (часто вызванных природой различных коллекций GC «Остановить мир»). Специалисты по сборке GC, такие как сборщик Azul, могут во многих случаях решить эту проблему для вас из коробки, но для большинства людей им нужно понять, как настроить Sun / Oracle GC (CMS, G1 и т. Д.).

  4. Hotspot JIT чертовски потрясающий. Узнайте о его оптимизации, но, вообще говоря, все хорошие методы ОО (инкапсуляция, небольшие методы, как можно больше неизменяемых данных) позволят оптимизировать JIT, предоставляя вам такие уровни производительности, которые дает вам хорошо разработанный код C / C ++.

  5. Общая системная архитектура. Будьте осведомлены о сети, о том, как расположены машины, если вы подключены к обмену через оптоволокно и т. Д. И т. Д.

  6. Знайте о влиянии регистрации. регистрация двоичного файла или использование закодированного вывода, который вы можете анализировать в автономном режиме, вероятно, является хорошей идеей.

В целом, я настоятельно рекомендую пройти курс настройки производительности Java в Kirk Pepperdine [Disclaimer: я преподаю этот курс сам, поэтому я предвзятый]. Вы получите хорошее освещение различных аспектов JVM и его влияния на основные операционные системы и оборудование.

PS: я постараюсь вернуться к этому позже и привести в порядок некоторые из них.

Мартейн Вербург
источник
Было бы очень хорошо, если бы опытные с «Механической симпатией» могли бы поделиться некоторыми приемами определения того, когда данная граница была пересечена.
Я прокрутил твиттер, чтобы попытаться найти настоящих экспертов :-)
Martijn Verburg
Круто, Мартин Томпсон вмешался, стоит последовать его совету по моему.
Мартейн Вербург