28
Оптимизация производительности нагруженных веб-систем на Java Личный опыт и не только

Оптимизация производительности нагруженных веб-систем на Java

Embed Size (px)

Citation preview

Page 1: Оптимизация производительности нагруженных веб-систем на Java

Оптимизация производительности нагруженных веб-систем на Java

Личный опыт и не только

Page 2: Оптимизация производительности нагруженных веб-систем на Java

Давайте познакомимся

[email protected]• Разрабатываю с 1998-го• Разрабатываю на Java с осени 2000-го• Кроме разработки, занимаюсь

консультированием команд, разрабатывающих веб-приложения

• Читаю доклады по оптимизации производительности

Page 3: Оптимизация производительности нагруженных веб-систем на Java

Вы?

• Разработчики на Java• Разработчики веб-приложений на Java?• Архитекторы приложений?• IT operations engineers?• Performance engineers?

Page 4: Оптимизация производительности нагруженных веб-систем на Java

Почему веб-приложения?

• У веб-приложений много пользователей• В интернете при решении даже простых

бизнес-задач легко столкнуться с большими нагрузками

• Интернет большой, и уменьшения числа пользователей не предвидится – в будущем любое успешное веб-приложение будет высоконагруженным

Page 5: Оптимизация производительности нагруженных веб-систем на Java

Постановка задачи

• Что такое «высокая нагрузка»?• Все относительно• Метрики: время обработки запроса и

процент успешно обработанных запросов• У приложения нет периодов простоя, вас не

будят по ночам – эта презентация не для вас

• Метрики неудовлетворительны – надо искать выход

Page 7: Оптимизация производительности нагруженных веб-систем на Java

Шаманизм и оптимизация

• http://ru.wikipedia.org/wiki/Карго-культ• «Сделаем, как у больших (как у Google)»• «Сделаем, как делал архитектор Вася в

прошлом проекте»• «Сделаем, как написано в этом блоге»• Shotgun programming: «Сделаем как-нибудь

и посмотрим» – может быть хорошим подходом для начала

Page 8: Оптимизация производительности нагруженных веб-систем на Java

Если это был не выход...

• Путь 1: Наймите консультанта• Путь 2: Измеряйте, потом оптимизируйте!• Что измерять?• Все, до чего можете дотянуться, в первую

очередь:• Параметры системы в целом• Параметры вашего приложения

Page 9: Оптимизация производительности нагруженных веб-систем на Java

Параметры системы

• Состояние HDD – IOPS, latency• Состояние оперативной памяти – размер

памяти приложений, размер файлового кэша• Состояние CPU – user time, system time• Состояние очереди планировщика – LA• Состояние сетевой подсистемы – количество

подключений, объем трафика• Состояние JVM – количество major/minor

garbage collections

Page 10: Оптимизация производительности нагруженных веб-систем на Java

Сбор параметров системы

• Java-based: OpenNMS, … - жизнь слишком коротка, других ресурсов тоже мало

• Zabbix – если вы работаете в Yandex, или у вас есть время переписать код работы со стат. данными

• Munin – требует мало ресурсов и не требует первичной настройки

• Cacti – если используете DBMS MySQL• Collectd – требует минимальное количество

ресурсов, агент написан на pure C.

Page 11: Оптимизация производительности нагруженных веб-систем на Java

Параметры приложения

• Длительность выполнения разных участков кода приложения

• Потребление памяти структурами данных• Частота выделения памяти под новые

структуры данных• Можно использовать профайлер• Профайлеры: YourKit, JProfiler, …• Можно использовать другие средства

профилирования

Page 12: Оптимизация производительности нагруженных веб-систем на Java

Недостатки профайлера

• Профайлер знает о вашем приложении гораздо меньше, чем вы

• Профайлер профилирует каждый вызов• Профайлер может вносить сильную

погрешность и даже менять картину в целом

• Использование профайлера предполагает предварительное знакомство с ним

Page 13: Оптимизация производительности нагруженных веб-систем на Java

Другие средства

• Отладочная печать – служит разработчикам ПО с 60-х годов прошлого века

• Thread stack sampling (kill -QUIT PID)• BTrace – аналог DTrace для JVM• Самостоятельная расстановка вызовов

профилирования в коде (вызовы JAMon, запись данных во внешнее хранилище для постобработки, статистическая предобработка)

Page 14: Оптимизация производительности нагруженных веб-систем на Java

Выбор средств профилирования

• Используйте универсальные средства• Серебряной пули нет• А, поэтому, используйте любые средства• Подумайте об интеграции ваших средств

профилирования со средствами мониторинга системы

• Подумайте о возможности профилирования системы в продакшн режиме

Page 15: Оптимизация производительности нагруженных веб-систем на Java

Нагрузочное тестирование

• Средства создания тестовой нагрузки – ab, siege, JMeter, Tsung

• ab и siege – недостаточно настроек• JMeter – кому-нибудь удавалось создать с

его помощью нагрузку хотя бы в 400 rps с одного хоста?

• Tsung – может работать в распределенном режиме, но довольно капризен

Page 16: Оптимизация производительности нагруженных веб-систем на Java

Случай из жизни 1

• Tomcat, Spring, MySQL, многонодовая конфигурация в Amazon Cloud

• Куплен профайлер• Проблемы под тестовой нагрузкой• Профайлер ничего не показывает

Page 17: Оптимизация производительности нагруженных веб-систем на Java

Брейндамп решения 1

• Попытка подключить VisualVM (практически провалилась – RMI плохо работает через SSH туннель)

• Thread stack sampling в консоли при помощи стандартной утилиты jstack, сброс сэмплов в файл и ручной анализ файла

Page 18: Оптимизация производительности нагруженных веб-систем на Java

Брейндамп 1 – анализ тред стеков

• Много записи на диск (ведутся логи) – изменили уровень логгинга

• Потоки стоят на блокировке при обращении к БД – долго выполняются некоторые из SQL-запросов (сами запросы написаны неоптимально)

• Проблема вообще не в Java!• (зря покупали профайлер)

Page 19: Оптимизация производительности нагруженных веб-систем на Java

Случай из жизни 2

• Приложение, написанное в 2002-м году• Weblogic, сервлеты подключенные без

использования web.xml, Solaris 8, Oracle, JVM 1.2, часть бизнес-логики в хранимых процедурах и другие радости жизни

• Исходного кода приложения нет• Первоначально задачи оптимизации

производительности не было, но мне начали звонить по ночам...

Page 20: Оптимизация производительности нагруженных веб-систем на Java

Брейндамп решения 2

• Сложный путь апдейта JVM до версии 1.5• Сбор данных о потреблении памяти, сбор

данных о поведении GC• Тюнинг Oracle, чтобы он не мешал Java-

приложению• Попытка тюнинга GC (ни к чему не привела)• Разные опции запуска JVM, разные версии JVM• Непонятна корреляция между падениями

системы и внешними событиями

Page 21: Оптимизация производительности нагруженных веб-систем на Java

Брейндамп решения 2 - продолжение

• Включение access log на время в момент проблемы с доступностью

• Корень проблемы – брут-форс подбор логинов и паролей

• Внедрение ehcache и временной блокировки по IP на час после 10 неудачных попыток логина в течение 5 минут

• Нагрузка исчезла• Бывают такие легаси-системы, в которых все

непривычно

Page 22: Оптимизация производительности нагруженных веб-систем на Java

Случай из жизни 3

• Веб-сайт в Рунете с довольно большой нагрузкой

• Resin, JSP, servlets, три физических сервера• RDBMS Firebird• Apache 1.3 как reverse proxy• В моменты пиковой нагрузки проблемы с

производительностью вплоть до недоступности серверов, необходим рестарт

Page 23: Оптимизация производительности нагруженных веб-систем на Java

Брейндамп 3

• Команда консультантов поделилась на две части

• Одна часть – «сисадмины» зачем-то настраивала mod_accel

• Вторая часть пыталась разбираться с Java и Firebird

• Анализ Firebird показал, что с ним все в порядке и улучшить что-либо существенно нельзя

Page 24: Оптимизация производительности нагруженных веб-систем на Java

Брейндамп 3 - продолжение

• Попытка построить тестовое окружение и профилировать приложение под YourKit

• Профайлер не показал узких мест на том шаблоне нагрузки, который был применен для тестирования

• Добавление в код приложения печати отладочной информации в лог

• Несколько падений системы на глазах команды, время восстановления после рестарта по 3.5 часа – разогрев кэшей

Page 25: Оптимизация производительности нагруженных веб-систем на Java

Брейндамп 3 - приложение

• Анализ отладочной информации из лога показал узкое место

• Анализ кода выявил доступ к базе в synchronized блоке

• Сужение области действия synchronized блока (разбили на два блока) привело к уменьшению времени разогрева кэша до нескольких минут

• Используйте lock-free структуры данных• Не используйте Firebird!

Page 26: Оптимизация производительности нагруженных веб-систем на Java

Выводы

• Невозможное возможно• Накапливайте и используйте факты и знания

о вашей системе, не пользуйтесь религиозными представлениями примитивных сообществ

• Сложные и дорогие инструменты часто ничем не лучше простых и бесплатных

Page 27: Оптимизация производительности нагруженных веб-систем на Java

Вопросы?

• • • •

Page 28: Оптимизация производительности нагруженных веб-систем на Java

Спасибо за внимание!

• Alexander Chistyakov, DataArt• [email protected]• http://alexclear.livejournal.com• https://github.com/alexclear• Enjoy IT!