シェルプロンプトを表示するのに数十秒かかるのはなぜですか?


30

サーバーにSSHで接続した後(またはMacでターミナルを開いた後でも)、ログインバナーがすぐに印刷されますが、シェルプロンプトが表示されるまで10秒から1分かかります。その後、パフォーマンスは良好で、ネットワーク遅延は異常ではありません。

これは、計算が難しく、メモリを大量に消費する、またはIOを大量に消費するタスクのようには見えません。何十億ものCPUサイクルすべてで何をしているのでしょうか?


8
ssh -v -v -vそして、ur_shell -x慎重なデバッグ手順かもしれません。
-thrig

2
あなたの行がたくさんあります.bash_historyか?
カスペルド

2
.profileと関連ファイルを確認し(使用しているシェルがわからないのでごめんなさい)、一時的に削除して、改善されるかどうかを確認します。おそらくタイムアウトしているコマンドがあります。
TheFiddlerWins

3
Moby Diskの提案の代わりに、シェル内からシェル自体を起動した場合も同様に遅いですか?(再)接続時に遅いが、既存の接続されたセッション内から2番目のシェルを開始するときに速い場合、遅いのはシェル自体ではないことがわかります。2つの状況で同じように遅い場合、起動時にシェルが行うことは多くの時間がかかります。いずれにせよ、「ゼロからシェルプロンプトまで」のどの側面が遅いかについて学習します。
CVn

2
多くの場合、これは発生しようとしているGSSAPI認証です(Kerberosショップでない場合は、おそらくまったく役に立たないでしょう)。それ以外の場合は、DNS逆引き参照です。
チャールズダフィー

回答:


33

ここではかなりのことが起こり得ます。シェルのマニュアルでほとんどの答えを見つけることができますが、それらは通常信じられないほど長く斜めです。

あなたの問題は、いくつかの事柄のうちの1つに要約される可能性があります。

プロファイルまたはbashrcに高価なものがある場合は、それらをトリミングすることを検討してください。

プロファイルまたはbashrcが(プロンプトなどを設定するために)逆DNSルックアップを使用する場合、DNSを修正するか、代わりにホスト名を使用します。

初期化中、シェルは多くのファイルを開きます。システムの負荷が高い場合、ここに表示されることがよくあります。

バナーが事前認証の場合、実際には認証(pam、LDAPなど)も遅い可能性があります。

ただし、これらのいずれでもない可能性があります。プロンプトを表示する直前に驚くべき量のことが起こります!


1
私がかなり長い間ブロックしているのを見たもう1つは、GSSAPI認証の試みです(SSHクライアントまたはサーバー設定のいずれかでオフにされていない場合)。sysdigなどのフルシステムトレースツールを使用することは、おそらく、この種の相互懸念の問題の根底に到達するための最良の特効薬です。
チャールズダフィー

+1完全な答え。このサイトには、ログイン、実行/ソースするファイル、およびその他の情報についての素晴らしいフローチャートがあります。
ティムS.

15
+1。私にとっては99%の時間は逆DNSルックアップです。
mpontillo

@マイク:ここでも同じです-修正が簡単なので、これから始めることをお勧めします。私の場合は100%でした。
WoJ

22

DNSを待機しているか、LDAPなどを介して認証しようとしている可能性があります。

UseDNS no/ etc / ssh / sshd_config に追加してみてください

ローカルログオンでも実行する場合は、設定したLDAPサーバーまたはDNSサーバーが遅いか、応答しないかどうかを確認します。


6

1つの可能性(他の回答で説明されている)は、SSHセッション自体をセットアップするプロセスで時間が失われることです。

もう1つの方法は、SSHセッションの確立後にリモートマシンで実行されているシェルスタートアップスクリプトに時間がかかっていることです(壊れたネットワークマウントにアクセスしようとしている可能性があります)。この2番目の可能性を次のようにデバッグできます。

の上部に一時的に次を追加します~/.bash_profile

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

これset -xにより、実行されるすべてのシェルコマンドのデバッグがオンになります。PS4特に私たちが使用して、この場合には-そのデバッグが提示される方法変数コントロールdateタイムスタンプを追加します。

次に、デバッグ出力のタイムスタンプを分析して、起動スクリプト内のどのコマンドに時間がかかりすぎているかを確認できます。


1
リモートセッションが開かれた後に問題が発生した場合にのみTrue。考えられる原因の多くは、SSHハンドシェイクおよび認証中です。
チャールズダフィー

2
大幅に改善されました。:)
チャールズダフィー

3

Ubuntuサーバーの場合、デフォルトのログインセットアップは、ログインシェルが実行されるたびに更新可能なパッケージがあるかどうかを確認します。パッケージリストがディスクキャッシュにない場合、アイドル状態の速いデスクトップでも1〜2秒かかります。

$ 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回目にログインしますか?(ものがキャッシュされるとき、それがずっと速いかどうか見るために。)


2

ほとんどの場合、これはDNS要求のタイムアウトです。

原因:サーバーは、クライアントのIPアドレスを使用して逆DNSルックアップを試行し、応答を取得しません。AがBに接続すると、BはAのIPアドレスを名前に変換しようとします。

回避策:サーバーのホストファイルにクライアントのIPアドレスと名前を入力します。

解決策:すべてのホストをDNSサーバーに認識させます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.