16
HiLoad Java Software

Dz Java Hi Load 0.4

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Dz Java Hi Load 0.4

HiLoad Java Software

Page 2: Dz Java Hi Load 0.4

2

Что такое HiLoad

Цель - упереться во все ограничения сразу!

Принцип достижения:

• Детектировать ограничения• Найти причину• Устранить или обойти

Типы ограничений:

• Ресурсы среды (хендлы, сокеты, треды, и т.п.) – ограничения на количество, замедление ОС на большом количестве

• Производительность (процессора, диска, памяти) – кеширование, распараллеливание

• Синхронизация – внутренняя (семафоры), внешняя («медленные» сокеты)

Page 3: Dz Java Hi Load 0.4

3

Что такое JavaMarket share в 2002-м году превышал 50%. Снижение доли происходит медленно, и, в основном, в силу продвижения платформы .Net.

Технологии Java поддерживают Sun, Oracle, IBM, SAP – почти все, кроме Microsoft :).

Java применялась при создании таких систем, как Amazon, Ebay, LinkedIn, Yahoo.

Платформа Java – это Ada, AWK, Clojure, Lisp, Forth, Groovy, Haskell, Lua, OCaml, Pascal, PHP, Prolog, Python, Rexx, Ruby, Scala, Scheme, TCL + ещё пара-тройка сотен менее известных или менее актуальных языков.

Язык Java – это лучший в мире инструментарий разработчика: Eclipse, Intellij IDEA, NetBeans. Среда разработки Eclipse бесплатна, и вряд ли с чем-либо сравнима по функциональности и количеству дополнительных модулей.

Page 4: Dz Java Hi Load 0.4

4

Java vs C++: религия и реальность• Подход, а не язык

In the study, 38 programmers were asked to write the same application program in either C/C++ or Java. Applying statistical analysis to the performance data for the programs revealed that actual performance differences depended more on the way the programs were written than on the language used. – O’Reilly

• Близкие по стилю написания программы на C++ и Java близки по производительности.

• JIT эффективнее статической компиляции (глобальная оптимизация, рекомпиляция)

• У Java есть свои проблемы, но они не очень велики и, как правило, разрешимы

Page 5: Dz Java Hi Load 0.4

5

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

• Есть проблема скорости обращения памяти: очень быстрая аллокация при НЕКОТОРЫХ алгоритмах работы GC может привести к ложной нехватке памяти: свободная память есть, но сборщик до неё «не добежал».

• Избегать активной аллокации в коротких циклах обслуживания.

• Понимать, каковы свойства имеющихся сборщиков мусора. Их – больше одного и они настраиваются. Знать о существовании других виртуальных машин. Oracle JRockIt. Команды java –client и java –server могут дать разницу в скорости на порядок.

• Пулы объектов – были стандартным ответом, но есть минусы, и Sun их не рекомендует.

Сборка мусора

Page 6: Dz Java Hi Load 0.4

6

• Как правило, программы на Java, всё же, более требовательны к памяти. И, как правило, это не лечится. В то же время основные затраты памяти в серверных приложениях – это кешированные данные существенного размера. Для таких данных накладные расходы Java невелики.

• Throughput collector: -XX:+UseParallelGC

Хорошо работает на многопроцессорных системах в режимах с большим объёмом аллокации и раннего освобождения

• Concurrent low pause collector: -XX:+UseConcMarkSweepGC

Пытается сократить задержки на сборку мусора.

• Incremental low pause collector: -XX:+UseTrainGC

Устаревший, не поддерживается.

Сборка мусора

Page 7: Dz Java Hi Load 0.4

7

Подход на основе select – ужасен! Ломка control flow, длинный поиск дескриптора в ядре.

Не надо бояться. Практический опыт показал, что 10 000 (десять тысяч) нитей отлично отрабатывают под нагрузкой в 100 миллионов показов в сутки - при нелинейном распределении нагрузки.

Пулы нитей – стандартная функциональность (ThreadPoolExecutor).

Распределение нитей по ядрам зависит от VM и от режима её работы. Для серверного кода – JRockIt.

Не забыть про ограничения системы (ulimit) и внутреннюю синхронизацию. И миллион нитей бесполезен, если все они стоят в очереди к одному семафору.

Нити – целый клубок

Page 8: Dz Java Hi Load 0.4

8

Библиотека NIO – низкоуровнывый эффективный ввод-вывод.

Есть аналог select.

Есть memory mapped IO.

Есть асинхронный ввод-вывод.

Операции выполняются на самом низком из возможных уровней. В Unix операция transferTo, скорее всего, выльется в один системный вызов.

FileChannel in = new FileInputStream(source).getChannel(); FileChannel out = new FileOutputStream(target).getChannel();

// JavaVM does its best to do this as native I/O operations.in.transferTo (0, in.size(), out);

out.close(); in.close();

Back to Select

Page 9: Dz Java Hi Load 0.4

9

Не всё нужно делать в контексте запроса

Кешировать данные. Банально, но работает. Построить по запросу объект-ключ, искать по ключу в стандартном TreeMap – может работать удивительно быстро!

Готовить данные, не дожидаясь обращения. Первый Yandex.Market стартовал три часа, но после этого вообще не обращался к дискам.

Готовить бинарные данные, отстреливать ответ одним write-ом. Пример – отдача баннера.

Стратегия явного отказа при cache miss может быть вполне уместна. Лучше показать журнальную статью без новостей, чем потерять посетителя вообще.

Тяни-толкай

Page 10: Dz Java Hi Load 0.4

10

Конечно, Eclipse

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

Профайлер памяти – использование памяти разными классами, утечки.

Apache JMeter – нагрузочное тестирование, генерация нагрузки.

JMX – анализ состояния программы и виртуальной машины в ран-тайме – стандартная функциональность в VM, можно дополнять программу своими функциями мониторинга и управления.

Инструментарий

Page 11: Dz Java Hi Load 0.4

11

JMX: Heap

Page 12: Dz Java Hi Load 0.4

12

• Модуль для отображения векторных географических карт.

Написание proof of concept – 4 Завалишино-дня. Основная причина неэффективности – необдуманное применение HashSet. Замена на LinkedList дала взлёт производительности в сотни раз. Производительность (на глаз) оказалась заметно выше, чем у аналога на C++.

• Система мониторинга судовых систем Gardemarine

Основная причина неэффективности – низкая скорость обсчёта бэкграундов приборов и индикаторов (градиенты и т.п.

Сделали (в рамках наследования) перехват кода отрисовки, отделили и закешировали отрисовку бэкграундов. Итог – легко отрабатываем 20 кадров/сек. При этом код остался совместим с компонентами Swing.

Другие примеры

Page 13: Dz Java Hi Load 0.4

13

Java – язык, который спроектирован для того, чтобы облегчить работу программиста. И он это действительно делает. Программирование на Java настолько эффективно, что приводит к изрядной генерализации и абстрагированию кода.

В свою очередь, обобщённый код (хороший пример - Swing) допускает чрезвычайно гибкое использование. Но это не всегда нужно.

Короче: если выкинуть Websphere и поставить JBoss – производительность может возрасти, а потребность в ресурсах – снизится. JBoss можно заменить на Tomcat. А Tomcat – на Jetty.

А можно начать с Jetty, и сэкономить кучу времени!

В то же время никто не запрещает при необходимости подняться от Jetty до Tomcat – и так далее.

Избыточная гибкость

Page 14: Dz Java Hi Load 0.4

14

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

• Не применяйте сложных механизмов работы с данными, типа ORM, или применяйте их крайне осмотрительно. Отладка производительности Hibernate может вынуть душу даже из админа с каменным сердцем.

• Протоколирование и т.п. – это можно делать асинхронно! Gardemarine нельзя убить, лишив его доступа к диску для записи log-файла, потому что протоколирование идёт через thread pool.

Разное

Page 15: Dz Java Hi Load 0.4

15

• Для хардкорных realtime приложений.

• Не маргинальная технология - около 15 млн упоминаний по оценке Google. Версия 2.1 в релизе, версия 2.2 готовится к выпуску.

• Жёсткое ручное управление памятью. Естественно, ссылка на такую память не может покидать пределы realtime кода.

• Жёсткие приоритеты, защита от инверсии приоритета.

• Механизм обслуживания асинхронных событий (прерываний!).

• Наносекундный тайминг.

• Прямой доступ к памяти (возможность написания драйверов).

Realtime Java

Page 16: Dz Java Hi Load 0.4

16

Microsoft Russia

Digital Zone clients

Russian State Corporation RusNano (www.rusnano.com)

Yandex (www.yandex.ru)largest Russian search engine

MET, Russian Ministry of Economic Development

Adobe (www.adobe.com)

Apple (www.apple.com)

Contact information+7 (499) 973-23-80, [email protected], www.dz.ru127055, Moscow, Sushchevskaya str., house 27, structure 2, 334 office