web-dev-qa-db-ja.com

シェルプロンプトが表示されるまで数十秒かかるのはなぜですか?

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

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

30
jacobbaer

ここではかなり多くのことが起こります。答えのほとんどはシェルのマニュアルにありますが、それらは通常非常に長くて斜めなので、...

問題は、いくつかの問題のうちの1つに要約できます。

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

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

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

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

しかし、それはこれらのどれでもないかもしれません。プロンプトを表示する直前に、驚くほど多くのことが起こります。

33
Falcon Momot

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

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

ローカルログオンでも同じことが発生する場合は、構成したLDAPサーバーまたはDNSサーバーが遅いか応答していないかどうかを確認してください。

22
sCiphre

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

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

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

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

set -xは、実行されたすべてのシェルコマンドのデバッグをオンにします。 PS4変数は、デバッグの表示方法を制御します。特にこの場合、dateを使用してタイムスタンプを追加します。

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

6
Digital Trauma

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回目にログインしますか? (キャッシュされているものの方がはるかに高速かどうかを確認するため。)

3
Peter Cordes

これはほとんどの場合 DNSリクエストのタイムアウトです。

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

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

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

2
Klaus Hartnegg