Написання Java з низькою затримкою [закрито]


30

Чи існують якісь специфічні для Java методи (речі, які не застосовуються до C ++) для написання коду з низькою затримкою на Java? Я часто бачу ролі Java з низькою затримкою, і вони просять досвід написання Java з низькою затримкою, що іноді здається трохи оксимороном.

Єдина думка, яку я міг би придумати, - це досвід роботи з JNI, що передає дзвінки на введення-виведення на рідний код. Можливо також використовувати схему руйнування, але це не реальна технологія.

Чи є якісь конкретні поради щодо написання коду з низькою затримкою?

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


не створюйте занадто багато об’єктів, які можуть викликати цикл колекції, я б здогадався
щурячий вирод

@ratchet, я припускаю, що щось, пов'язане з мережею чи дисками, було б і JNI?
user997112

Для подальших посилань та презентацій вас може зацікавити Група користувачів Performance Performance plus.google.com/u/1/communities/107178245817384004088
Peter Lawrey

Я б додав, використовуючи sun.misc.Unsafe, прямо чи опосередковано, корисно. Багато небезпечних методів розглядаються як внутрішні, що означає, що вони замінені машинним кодом, що дозволяє уникнути будь-якого JNI.
Пітер Лорі

Основна техніка - повністю уникати будь-яких накладних витрат на ГК. Детальніше про це ви можете прочитати у цій статті Java Development Without GC
rdalmeida

Відповіді:


35

На додаток до коментарів Мартійна я додам:

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

  2. Завантаження класів - це послідовний процес, який передбачає введення вводу-виводу на диск. Переконайтеся, що всі класи для ваших основних потоків транзакцій завантажуються наперед і що вони ніколи не будуть виселені з генерації перм.

  3. Дотримуйтесь " Принципу єдиного письменника ", щоб уникнути суперечок та наслідків наслідків дії Закону Літтла, а також вивчіть Закон Амдхала на те, що може бути паралельним і чи воно того варте.

  4. Моделюйте бізнес-домен та переконайтеся, що всі ваші алгоритми мають O (1) або принаймні O (log n). Це, мабуть, найбільша причина моїх проблем щодо продуктивності. Переконайтеся, що у вас є тести на працездатність для висвітлення основних випадків.

  5. Низька затримка Java не обмежується лише Явою. Вам потрібно зрозуміти весь стек, на якому виконується ваш код. Це передбачає налаштування ОС, вибір відповідного обладнання, налаштування програмного забезпечення системи та драйвери пристроїв для цього обладнання.

  6. Будь реалістичним. Якщо вам потрібна низька затримка, не біжіть на гіпервізор. Переконайтеся, що у вас є достатня кількість ядер для всіх потоків, які повинні бути у стані, що можна виконати.

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

  8. Розглянемо альтернативний JVM на зразок Zing від Azul із смітником без пауз.

  9. Найголовніше залучити когось із досвіду. Це заощадить вам стільки часу в довгостроковій перспективі. Безсоромний штекер :-)

Реальний час та низька затримка - це окремо окремі теми, хоча часто пов'язані. У реальному часі - це бути більш передбачуваним, ніж швидким. На мій досвід, реалізовані СВМ у режимі реального часу, навіть м'які в режимі реального часу, повільніше, ніж звичайні СВМ.


2
+1 за чудову відповідь. Оскільки хтось із зацікавленим в tx обробці публікацій, як це, є чудовою відправною точкою для досліджень.
mcfinnigan

23

Існує купа речей, які слід знати, так. На даний момент я перебуваю на Криті з обмеженим доступом до мережі, тому це буде (досить) коротко. Також я не фахівець з низькою затримкою, але кілька моїх колег грають одного в реальному житті :-).

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

  2. Як правило, ви хочете заблокувати безкоштовні алгоритми та введення / виведення. Навіть найбільш добре розроблений паралельний додаток (який використовує блокування) ризикує заблокувати, блокування з низькою затримкою взагалі погано :-).

  3. Розуміння розподілу об’єктів та збирання сміття. Це масштабна тема, але в основному ви хочете уникати пауз GC (часто спричинених характером різних колекцій GC). Спеціалізовані колектори GC, такі як колектор Azul, у багатьох випадках можуть вирішити цю проблему для вас поза межами коробки, але для більшості людей вони повинні зрозуміти, як настроїти GC Sun / Oracle (CMS, G1 тощо).

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

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

  6. Будьте в курсі впливу лісозаготівлі. ведення двійкового журналу або використання кодованого виводу, який ви можете аналізувати за межами рядка, ймовірно, є хорошою ідеєю.

В цілому я настійно рекомендую пройти курс налаштування продуктивності Java Kirk Pepperdine [Відмова: Я сам викладаю цей курс, тому я упереджений]. Ви отримаєте хороше висвітлення різних аспектів JVM та його впливу на базові O / S та обладнання.

PS: Я спробую переглядати це пізніше і приберіть його.


Було б дуже приємно, якби досвідчені з Механічною симпатією могли поділитися деякими хитрощами щодо виявлення, коли певна межа була перекреслена.

Я пінгвітував щебетати, щоб спробувати знайти справжніх експертів у :-)
Martijn Verburg

Класно, Мартін Томпсон промовив, варто дотримуватися його порад щодо моєї.
Мартійн Вербург
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.