[Практика] Процессор онлайн заполнен, опыт побега с ведром

Java задняя часть
[Практика] Процессор онлайн заполнен, опыт побега с ведром

Эта статья участвовала в "Проект «Звезда раскопок»”, чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.

предисловие

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

image.png

Этот проект является относительно зрелым продуктом.Сейчас это в основном небольшая модификация в соответствии с потребностями заказчика, поэтому я поручил двум студентам, которые только что закончили обучение, позаботиться об этом.Ситуация зависания происходит несколько раз, и сервер неоднократно перезагружается после 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

image.png

  • Стартовый проект

После того, как все вышеперечисленные шаги выполнены, используйте ./run.sh для завершения запуска проекта, и вы сможете увидеть в логах лог запуска.

определить процесс

После успешной загрузки используйте командуtop -cПроверьте использование системных ресурсов и продолжайте использовать букву P в верхнем регистре, чтобы отсортировать и найти процесс, который занимает больше всего ЦП. Как видно из рисунка ниже, текущий проект занимает всего 0,7% ЦП,

image.png

  • Вызов тестового интерфейса

Если вызывается тестовый интерфейс с бесконечным циклом, после вызова тестового интерфейса проект напрямую занимает 107,3% ЦП, который почти застрял на взрыве, и команды почти не отвечают.Конечно, это может быть сервер Brother Hua слишком жарко.

image.png

Откройте журнал, мы видим, что журнал постоянно чистит [Брат ты лучший], из-за удобства тестирования здесь используется метод круговой печати лога.В реальных проектах много-много непонятных проблем, которые не отражены в логе, и определить источник проблемы можно только по другие средства.

执行结果6.gif

найти нить

Процесс с проблемой можно определить командой top -c.Далее необходимо узнать в каком потоке процесса возникла проблема.Это определение относительно просто.Достаточно ввести команду:top -Hp PID. Например, в этом примере введите top -Hp 9828.

image.png

9877Этот поток временно использует 87,5% ресурсов ЦП, затем можно определить, что поток имеет проблему.Пока что мы завершили определение местоположения проблемного потока, и следующий шаг - определить, где поток находится в коде .

код таргетинга

В моментальном снимке процесса в jvm поток отображается в шестнадцатеричном формате, поэтому нам нужно преобразовать PID [9877] в шестнадцатеричный, используя онлайн-инструмент преобразования в браузере или команду [printf "%x\n" 9877] , можно преобразовать.

printf "%x\n" PID

image.png

В этом примере преобразованным шестнадцатеричным числом является [2698].Затем используйте команду jstack, чтобы найти конкретный код проблемы, как показано на рисунке ниже, и, наконец, найдите метод testHashMap DemoController.

PID процесса jstack | grep thread hex -c отображать номер строки

image.png

Суммировать

Очень полезно находить онлайн-проблемы окружающей среды на работе. Например, если пользователь сообщает о проблеме, ваш начальник потерял некоторые конфигурации сервера для вас, поэтому вы можете найти их. Если вы не знаете, на что смотреть, и стесняетесь спросить, все в порядке? Будет очень неловко.... Конечно, кроме рабочих нужд, такого рода вопросы часто задают на собеседованиях. Беглый ответ может заставить интервьюера подумать, что вы это не вопрос для бэктеста, но я им действительно пользовался Я могу получить на двести баксов больше к своей зарплате.