тревога
Во время встречи будильник Dingding звучал без перерыва, в то же время сотрудники рынка сообщили, что клиент не может войти в систему жалоб и сообщил об ошибке 504. Проверьте информацию о тревоге на DingTalk.Несколько узлов сервисного сервера сообщают, что ЦП превышает порог тревоги, достигая 100%.
Поспешите с совещания, войдите на сервер с помощью SSH и используйтеtop
Команда для просмотра, использование ЦП нескольких процессов Java достигает 180% и 190% Эти процессы Java соответствуют нескольким подам (или контейнерам) одного и того же бизнес-сервиса.
позиция
-
использовать
docker stats
Команда для проверки использования ресурсов контейнера на этом узле и использования ее для контейнера с высокой загрузкой ЦП.docker exec -it <容器ID> bash
Войти. -
выполнить внутри контейнера
top
Команда для просмотра, найдите идентификатор процесса, который занимает много ресурсов ЦП, используйтеtop -Hp <进程ID>
Найдите идентификатор потока с высокой загрузкой ЦП. -
использовать
jstack <进程ID> > jstack.txt
Распечатайте стек потока процесса. -
чтобы выйти из контейнера, используйте
docker cp <容器ID>:/usr/local/tomcat/jstack.txt ./
Команда копирует файл jstack на хост для удобного просмотра. После получения информации о jstack быстро перезапустите службу, чтобы она снова стала доступной. -
Используйте идентификатор потока с высокой загрузкой ЦП в 2
pringf '%x\n' <线程ID>
Команда преобразует идентификатор потока в шестнадцатеричный формат. Предполагая, что идентификатор потока равен 133, вы получите 85 в шестнадцатеричном формате. Найдите в файле jstack.txtnid=0x85
Позиция — это информация о стеке выполнения потока, занимающего высокий ЦП. Как показано ниже,
- Уточните у коллег, что есть функция экспорта 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, как показано на рисунке
Выявлено, что количество Полных ГК достигло более 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 ОА…) открыть, как показано на рисунке
Если файл дампа относительно большой, необходимо увеличить значение -Xmx в файле конфигурации MemoryAnalyzer.ini.
Обнаружено, что объекты char[], String занимают больше всего памяти.Вы можете просмотреть эталонные объекты, щелкнув правой кнопкой мыши, но вы не можете понять, почему, когда вы щелкнете по нему, и попадете на страницу отчета об утечке памяти, как показано на фигура
Эта страница подсчитывает занятость памяти кучи и дает предполагаемую точку утечки.Щелкните ссылку "see stacktrace" на рисунке выше, чтобы перейти на страницу стека потока.
Знакомая картина по-прежнему связана с экспортом в excel: слишком много данных приводит к переполнению памяти. . . Так что GC часто, поэтому CPU взрывается. Корень все тот же.
Суммировать
В этой статье используется фактический боевой процесс работы со 100% ЦП онлайн-службы в качестве примера, чтобы проиллюстрировать общий метод обработки для высокой загрузки ЦП или переполнения памяти сервера при столкновении со службами Java.Я надеюсь предоставить ссылку для вам, чтобы найти подобные проблемы в Интернете. В то же время при разработке и реализации функций необходимо учитывать более далеко идущие задачи.Нельзя останавливаться на решении текущего сценария.Вам необходимо учитывать, применима ли еще ваша реализация, когда объем данных продолжает увеличиваться. Как говорится, младшие программисты решают текущие проблемы, программисты среднего уровня решают проблемы за два года, а старшие программисты решают проблемы за пять лет, ^_^.
[Пожалуйста, укажите источник] Автор: песня дождя Добро пожаловать на официальный аккаунт автора: Halfway Rain Song, смотрите другие технические статьи о галантерейных товарах.