Запомните процесс обработки процессора онлайн-сервиса на 100%

Java

тревога

Во время встречи будильник Dingding звучал без перерыва, в то же время сотрудники рынка сообщили, что клиент не может войти в систему жалоб и сообщил об ошибке 504. Проверьте информацию о тревоге на DingTalk.Несколько узлов сервисного сервера сообщают, что ЦП превышает порог тревоги, достигая 100%.

Поспешите с совещания, войдите на сервер с помощью SSH и используйтеtopКоманда для просмотра, использование ЦП нескольких процессов Java достигает 180% и 190% Эти процессы Java соответствуют нескольким подам (или контейнерам) одного и того же бизнес-сервиса.

позиция

  1. использоватьdocker statsКоманда для проверки использования ресурсов контейнера на этом узле и использования ее для контейнера с высокой загрузкой ЦП.docker exec -it <容器ID> bashВойти.

  2. выполнить внутри контейнераtopКоманда для просмотра, найдите идентификатор процесса, который занимает много ресурсов ЦП, используйтеtop -Hp <进程ID>Найдите идентификатор потока с высокой загрузкой ЦП.

  3. использоватьjstack <进程ID> > jstack.txtРаспечатайте стек потока процесса.

  4. чтобы выйти из контейнера, используйтеdocker cp <容器ID>:/usr/local/tomcat/jstack.txt ./Команда копирует файл jstack на хост для удобного просмотра. После получения информации о jstack быстро перезапустите службу, чтобы она снова стала доступной.

  5. Используйте идентификатор потока с высокой загрузкой ЦП в 2pringf '%x\n' <线程ID>Команда преобразует идентификатор потока в шестнадцатеричный формат. Предполагая, что идентификатор потока равен 133, вы получите 85 в шестнадцатеричном формате. Найдите в файле jstack.txtnid=0x85Позиция — это информация о стеке выполнения потока, занимающего высокий ЦП. Как показано ниже,

jstack

  1. Уточните у коллег, что есть функция экспорта excel с использованием фрейма, и нет листания и ограничений при экспорте excel! ! ! Глядя на запись SQL-запроса, функция экспорта экспортирует 50w фрагментов данных за раз, и каждый фрагмент данных необходимо преобразовать и вычислить.Что еще хуже, оператор долгое время не отвечал после экспорта, поэтому он непрерывно нажимал и инициировал более 10 минут в течение нескольких минут экспорт запросов. . . Итак, ЦП был заполнен, служба дала сбой, и я тоже. .

решить

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

Отправить

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

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007fa114020800 nid=0x10 runnable 

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007fa114022000 nid=0x11 runnable 

использовать командуjstat -gcutil <进程ID> 2000 10Проверьте положение GC, как показано на рисунке

jstat

Выявлено, что количество Полных ГК достигло более 1000 раз, и оно продолжает увеличиваться.При этом были заняты район Эдем и район Старый (можно также использоватьjmap -heap <进程ID>Проверяем занятость каждой области памяти кучи), используем jmap для дампа использования памяти,

jmap -dump:format=b,file=./jmap.dump 13

чтобы выйти из контейнера, используйтеdocker cp <容器ID>:/usr/local/tomcat/jmap.dump ./Скопируйте файл дампа в каталог хоста, загрузите его локально и используйте MemoryAnalyzer (адрес загрузки:woohoo.eclipse.org/toilet/down ОА…) открыть, как показано на рисунке

jmap-mat

Если файл дампа относительно большой, необходимо увеличить значение -Xmx в файле конфигурации MemoryAnalyzer.ini.

Обнаружено, что объекты char[], String занимают больше всего памяти.Вы можете просмотреть эталонные объекты, щелкнув правой кнопкой мыши, но вы не можете понять, почему, когда вы щелкнете по нему, и попадете на страницу отчета об утечке памяти, как показано на фигура

mat-leak-suspects

Эта страница подсчитывает занятость памяти кучи и дает предполагаемую точку утечки.Щелкните ссылку "see stacktrace" на рисунке выше, чтобы перейти на страницу стека потока.

mat-thread-stack

Знакомая картина по-прежнему связана с экспортом в excel: слишком много данных приводит к переполнению памяти. . . Так что GC часто, поэтому CPU взрывается. Корень все тот же.

Суммировать

В этой статье используется фактический боевой процесс работы со 100% ЦП онлайн-службы в качестве примера, чтобы проиллюстрировать общий метод обработки для высокой загрузки ЦП или переполнения памяти сервера при столкновении со службами Java.Я надеюсь предоставить ссылку для вам, чтобы найти подобные проблемы в Интернете. В то же время при разработке и реализации функций необходимо учитывать более далеко идущие задачи.Нельзя останавливаться на решении текущего сценария.Вам необходимо учитывать, применима ли еще ваша реализация, когда объем данных продолжает увеличиваться. Как говорится, младшие программисты решают текущие проблемы, программисты среднего уровня решают проблемы за два года, а старшие программисты решают проблемы за пять лет, ^_^.


[Пожалуйста, укажите источник] Автор: песня дождя Добро пожаловать на официальный аккаунт автора: Halfway Rain Song, смотрите другие технические статьи о галантерейных товарах.qrcode