предисловие
Несколько дней назад в тестовой среде я столкнулся с очень странным иdubbo
По связанным вопросам я искал в Интернете и впоследствии не нашел похожих сообщений или статей, поэтому у меня есть эта статья.
Надеюсь, будет полезно друзьям, которые не сталкивались или сталкиваются.
Феномен
Феномен такой, однажды тест передислоцируется в тестовую средуdubbo
Откройте для себя приложения во время подачи заявки“启动不起来”
.
Но через несколько часов он может медленно восстанавливаться самостоятельно, и может оказывать внешнееdubbo
Служить.
Но на самом деле, после моего последующего расследования, я обнаружил, что дело было не в том, что оно не могло быть запущено в начале, а в том, что скорость запуска была очень низкой, поэтому приложение предоставляло внешние услуги только после того, как оно было запущено для долгое время.
И это так медленно, что стоит2 个小时
.
Одним из результатов является то, что тест полностью боится выпускать проверку в тестовой среде, и каждая функция проверяется, чтобы исправить одну.bug
Придется ждать два часа, кто выдержит.
И после многих наблюдений он занимает около двух часов для приложения для запуска каждый раз.
попробуй решить
Последнее испытание не выдержит, я могу позволить себе только это.“事故报告撰写专家”
приди и посмотри.
Это не имело особого значения, когда я узнал о феномене проблемы:
Не думайте об этом, не потому ли это, что основной поток блокируется, давайте посмотрим, не может ли во время инициализации подключиться база данных, Zookeeper и т. д., что приводит к блокировке ------- Опыт многих аварий обращение говорит мне .
Так что я вернул дело к проверке и попросил его сначала найти операцию и техническое обслуживание и не трогать меня, если в этом нет крайней необходимости.Touch fish
🐳.
Рано утром следующего дня, чтобы увидеть, как студенты проверят микробланки, я был готов принять“膜拜大佬👍”
На ответ получил "В сети все нормально, ее никто не трогал, а если не разрешится, то чиркнет 🤬".
Ну, это невозможно обмануть.
Во-первых, направление устранения неполадок такого рода не должно быть неверным, то есть блокируется основной поток, а что вызвало блокировку, вы не можете догадаться, как раньше.
Я перезапускаю приложение и используюjstack pid
Распечатайте снимок потока на терминал и потяните его прямо до конца, чтобы увидетьmain
Что делает нить?
Первые несколько снимков были нормальными:
нагрузкаSpring
----> подключитьZookeeper
---> подключитьRedis
, выполняются последовательно без блокировки.
Через какое-то время заявка не подошла, я сноваjstack
После получения следующей информации:
Перевернуть исходный код
Я ждал десять минут и еще много разjstack
Информация, полученная из снимка, одинакова.
Как показано на рисунке, видно, что основная нить застряла в определенном методе даббо.ServiceConfig.java
в строке 303.
Итак, я нашел исходный код здесь:
Проще говоря, логика здесь заключается в том, чтобы получить локальныйIP
зарегистрировать его наZookeeper
используется в других служебных вызовах.
Идя дальше вниз, он застрял, как в стекеInet4AddressImpl.getLocalHostName
место.
но этоnative
метод, наше приложение вообще не может вмешиваться, и последнее явление заключается в том, что вызов этого локального метода занимает очень много времени.
Так что эта проблема здесь как бы заблокирована, и делать особо нечего.
окончательное решение
Поскольку это нативный метод, к самому приложению он не имеет никакого отношения (правда, эта проблема возникла внезапно).
Это проблема с самим сервером?native
Метод заключается в том, чтобы получить роднойhostname
, это соответствует этомуhostname
Это имеет значение.
Это проверено на моем собственном сервере Alibaba Cloud, реальная тестовая среда не имеет такого названия.
получить серверhostname
попробуй сноваping
этоhostname
, происходит что-то странное:
Команда застрянет на некоторое время (около десятков секунд) в начале, а затем выведетhostname
соответствующийip
и соответствующую задержку.
и когда я прямоping
этоip
Когда вывод последнего смогла быстро реагировать.
Наконец, я попытался добавить соответствующую конфигурацию хоста в файл конфигурации /etc/hosts:
xx.xx.xx.xx(ip) hostname
сноваping hostname
Эффект такой же прямой, какping ip
то же.
Поэтому я снова перезапустил приложение, и все было в порядке.
Суммировать
Наконец, попробуйте проанализировать причину этой проблемы в соответствии с измененным содержимым:
- когда
Dubbo
При запуске получаю локальный ip, именно через серверhostname
отdns
Сервер возвращает текущий IP-адрес. - так как
dns
Существует сетевая проблема между сервером или локальным сервером и DNS-сервером, из-за чего этот процесс занимает больше времени (предположение). - Я локально
host
После конфигурации в файле это эквивалентно наличию локального кеша, причем сначала берется локально настроенный ip, избегая процесса взаимодействия с dns сервером, поэтому скорость улучшается.
Несмотря на то, что проблема решена, остается несколько вопросов:
Во-первых, почему иDNS
Взаимодействие с сервером будет настолько медленным, даже если и медленным, то не 2 часа на возврат как приложение.Я тут не очень четко разобрался.Друзья с соответствующим опытом могут оставить сообщение для обсуждения.
Второй вопрос заключается в том, можно ли улучшить надежность Dubbo, если он полагается на внешние ресурсы, хотя, по моим оценкам, несколько человек столкнулись с этой проблемой.
Для такого рода проблем, которые не запускались успешно в течение длительного времени, вы можете добавить подсказку, такую как прямое создание исключения для выхода из программы и сообщение разработчику возможной причины проблемы для облегчения устранения неполадок.
Ваши лайки и репост - лучшая поддержка для меня