Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
предисловие
После последнего обновления проекта система будет казаться суперзависшей в неопределенном сценарии.Когда вы включите сервер, вы обнаружите, что ЦП завис.После нескольких перезапусков явление зависания все еще будет происходить.Вот-вот убежит с ведром.
Этот проект является относительно зрелым продуктом.Сейчас это в основном небольшая модификация в соответствии с потребностями заказчика, поэтому я поручил двум студентам, которые только что закончили обучение, позаботиться об этом.Ситуация зависания происходит несколько раз, и сервер неоднократно перезагружается после n раз мне говорили об этой проблеме.После моей небольшой операции я успешно победил этих двух маленьких вееров.Если будет необходимость, я их упакую и отправлю подальше.
Далее мы продемонстрируем этот процесс позиционирования на следующем небольшом примере.
тестовый код
Во-первых, создайте новую демонстрацию, чтобы продемонстрировать ситуацию, когда ЦП заполнен.Код также очень прост.Это бесконечный цикл while, который бесконечно печатает журнал.
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author :huage
* @date :Created in 2021/10/25
* @description: 测试范例
*/
@Slf4j
@RestController
public class DemoController2 {
@RequestMapping("test")
public void testHashMap(){
while (true){
log.info("花哥你最棒");
}
}
}
Развертывание пакета
Также очень удобно упаковывать с идеей, просто нажмите «упаковать», чтобы сделать это.Здесь брат Хуа использует метод упаковки jar для упаковки.
На этапе упаковки Brother Hua поделился двумя общими сценариями (сценариями запуска/остановки), которые определенно могут использоваться небольшими партнерами, желающими выполнить развертывание.
- сценарий запуска
export NAME=jar名称.jar
export CLASSPATH=.:jar包路径/:${NAME}
export JAVA_OPS="-server -DappName=程序名称(对应停止脚本中名称)"
echo ${CLASSPATH}
nohup java ${JAVA_OPS} -cp ${CLASSPATH} org.springframework.boot.loader.JarLauncher >/dev/null 2>&1 &
- остановить скрипт
ps -ef | grep -v grep | grep java | grep 启动脚本中DappName名称 | awk '{print "kill -9 "$2}' | sh
- Стартовый проект
После того, как все вышеперечисленные шаги выполнены, используйте ./run.sh для завершения запуска проекта, и вы сможете увидеть в логах лог запуска.
определить процесс
После успешной загрузки используйте командуtop -cПроверьте использование системных ресурсов и продолжайте использовать букву P в верхнем регистре, чтобы отсортировать и найти процесс, который занимает больше всего ЦП. Как видно из рисунка ниже, текущий проект занимает всего 0,7% ЦП,
- Вызов тестового интерфейса
Если вызывается тестовый интерфейс с бесконечным циклом, после вызова тестового интерфейса проект напрямую занимает 107,3% ЦП, который почти застрял на взрыве, и команды почти не отвечают.Конечно, это может быть сервер Brother Hua слишком жарко.
Откройте журнал, мы видим, что журнал постоянно чистит [Брат ты лучший], из-за удобства тестирования здесь используется метод круговой печати лога.В реальных проектах много-много непонятных проблем, которые не отражены в логе, и определить источник проблемы можно только по другие средства.
найти нить
Процесс с проблемой можно определить командой top -c.Далее необходимо узнать в каком потоке процесса возникла проблема.Это определение относительно просто.Достаточно ввести команду:top -Hp PID. Например, в этом примере введите top -Hp 9828.
9877Этот поток временно использует 87,5% ресурсов ЦП, затем можно определить, что поток имеет проблему.Пока что мы завершили определение местоположения проблемного потока, и следующий шаг - определить, где поток находится в коде .
код таргетинга
В моментальном снимке процесса в jvm поток отображается в шестнадцатеричном формате, поэтому нам нужно преобразовать PID [9877] в шестнадцатеричный, используя онлайн-инструмент преобразования в браузере или команду [printf "%x\n" 9877] , можно преобразовать.
printf "%x\n" PID
В этом примере преобразованным шестнадцатеричным числом является [2698].Затем используйте команду jstack, чтобы найти конкретный код проблемы, как показано на рисунке ниже, и, наконец, найдите метод testHashMap DemoController.
PID процесса jstack | grep thread hex -c отображать номер строки
Суммировать
Очень полезно находить онлайн-проблемы окружающей среды на работе. Например, если пользователь сообщает о проблеме, ваш начальник потерял некоторые конфигурации сервера для вас, поэтому вы можете найти их. Если вы не знаете, на что смотреть, и стесняетесь спросить, все в порядке? Будет очень неловко.... Конечно, кроме рабочих нужд, такого рода вопросы часто задают на собеседованиях. Беглый ответ может заставить интервьюера подумать, что вы это не вопрос для бэктеста, но я им действительно пользовался Я могу получить на двести баксов больше к своей зарплате.