поиск проблемы
Вот в чем дело.В последнее время проект, отвечающий за Xiaomazai, планируется обновить в 2:00 утра. Несколько дней назад Miss Test провела стресс-тест на сайте и наблюдала за различными показателями, такими как ЦП, память, загрузка, RT и QPS сервиса.
Во время стресс-теста женщина-испытатель обнаружила, что у одного из наших интерфейсов после увеличения числа запросов в секунду до 400 резко возросла загрузка ЦП.
Я больше не здесьCPU
,内存
,load
,RT
,QPS
Я буду вдаваться в подробности, ведь если какой-то из этих пунктов будет обсуждаться, статья может быть не закончена. Маленькая милашка, заинтересованная в углубленном исследовании, может проверить это самостоятельно.
Здесь я толькоQPS
иCPU利用率
Сделайте краткий обзор.
❝Частота запросов QPS в секунду, QPS — это мера того, сколько трафика обрабатывает конкретный сервер запросов в течение заданного времени. Чем выше QPS, тем больше трафика обрабатывает сервер в данный момент времени.
❞
❝Загрузка ЦП используется для описания использования ЦП, что указывает на ситуацию, когда ЦП занят в течение определенного периода времени. Чем выше коэффициент использования, тем больше программ машина запускает в это время, и наоборот.
❞
Зная эти два основных момента, давайте посмотрим, как я это позиционирую.
выявить проблему
После проверки обратной связи младшей сестры по этой проблеме, я вошел на сервер, сделал следующее:
1. Найдите процесс
Войдите на сервер и выполните команду top, чтобы проверить загрузку ЦП:
$top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
44529 root 20 0 4289m 874m 13312 S 123.0 10.9 10:39.73 java
top
Команда для просмотра ранжирования всех процессов, занимающих ЦП системы.Это распространенный инструмент анализа производительности в Linux.Он может отображать состояние занятости ресурсов каждого процесса в системе в режиме реального времени, подобно диспетчеру задач Windows.
Давайте посмотрим, что представляют собой эти индикаторы:
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
COMMAND — 进程名称(命令名/命令行)
выполнивtop
Команда, я увидел, что использование процессора процесса Java с процессом ID 44529 достигла 123%. Он может в основном располагаться, что наше приложение Java вызывает использование целого сервера CPU всего сервера.
2. Позиционирующая нить
Конечно, Java является однопроцессным и многопоточным, поэтому я посмотрел на использование ЦП каждым потоком в процессе Java с PID = 44529, а также использовал команду top:
$top -Hp 44529
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
44580 root 20 0 4289m 874m 13312 S 16.2 10.9 3:02.96 java
выполнивtop -Hp 44529
Команда, я обнаружил, что в процессе 44529 поток с идентификатором 44580 занимает больше всего ЦП.
3. Код позиционирования
С помощью команды top я обнаружил конкретный поток, вызывающий высокую загрузку ЦП, а затем я должен посмотреть, в какой строке кода возникла проблема.
Сначала я преобразовал поток 44580 в шестнадцатеричный:
$printf %x 44580
ae24
Далее, в соответствии с стеком журнала в шестнадцатеричном значении для печати представления запроса по положению потока проживает. и черезjstack
Команда для просмотра информации о стеке:
$jstack 44529 |grep -A 200 ae24
"System Clock" #28 daemon prio=5 os_prio=0 tid=0x00007efc19e8e800 nid=0xae24 waiting on condition [0x00007efbe0d91000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrentC.TimeUnit.sleep(TimeUnit.java:386)
at com.*.order.Controller.OrderController.detail(OrderController.java:37) //业务代码阻塞点
В приведенном выше коде мы ясно видим, что может быть проблема в строке 37 OrderController.java.
Потом я нашел в проекте 37-ю строчку OrderController.java, и после тщательного анализа обнаружил, что из-за моей невнимательности в коде есть логическая лазейка. После модификации и рефакторинга проблема решена.
Суммировать
Выше описан весь процесс устранения неполадок. В основном используются:top
,printf
,jstack
и другие инструкции.
-
использовать
top
Команда для просмотра PID процесса, который в данный момент занимает высокий процессор; -
Просмотрите PID потока текущего процесса, потребляющего ресурсы:
top -Hp PID
-
Преобразуйте PID потока в шестнадцатеричный формат и запросите напечатанный журнал стека в соответствии с шестнадцатеричным значением, чтобы проверить местоположение метода, в котором находится поток.
-
пройти через
jstack
Команда, проверьте информацию о стеке, этот шаг в основном способен обнаружить большинство проблем.
Разгромить
Проект вышел в онлайн в 2:00 сегодня утром. Вчера вечером я работал сверхурочно. Я просто поспал два часа, когда утром пришел домой. Тестирование края). Поэтому я встал и написал эту статью, которую можно считать записью первой сверхурочной работы в 2020 году.
Наконец, спасибо за чтение. Цель статьи — зафиксировать и поделиться, если в статье есть явные ошибки, пожалуйста, указывайте на них, и мы будем учиться вместе в ходе обсуждения. Большое тебе спасибо !
Если вы считаете, что эта статья была для вас полезной, то поставьте ей лайк, ваша поддержка и поддержка являются для меня движущей силой двигаться вперед~
Добро пожаловать, чтобы обратить внимание на мой публичный аккаунт WeChat [маленький программист], давайте вместе обсудим код и жизнь.