thinkjavakharkiv#1 Шеф, все пропало. Проблемы с production

47
ШЕФ, ВСЕ ПРОПАЛО Проблемы с Production Антон Семаник Владимир Малинин

Upload: vladimir-malinin

Post on 25-Jul-2015

123 views

Category:

Software


7 download

TRANSCRIPT

Page 1: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

ШЕФ, ВСЕ ПРОПАЛОПроблемы с Production

Антон СеманикВладимир Малинин

Page 2: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

О докладчиках

Антон СеманикNix Solutions Ltd.

Java Developer, Group LeadLegacy code fan =)))

Владимир МалининNix Solutions Ltd.

Java Developer, Group Lead

Page 3: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

С чего всё начинается?

Рано или поздно разрабатываемое нами приложение попадает на Production…

И именно в этот момент начинается всё самое интересное:

Другая среда…

Другие нагрузки…

Реальные пользователи…

Page 4: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Проблема:• Приложение регулярно падает• Заказчики бьют тревогу• Сроки поджимают• В чем проблема не понятно• Все пропало!

Page 5: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

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

…надцати мегабайтный файл с логами за последний месяц (если повезёт, то за день).

Мысль о том, что это происходит явно не по нашей вине.

Page 6: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Что же делать в таком случае?Существует как минимум два варианта:

• Поддаться общей панике и идти искать решение в Google, надеясь на удачу;

• Провести детальный анализ приложения в поисках проблемы.

Page 7: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Следуя по пути анализа, нужно:

• Попытаться воспроизвести поведение локально;• Проанализировать логи приложения;• Поискать проблемы в коде;• Посмотреть на работающее приложение изнутри

используя профилировщик;• Собрать статистику потоков / памяти / соединений к

базе.

Page 8: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Какие инструменты нам могут помочь?Профилировщики:• jconsole •VisualVM• Jprofiler•YourKit

Более продвинутые средства:• JavaMelody

Page 9: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Ограничения профилировщиков• Невозможно держать его открытым 24

часа в сутки 7 дней в неделю, не всегда доступны требуемые порты на сервере

• Невозможно предсказать когда в приложении возникнет проблема

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

Page 10: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Рассмотрим проблему на примере реального проекта:С регулярностью ~2 недели с приложением начинались проблемы:

• Статические страницы отдавались сервером без проблем• Все страницы запрашивающие информацию из базы

отдавались сервером как 504 Gateway Timeout

Page 11: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Конфигурация приложения:

Spring 3Hibernate 3.5BoneCP 0.8

СУБД MySQL

Apache tomcat 6 + Nginx proxy

Page 12: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Что нам было нужно:

Мощный но легковесный инструмент для мониторинга и сбора статистики, которым можно использовать на Production

Page 13: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

К чему мы пришли:

В результате поисков был найден инструмент полностью

удовлетворяющий всем требованиям - JavaMelody

Page 14: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Преимущества JavaMelody• Может работать на QA и Production• Легко встраивается в готовое приложение• Позволяет анализировать:

1. Использование памяти2. JDBC соединения и SQL запросы3. HTTP4. MBeans

• Представляет информацию наглядно, в виде графиков

Недостатки JavaMelody• Если приложение упало, то JavaMelody тоже будет недоступен• Графики не всегда информативны• Нельзя указать интервал просмотра статистики менее 1-го дня

Page 15: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Настройка JavaMelodyДобавляем зависимость в pom.xml <dependency> <groupId>net.bull.javamelody</groupId> <artifactId>javamelody-core</artifactId> <version>1.50.0</version> </dependency>

Добавляем фильтр в web.xml <filter> <filter-name>monitoring</filter-name> <filter-class>net.bull.javamelody.MonitoringFilter</filter-class> </filter> <filter-mapping> <filter-name>monitoring</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>net.bull.javamelody.SessionListener</listener-class> </listener>

Добавляем дополнительный конфиг для поддержки Spring: <context-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:net/bull/javamelody/monitoring-spring.xml /WEB-INF/applicationContext.xml </param-value> </context-param>

Page 16: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

На что стоит обратить внимание:

Page 17: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Использование памяти (хорошо):

Page 18: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Использование памяти (плохо):

Page 19: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Открытые JDBC соединения (хорошо):

Page 20: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Открытые JDBC соединения (плохо):

Page 21: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

BoneCP через MBeans:Соединения берутся из pool’a но не возвращаются назад.

Page 22: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Открытые JDBC соединения:На протяжение длительного времени соединения остаются открытыми.

Наблюдается утечка JDBC соединений.

Page 23: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Класс-источник проблемы:

Page 24: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Источник проблемы:Отсутствующая @Transactional аннотация. После её добавления проблема утечки JDBC соединений исчезла.

Page 25: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Проект 2

Page 26: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Конфигурация приложения:

Spring 3Hibernate 3.5BoneCP 0.8

СУБД Postgres

Apache tomcat 6 + Nginx proxy

Page 27: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Проект2

Page 28: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Статистика из JavaMelody

Page 29: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Статистика используемой памяти

Page 30: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Статистика http сессий

Page 31: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
Page 32: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Что же делать дальше?

Пофикси приложение!

Page 33: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

JMeter parameters:

Воспроизвести проблему локально

Page 34: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

ConnectionWatcher

Проблема 1: Незакрытые соединения

Page 35: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Проблема 1: Незакрытые соединения

Page 36: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Проблема1: Незакрытые соединения

Page 37: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Результат работы анализатора логов

Проблема1: Незакрытые соединения

Page 38: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Победа?!

Page 39: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Что, опять?

Page 40: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Статистика используемой памяти

Page 41: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Проблема2: “Тяжелые” запросы

Page 42: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Проблема2: “Тяжелые” запросы

Page 43: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Проблема2: “Тяжелые” запросы

Page 44: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Проблема2: “Тяжелые” запросы

Проанализировать модель данных- на предмет Eager/Lazy fetchType- разбить сложные тяжеловесные запросы на более мелкие/быстрые

- класть в модель только необходимые данные

Page 45: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Пофиксили!

Page 46: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Если беда:

1. Hе паниковать

2. Собрать и проанализировать статистику

3. Проанализировать логи на предмет ошибок.

4. Воспроизвести проблему локально

5. Локализовать и пофиксить проблему

6. Пофиксить попутные баги

Page 47: ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production

Спасибо за внимание!Вопросы?