Назад | Перейти на главную страницу

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

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

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

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

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

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

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

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

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

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

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

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

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

Одна из возможностей (охватываемая другими ответами) заключается в том, что время теряется в процессе настройки самого сеанса SSH.

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

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

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

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

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

Если это сервер 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)? Или сразу второй раз авторизоваться? (Чтобы увидеть, намного ли это быстрее при кешировании.)

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

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

Решение: введите IP-адрес и имя клиента в файл hosts на сервере.

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