Существуют ли какие-либо специфичные для Java методы (вещи, которые не относятся к C ++) для написания кода с низкой задержкой в Java? Я часто вижу роли Java с низкой задержкой, и они просят опыта написания Java с низкой задержкой, что иногда кажется немного оксюмороном.
Единственное, о чем я могу думать, - это опыт работы с JNI, аутсорсингом вызовов ввода / вывода для нативного кода. Также возможно использование шаблона разрушения, но это не настоящая технология.
Существуют ли какие-либо конкретные советы по написанию кода с низкой задержкой?
Я знаю, что есть спецификация Java в реальном времени, но меня предупреждают, что в реальном времени это не то же самое, что низкая задержка ....
java
performance
caching
latency
user997112
источник
источник
Ответы:
В дополнение к комментариям Мартина добавлю:
Разогрей свою JVM. Байт-код начинается с интерпретации для Hotspot, а затем компилируется на сервере после 10K наблюдений . Многоуровневая компиляция может быть хорошим пробелом.
Загрузка классов - это последовательный процесс, который включает ввод-вывод на диск. Убедитесь, что все классы для ваших основных потоков транзакций загружены заранее и что они никогда не будут выселены из поколения perm.
Следуйте « Принципу единого писателя », чтобы избежать споров и последствий для очередного эффекта закона Литтла, а также изучите закон Амдала о том, что может быть параллельным и стоит ли оно того.
Смоделируйте свой бизнес-домен и убедитесь, что все ваши алгоритмы имеют O (1) или хотя бы O (log n). Это, наверное, самая большая причина проблем с производительностью в моем опыте. Убедитесь, что у вас есть тесты производительности, чтобы охватить основные случаи.
Низкая задержка в Java не ограничивается только Java. Вы должны понимать весь стек, на котором выполняется ваш код. Это будет включать настройку ОС, выбор подходящего оборудования, настройку программного обеспечения систем и драйверов устройств для этого оборудования.
Быть реалистичным. Если вам нужна низкая задержка, не работайте на гипервизоре. Убедитесь, что у вас достаточно ядер для всех потоков, которые должны быть в работоспособном состоянии.
Промахи в кеше - ваша самая большая потеря производительности. Используйте алгоритмы, которые удобны для кэширования и устанавливают сродство к ядрам процессора с помощью набора задач или numactl для JVM или JNI для отдельных потоков.
Рассмотрим альтернативную JVM, например Zing from Azul, с сборщиком мусора без пауз.
Самое главное привлечь кого-то с опытом. Это сэкономит вам много времени в долгосрочной перспективе. Бесстыдная вилка :-)
В режиме реального времени и с малой задержкой отчетливо отдельные предметы, хотя часто связаны между собой. В реальном времени нужно быть более предсказуемым, чем быстрым. По моему опыту JVM в реальном времени, даже мягкие в реальном времени, работают медленнее, чем обычные JVM.
источник
Есть много вещей, о которых нужно знать, да. Сейчас я на Крите с ограниченным доступом к сети, так что это будет (довольно) коротко. Кроме того, я не эксперт с малой задержкой, но несколько моих коллег играют одного в реальной жизни :-).
Вы должны ценить Механическую Симпатию (термин, придуманный Мартином Томпсоном ). Другими словами, вы должны понимать, что делает ваше базовое оборудование. Знание того, как центральные процессоры загружают строки кэша, какова их пропускная способность для чтения / записи, скорость основной памяти и многое другое, очень важно. Зачем? Потому что вам нужно подумать, как ваш исходный код Java влияет на OperatingSystem / Hardware через JVM времени выполнения. Например, способ размещения переменных вашего поля в исходном коде приводит к вытеснению строк кэша (стоит ~ 150 тактов), хммм ... :-).
Как правило, вы хотите блокировать алгоритмы и ввод / вывод. Даже наиболее хорошо спроектированное параллельное приложение (использующее блокировки) подвергается риску блокировки, блокирование с низкой задержкой обычно плохо :-).
Понимать распределение объектов и сборку мусора. Это серьезная тема, но в основном вы хотите избежать пауз GC (часто вызванных природой различных коллекций GC «Остановить мир»). Специалисты по сборке GC, такие как сборщик Azul, могут во многих случаях решить эту проблему для вас из коробки, но для большинства людей им нужно понять, как настроить Sun / Oracle GC (CMS, G1 и т. Д.).
Hotspot JIT чертовски потрясающий. Узнайте о его оптимизации, но, вообще говоря, все хорошие методы ОО (инкапсуляция, небольшие методы, как можно больше неизменяемых данных) позволят оптимизировать JIT, предоставляя вам такие уровни производительности, которые дает вам хорошо разработанный код C / C ++.
Общая системная архитектура. Будьте осведомлены о сети, о том, как расположены машины, если вы подключены к обмену через оптоволокно и т. Д. И т. Д.
Знайте о влиянии регистрации. регистрация двоичного файла или использование закодированного вывода, который вы можете анализировать в автономном режиме, вероятно, является хорошей идеей.
В целом, я настоятельно рекомендую пройти курс настройки производительности Java в Kirk Pepperdine [Disclaimer: я преподаю этот курс сам, поэтому я предвзятый]. Вы получите хорошее освещение различных аспектов JVM и его влияния на основные операционные системы и оборудование.
PS: я постараюсь вернуться к этому позже и привести в порядок некоторые из них.
источник