Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ШЕФ, ВСЕ ПРОПАЛО 
Проблемы с Production 
Антон Семаник 
Владимир Малинин
О докладчиках 
Антон Семаник 
Nix Solutions Ltd. 
Java Developer, Group Lead 
Legacy code fan =))) 
Владимир Малинин 
Nix ...
С чего всё начинается? 
Рано или поздно разрабатываемое нами приложение 
попадает на Production… 
И именно в этот момент 
...
Проблема: 
• Приложение регулярно падает 
• Заказчики бьют тревогу 
• Сроки поджимают 
• В чем проблема не понятно 
• Все ...
Что мы имеем на входе? 
Обычно не очень детальное описание проблемы от заказчиков, 
но с требованием поправить и поскорее....
Что же делать в таком случае? 
Существует как минимум два варианта: 
• Поддаться общей панике и идти искать решение в Goog...
Следуя по пути анализа, нужно: 
• Попытаться воспроизвести поведение локально; 
• Проанализировать логи приложения; 
• Пои...
Какие инструменты нам могут 
помочь? 
Профилировщики: 
• jconsole 
• VisualVM 
• Jprofiler 
• YourKit 
Более продвинутые с...
Ограничения профилировщиков 
• Невозможно держать его открытым 24 
часа в сутки 7 дней в неделю, не всегда 
доступны требу...
Рассмотрим проблему на примере 
реального проекта: 
С регулярностью ~2 недели с приложением начинались 
проблемы: 
• Стати...
Конфигурация приложения: 
Spring 3 
Hibernate 3.5 
BoneCP 0.8 
СУБД MySQL 
Apache tomcat 6 + Nginx proxy
Что нам было нужно: 
Мощный но легковесный инструмент для мониторинга и 
сбора статистики, которым можно использовать на 
...
К чему мы пришли: 
В результате поисков был найден инструмент полностью 
удовлетворяющий всем требованиям - JavaMelody
Преимущества JavaMelody 
• Может работать на QA и Production 
• Легко встраивается в готовое приложение 
• Позволяет анали...
Настройка JavaMelody 
Добавляем зависимость в pom.xml 
<dependency> 
<groupId>net.bull.javamelody</groupId> 
<artifactId>j...
На что стоит обратить внимание:
Использование памяти (хорошо):
Использование памяти (плохо):
Открытые JDBC соединения (хорошо):
Открытые JDBC соединения (плохо):
BoneCP через MBeans: 
Соединения берутся из pool’a но не возвращаются назад.
Открытые JDBC соединения: 
На протяжение длительного времени соединения остаются открытыми. 
Наблюдается утечка JDBC соеди...
Класс-источник проблемы:
Источник проблемы: 
Отсутствующая @Transactional аннотация. После её 
добавления проблема утечки JDBC соединений исчезла.
Проект 2
Конфигурация приложения: 
Spring 3 
Hibernate 3.5 
BoneCP 0.8 
СУБД Postgres 
Apache tomcat 6 + Nginx proxy
Проект2
Статистика из JavaMelody
Статистика используемой 
памяти
Статистика http сессий
Что же делать дальше? 
Пофикси приложение!
Воспроизвести проблему локально 
JMeter parameters:
Проблема 1: Незакрытые соединения 
ConnectionWatcher
Проблема 1: Незакрытые соединения
Проблема1: Незакрытые соединения
Проблема1: Незакрытые соединения 
Результат работы анализатора логов
Победа?!
Что, опять?
Статистика используемой 
памяти
Проблема2: “Тяжелые” запросы
Проблема2: “Тяжелые” запросы
Проблема2: “Тяжелые” запросы
Проблема2: “Тяжелые” запросы 
Проанализировать модель данных 
- на предмет Eager/Lazy fetchType 
- разбить сложные тяжелов...
Пофиксили!
Если беда: 
1. Hе паниковать 
2. Собрать и проанализировать статистику 
3. Проанализировать логи на предмет ошибок. 
4. Во...
Спасибо за внимание! 
Вопросы?
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
Upcoming SlideShare
Loading in …5
×

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

588 views

Published on

Если приложение регулярно падает, заказчики нервничают, сроки поджимают и не понятно в чём проблема, не стоит паниковать. Мы расскажем вам, что делать в такой ситуации и покажем, как мы выходили из сложившейся ситуации. В докладе на примере двух реальных проектов рассматриваются проблемы, которые могут возникать с Web приложениями на production environment’ах, пути их решения и инструменты, которые для этого могут быть использованы. Подробно будет рассмотрена настройка и использование JavaMelody. Докладчики: Владимир Малинин и Антон Семаник (Nix Solutions)

Published in: Software
  • Be the first to comment

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

  1. 1. ШЕФ, ВСЕ ПРОПАЛО Проблемы с Production Антон Семаник Владимир Малинин
  2. 2. О докладчиках Антон Семаник Nix Solutions Ltd. Java Developer, Group Lead Legacy code fan =))) Владимир Малинин Nix Solutions Ltd. Java Developer, Group Lead
  3. 3. С чего всё начинается? Рано или поздно разрабатываемое нами приложение попадает на Production… И именно в этот момент начинается всё самое интересное: Другая среда… Другие нагрузки… Реальные пользователи…
  4. 4. Проблема: • Приложение регулярно падает • Заказчики бьют тревогу • Сроки поджимают • В чем проблема не понятно • Все пропало!
  5. 5. Что мы имеем на входе? Обычно не очень детальное описание проблемы от заказчиков, но с требованием поправить и поскорее. …надцати мегабайтный файл с логами за последний месяц (если повезёт, то за день). Мысль о том, что это происходит явно не по нашей вине.
  6. 6. Что же делать в таком случае? Существует как минимум два варианта: • Поддаться общей панике и идти искать решение в Google, надеясь на удачу; • Провести детальный анализ приложения в поисках проблемы.
  7. 7. Следуя по пути анализа, нужно: • Попытаться воспроизвести поведение локально; • Проанализировать логи приложения; • Поискать проблемы в коде; • Посмотреть на работающее приложение изнутри используя профилировщик; • Собрать статистику потоков / памяти / соединений к базе.
  8. 8. Какие инструменты нам могут помочь? Профилировщики: • jconsole • VisualVM • Jprofiler • YourKit Более продвинутые средства: • JavaMelody
  9. 9. Ограничения профилировщиков • Невозможно держать его открытым 24 часа в сутки 7 дней в неделю, не всегда доступны требуемые порты на сервере • Невозможно предсказать когда в приложении возникнет проблема • Для сбора статистики нужно изобретать дополнительные грабли
  10. 10. Рассмотрим проблему на примере реального проекта: С регулярностью ~2 недели с приложением начинались проблемы: • Статические страницы отдавались сервером без проблем • Все страницы запрашивающие информацию из базы отдавались сервером как 504 Gateway Timeout
  11. 11. Конфигурация приложения: Spring 3 Hibernate 3.5 BoneCP 0.8 СУБД MySQL Apache tomcat 6 + Nginx proxy
  12. 12. Что нам было нужно: Мощный но легковесный инструмент для мониторинга и сбора статистики, которым можно использовать на Production
  13. 13. К чему мы пришли: В результате поисков был найден инструмент полностью удовлетворяющий всем требованиям - JavaMelody
  14. 14. Преимущества JavaMelody • Может работать на QA и Production • Легко встраивается в готовое приложение • Позволяет анализировать: 1. Использование памяти 2. JDBC соединения и SQL запросы 3. HTTP 4. MBeans • Представляет информацию наглядно, в виде графиков Недостатки JavaMelody • Если приложение упало, то JavaMelody тоже будет недоступен • Графики не всегда информативны • Нельзя указать интервал просмотра статистики менее 1-го дня
  15. 15. Настройка 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>
  16. 16. На что стоит обратить внимание:
  17. 17. Использование памяти (хорошо):
  18. 18. Использование памяти (плохо):
  19. 19. Открытые JDBC соединения (хорошо):
  20. 20. Открытые JDBC соединения (плохо):
  21. 21. BoneCP через MBeans: Соединения берутся из pool’a но не возвращаются назад.
  22. 22. Открытые JDBC соединения: На протяжение длительного времени соединения остаются открытыми. Наблюдается утечка JDBC соединений.
  23. 23. Класс-источник проблемы:
  24. 24. Источник проблемы: Отсутствующая @Transactional аннотация. После её добавления проблема утечки JDBC соединений исчезла.
  25. 25. Проект 2
  26. 26. Конфигурация приложения: Spring 3 Hibernate 3.5 BoneCP 0.8 СУБД Postgres Apache tomcat 6 + Nginx proxy
  27. 27. Проект2
  28. 28. Статистика из JavaMelody
  29. 29. Статистика используемой памяти
  30. 30. Статистика http сессий
  31. 31. Что же делать дальше? Пофикси приложение!
  32. 32. Воспроизвести проблему локально JMeter parameters:
  33. 33. Проблема 1: Незакрытые соединения ConnectionWatcher
  34. 34. Проблема 1: Незакрытые соединения
  35. 35. Проблема1: Незакрытые соединения
  36. 36. Проблема1: Незакрытые соединения Результат работы анализатора логов
  37. 37. Победа?!
  38. 38. Что, опять?
  39. 39. Статистика используемой памяти
  40. 40. Проблема2: “Тяжелые” запросы
  41. 41. Проблема2: “Тяжелые” запросы
  42. 42. Проблема2: “Тяжелые” запросы
  43. 43. Проблема2: “Тяжелые” запросы Проанализировать модель данных - на предмет Eager/Lazy fetchType - разбить сложные тяжеловесные запросы на более мелкие/быстрые - класть в модель только необходимые данные
  44. 44. Пофиксили!
  45. 45. Если беда: 1. Hе паниковать 2. Собрать и проанализировать статистику 3. Проанализировать логи на предмет ошибок. 4. Воспроизвести проблему локально 5. Локализовать и пофиксить проблему 6. Пофиксить попутные баги
  46. 46. Спасибо за внимание! Вопросы?

×