Статьи

Устранение неполадок приложения Java на пути Шерлока Холмса

Устраните неполадки в вашем Java-приложении, используя способ Шерлока Холмса.
Устранение неполадок при сбое приложения Java может быть тесно связано с типичным расследованием места преступления. Я читал несколько классических историй о Шерлоке Холмсе в последнее время дома, пытаясь разгадать загадки Java-приложений в офисе.

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

Вам также может понравиться: Устранение неполадок приложений Java с Arthas

Я недавно присоединился к проекту, который работает уже несколько лет. Я расскажу некоторые факты о проекте, прежде чем углубляться в проблему.

  • Эта система имела API, который принимает различные виды запросов от POS-устройств.
  • Пока он обрабатывает запросы, он отправляет некоторые запросы сторонним системам.
  • Он имел систему баз данных для хранения продукта и информации о заказе.
  • В последнее время мы включили в систему еще несколько предприятий, поэтому мы получили больше трафика в систему.
  • Несмотря на то, что система выделяет так много функциональных возможностей, она еще не была настроена на производительность.

1) Тайна случается, и она не оставляет никакой подсказки

В одно прекрасное утро наша система не смогла ответить ни на один из запросов API, и мы получили жалобы от клиентов. Затем нам пришлось перезапустить систему, чтобы восстановить систему в нормальное состояние. У нас не было много следов, чтобы понять, почему система перешла в такое странное состояние. Мы получили только несколько следов, которых было недостаточно для определения причины. Теперь у нас есть тайна в наших руках, но нет никаких доказательств, чтобы привести нас.

Мы смогли собрать следующую информацию во время инцидента.

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

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

  • Журналы запросов приложений были просмотрены много раз, но не повезло.

Мы не смогли определить причину с помощью вышеуказанной ограниченной информации. Поэтому мы сосредоточились на поиске решения с помощью догадок. Мы думали увеличить память кучи.

2) Ловушка

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

1) Jstack  — этот инструмент помогает нам принять threaddump. Threaddumps даст четкое представление о состоянии потока вместе со связанной трассировкой стека в данный момент времени.

Поскольку наше Java-приложение занимало почти 100% процессорного времени, нам было интересно узнать, что делали наши потоки в то время. Обычно целесообразно брать 3-4 таких дутпа с интервалом в 5 секунд. Важно, чтобы принять threaddump, когда система испытывает проблему.

2) Jmap — histo —  это дает снимок памяти с гистограммой объекта, который дает число объектов, созданных в куче. Если в нашей системе есть утечки памяти, эта гистограмма может легко указать на виновника.

Так мы устроили ловушку для нашего неизвестного злодея.

3) Злодей снова посещает, поэтому инцидент повторяется

Снова возникла та же проблема, и на этот раз нам дали короткий срок для сбора следов. Поэтому они взяли одну threaddump и одну jmap-histo перед перезагрузкой системы. Мы подготовили сводку состояний потоков, используя вечнозеленые команды оболочки Linux. Сводка команд оболочки показала, что треть потоков приложений застряла при попытке поместить свои входящие команды в очередь запросов.

4) Время исследовать доказательства

Я покажу, как я обработал поток-дамп.

О. Сначала я искал наши местные ссылки на названия пакетов. Наш местный пакет начинается с «com.gotham»


Оболочка