Статьи

Больше никаких утечек: обнаружение утечек памяти в облачных приложениях с помощью Plumbr и Stackato

[Эта статья была написана  Джоном Ветериллом]

На JavaOne я имел удовольствие встретиться с Никитой Сальников-Тарновским, основателем Plumbr, захватывающего стартапа из Эстонии. Никита и его команда создали инструмент, который, по моему мнению, следует отнести к категории «существенных» для разработчиков облачных вычислений, которые создают приложения на основе JVM. В этой статье описывается Plumbr и показано, как быстро включить обнаружение утечек памяти Plumbr в любом облачном приложении Java или JVM, развернутом в Stackato.

Зачем избегать утечек?

Сначала поговорим о утечках. Утечки памяти: 

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

Так что утечки плохи, но они также очень распространены. По словам Никиты, 47% приложений Java содержат утечки памяти.

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

Обнаружение утечек

Инструменты и методы для обнаружения и предотвращения утечек существуют уже давно. По необходимости облачному разработчику необходим набор инструментов для борьбы с утечками, которые бывают разных форм, в том числе:

Статические анализаторы кода

Анализатор кода Klocwork  или  JetBrain «на лету»  входит в комплект поставки IntelliJ IDEA.

Возможности платформы

Сборка мусора Java (GC) часто рассматривается как возможность платформы, которая может помочь уменьшить утечки памяти за счет автоматизации выпуска объектов, на которые нет ссылок. Но GC не серебряная пуля. Фактически можно утверждать, что GC отдаляет разработчика от размышлений о утечках, которые затем вызывают утечки. Конечно, Java GC не предотвращает утечки, что является причиной таких инструментов, как Plumbr.

Языковые конструкции и идиомы

Рассмотрим этот фрагмент кода Ruby:

File.open(“textfile”, ‘w’) {|f| f.write(“hi”) }

Это гарантирует, что выделенный ресурс (в данном случае файл) будет немедленно и автоматически освобожден, когда его ссылка выйдет из области видимости. Clojure и многие другие языки предоставляют аналогичные конструкции, которые помогают разработчикам «помнить» о закрытии или освобождении ресурсов.

Правила и практика кодирования

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

Тестирование фреймворков, инструментов и библиотек

Доступно множество инструментов и библиотек, чтобы помочь обнаружить и минимизировать утечки. jMeter и apache bench — это удобные способы стресс-тестирования приложения, позволяющие устранить любые утечки, которые могут быть скрыты.

Инструменты мониторинга, библиотеки инструментовки

Такие продукты, как New Relic, Nagios, Riemann и такие объекты, как JMX, имеют неоценимое значение для мониторинга утечек и производительности.

Инструменты разработчика

Популярный профилировщик YourKit может помочь обнаружить и устранить утечки в коде Java и .NET.

логирование

Ведение журнала, старый режим ожидания, может помочь обнаружить и устранить утечки. Чтобы эффективно использовать ведение журналов в облаке, бесценны возможности и инструменты агрегации журналов, такие как Logyard, PaaS и Loggly.

Требуется сборка

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

Не так, Plumbr. Этот удивительный инструмент требует так мало, но обеспечивает так много. Он устанавливается за считанные секунды и с легкостью будет контролировать любое приложение на базе Java или JVM. При обнаружении утечки он уведомляет развертывателя, предоставляя общую или подробную информацию о утечке. Я расскажу о шагах по использованию Plumbr со Stackato ниже, но сначала рассмотрим внутреннюю работу.

Как работает Plumbr?

Plumbr использует удобный, но не широко используемый  пакет  java.lang.instrument , который настраивает байт-код скомпилированных приложений Java и JVM, чтобы обеспечить инструментарий и измерение различных характеристик приложений.

Plumbr использует этот пакет для наблюдения за жизненным циклом всех объектов, созданных приложением, в том числе когда и где они были созданы, когда они были освобождены GC, и их характеристики потребления памяти с течением времени. Но Plumbr — это гораздо больше, чем просто отслеживание объектов и памяти: у них также есть сложная облачная аналитическая система, которая со временем узнает сигнатуру и шаблоны общих утечек в больших классах приложений, а затем использует эту информацию для дальнейшего уточнения распознавания утечек. , Другими словами, Plumbr поправляется со временем.

После обнаружения утечки они предоставляют подробный анализ первопричины утечки с указанием способов ее устранения.
Никита дал мне понять, что Plumbr не показывает ложных негативов: то есть Plumbr обнаружит все утечки. Он также может сообщать об утечках в коде, где увеличение использования памяти является заданным (то есть ложных срабатываний), но они обычно легко распознаются разработчиком приложения. Кроме того, как уже упоминалось выше, Plumbr со временем становится умнее, поэтому, по-видимому, количество ложных срабатываний уменьшается.

Обнаружение утечек в облаке с помощью Stackato

Облачные приложения, которые масштабируются, особенно чувствительны к утечкам, и поэтому разработчики облачных приложений захотят использовать любые имеющиеся в их распоряжении инструменты для обнаружения и обнаружения любых утечек, прежде чем они нарушат работу приложения.

К счастью, этот процесс тривиально прост с Plumbr и Stackato. Вот шаги. Пожалуйста, попробуйте это дома.

  1. Зарегистрируйтесь на  портале Plumbr . Требуются только две вещи: адрес электронной почты и ваш пароль.
  2. Загрузите агент. Важной частью этого является файл «plumbr.jar», который включает в себя ваши определенные автоматически сгенерированные ключи API Plumbr.
  3. Это один из нескольких способов, которыми Plumbr стремится упростить жизнь разработчику. Многие другие API и службы используют ключи API, но для их использования необходимо скопировать / вставить ключ в сценарий или приложение. С Plumbr автоматически генерирует ваш ключ при регистрации и встраивает этот ключ в jarfile, так что создание ключа полностью бесшовно и скрыто.
  4. Добавьте jarfile из шага 2 в структуру каталогов вашего приложения.
  5. Как и для любого приложения, развернутого в Stackato, создайте файл stackato.yml и добавьте эту директиву, чтобы включить Plumbr.
env: JAVA_OPTS: -javaagent:plumbr.jar
6. Теперь разверните свое приложение в Stackato с
stackato push -n
  1. Это все, что нужно сделать. Теперь приложение, работающее в Stackato, сообщает Plumbr о потреблении памяти. Чтобы увидеть это:Отчет об утечке PlumbrPlumbr Dashboard
  2. Перезагрузите страницу портала в вашем браузере, и вы увидите сообщения о любых утечках

Частный Plumbr

Stackato — это частный PaaS , что означает, что он работает где угодно, будь то локально за брандмауэром, или в общедоступном облаке, например HPCloud, или в этом случае на ноутбуке. По этой причине многие предприятия выбирают Private PaaS: они не хотят или не могут отправить приложения или конфиденциальные данные в публичное облако.

Для этих людей Plumbr, как описано выше, не является жизнеспособным решением, поскольку не имеет смысла отправлять подробные сведения о потреблении памяти, какими бы загадочными они ни были, в стороннюю облачную службу.

К счастью, у Plumbr есть и это: они предлагают «размещенную» версию Plumbr, где весь стек Plumbr работает в помещении, за брандмауэром.

Резюме

Инструменты облачной разработки развиваются и развиваются с беспрецедентной скоростью. Одна из самых больших проблем — идти в ногу со временем и понимать все последние события, это бесконечная задача, которая может потребовать значительных затрат времени. Но это инвестиция, которая окупается, особенно в случае Plumbr со Stackato, где временные вложения так низки, а доходность так высока.

Если вы являетесь разработчиком облака Java или JVM, посмотрите, как  Plumbr  упрощает обнаружение утечек в облаке, и загрузите микрокласло Stackato,  чтобы попробовать его самостоятельно.


Изображение предоставлено 
Меган @ Flickr