Почему для получения приглашения оболочки требуется десятки секунд?

30

Это своего рода обычное явление, когда после SSHing к серверу (или даже открытия терминала на моем Mac) баннер входа в систему печатается немедленно, но для появления приглашения оболочки требуется ~ 10 секунд в минуту. После этого производительность в порядке, и задержка в сети не является чем-то необычным.

Это не похоже на вычислительно сложную, интенсивную память или IO-задачу. Что это делает со всеми этими миллиардами циклов ЦП?

jacobbaer
источник
8
ssh -v -v -vи ur_shell -xможет быть разумным шагом отладки.
thrig
2
Много ли у тебя строк .bash_history?
Касперд
2
Посмотрите на ваш .profile и связанные с ним файлы (извините, не уверен, какую оболочку вы используете) и временно удалите, чтобы убедиться, что это улучшит ситуацию. У вас, вероятно, есть команда (команды), которые истекают.
TheFiddler выигрывает
3
В качестве альтернативы предложению Moby Disk, все еще одинаково медленно, если вы запускаете саму оболочку изнутри оболочки? Если он медленный при (повторном) соединении, но быстрый при запуске второй оболочки из существующего, подключенного сеанса, это скажет вам, что не сама оболочка вызывает медлительность; если он одинаково медленный в двух ситуациях, то что-то, что делает оболочка при запуске, занимает много времени. В любом случае вы узнаете, какой аспект «от нуля до приглашения оболочки» медленный.
резюме
2
Часто это попытка аутентификации GSSAPI (которая, если вы не магазин Kerberos, скорее всего, совершенно бесполезна). В других случаях это обратный поиск DNS.
Чарльз Даффи

Ответы:

33

Здесь может происходить несколько вещей. Вы можете найти большинство ответов в руководстве по вашей оболочке, но они обычно невероятно длинные и косые, так что ...

Скорее всего, ваша проблема сводится к одной из нескольких вещей.

Если в вашем профиле или bashrc есть дорогие вещи, рассмотрите возможность их обрезки.

Если в вашем профиле или bashrc используется обратный поиск DNS (для установки приглашения или чего-то еще), исправьте DNS или используйте вместо него имя хоста.

Оболочки открывают много файлов, между прочим, во время инициализации. Если загрузка системы высока, она часто будет отображаться здесь.

Если баннер является предварительной аутентификацией, это может быть также медленная аутентификация (pam, LDAP и т. Д.).

Впрочем, может быть, ничего из этого. Удивительное количество вещей происходит прямо перед отображением подсказки!

Сокол Момот
источник
1
Еще один блок, который я видел в течение длительного времени, - это попытка аутентификации GSSAPI (если она не отключена ни на клиенте SSH, ни на конфигурации сервера). Использование полнофункционального инструмента трассировки, такого как sysdig, вероятно, является лучшей серебряной пулей, доступной для решения этой проблемы.
Чарльз Даффи
+1 Тщательный ответ. На этом сайте есть хорошая блок-схема для входов в систему, файлов, которые они выполняют / источник, и другой информации.
Тим С.
15
+1. Для меня 99% времени это обратный поиск DNS.
mpontillo
@Mike: то же самое здесь - я бы рекомендовал начать с этого, так как это легко исправить. Это было 100% в моем случае.
WoJ
22

Вероятно, это либо ожидание DNS, либо попытка аутентификации через LDAP или что-то подобное.

Попробуйте добавить UseDNS noв / etc / ssh / sshd_config

Если это также происходит при локальном входе в систему, проверьте, работают ли настроенные вами серверы LDAP или DNS медленные или не отвечают.

sCiphre
источник
6

Одна возможность (покрытая другими ответами) состоит в том, что процесс установки самого сеанса SSH - это то, где время потеряно.

Другой альтернативой является то, что ваши сценарии запуска оболочки, запущенные на удаленном компьютере после установления сеанса SSH, содержат что-то, что занимает много времени (возможно, при попытке получить доступ к неработающему сетевому подключению). Вы можете отладить эту вторую возможность следующим образом:

Временно добавьте следующее в начало вашего ~/.bash_profile:

set -x
PS4='+ $(date "+%s.%N")\011 '

В set -xочереди на некоторые отладки для каждой команды оболочки выполняется. В PS4контроля переменных , как представляется , что отладка - именно в этом случае мы будем использовать , dateчтобы добавить метки.

Затем вы можете проанализировать временные метки выходных данных отладки, чтобы увидеть, какие команды в ваших сценариях запуска занимают слишком много времени.

Цифровая травма
источник
1
Истинно, если и только если проблема возникает после открытия удаленного сеанса. Многие из возможных причин во время рукопожатия SSH и аутентификации.
Чарльз Даффи
2
Намного улучшилось :)
Чарльз Даффи
3

Если это сервер Ubuntu, настройки входа в систему по умолчанию проверяют, обновляются ли какие-либо пакеты при каждом запуске оболочки входа. Если списки пакетов отсутствуют в дисковом кеше, это может занять секунду или две даже на быстром бездействующем рабочем столе.

$ ssh localhost 
Welcome to Ubuntu 15.04 (GNU/Linux 3.19.0-26-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

*** System restart required ***
Last login: Sat Sep 12 01:38:38 2015 from localhost

Чтобы сгенерировать это сообщение «требуется перезагрузка», он должен был проверить, что работающее в данный момент ядро ​​не является ядром по умолчанию, установленным в данный момент. (т.е. было ядро, и я еще не перезагружался.) Он также напечатает количество доступных обновлений безопасности, если они есть.

Я думаю, что это главное замедление входа в Ubuntu, которое было введено недавно.

Если не так, то ваш ~/.bash_profile/ ~/.bashrcможет быть проблема.

Вы пытались войти на сервер от себя ( ssh localhost)? Или сразу во второй раз заходишь? (Чтобы увидеть, намного ли быстрее, когда материал кэшируется.)

Питер Кордес
источник
2

В большинстве случаев это тайм-аут запроса DNS.

Причина. Сервер пытается выполнить обратный поиск DNS с использованием IP-адреса клиента и не получает ответа. Если A подключается к B, B пытается преобразовать IP-адрес A в имя.

Обходной путь: введите IP-адрес и имя клиента в файл hosts на сервере.

Решение: сделать все хосты известными DNS-серверу.

Клаус Хартнегг
источник