サーバーにSSHで接続した後(またはMacでターミナルを開いた後でも)、ログインバナーがすぐに印刷されますが、シェルプロンプトが表示されるまで10秒から1分かかります。その後、パフォーマンスは良好で、ネットワーク遅延は異常ではありません。
これは、計算が難しく、メモリを大量に消費する、またはIOを大量に消費するタスクのようには見えません。何十億ものCPUサイクルすべてで何をしているのでしょうか?
.bash_history
か?
サーバーにSSHで接続した後(またはMacでターミナルを開いた後でも)、ログインバナーがすぐに印刷されますが、シェルプロンプトが表示されるまで10秒から1分かかります。その後、パフォーマンスは良好で、ネットワーク遅延は異常ではありません。
これは、計算が難しく、メモリを大量に消費する、またはIOを大量に消費するタスクのようには見えません。何十億ものCPUサイクルすべてで何をしているのでしょうか?
.bash_history
か?
回答:
ここではかなりのことが起こり得ます。シェルのマニュアルでほとんどの答えを見つけることができますが、それらは通常信じられないほど長く斜めです。
あなたの問題は、いくつかの事柄のうちの1つに要約される可能性があります。
プロファイルまたはbashrcに高価なものがある場合は、それらをトリミングすることを検討してください。
プロファイルまたはbashrcが(プロンプトなどを設定するために)逆DNSルックアップを使用する場合、DNSを修正するか、代わりにホスト名を使用します。
初期化中、シェルは多くのファイルを開きます。システムの負荷が高い場合、ここに表示されることがよくあります。
バナーが事前認証の場合、実際には認証(pam、LDAPなど)も遅い可能性があります。
ただし、これらのいずれでもない可能性があります。プロンプトを表示する直前に驚くべき量のことが起こります!
1つの可能性(他の回答で説明されている)は、SSHセッション自体をセットアップするプロセスで時間が失われることです。
もう1つの方法は、SSHセッションの確立後にリモートマシンで実行されているシェルスタートアップスクリプトに時間がかかっていることです(壊れたネットワークマウントにアクセスしようとしている可能性があります)。この2番目の可能性を次のようにデバッグできます。
の上部に一時的に次を追加します~/.bash_profile
:
set -x
PS4='+ $(date "+%s.%N")\011 '
これset -x
により、実行されるすべてのシェルコマンドのデバッグがオンになります。PS4
特に私たちが使用して、この場合には-そのデバッグが提示される方法変数コントロールdate
タイムスタンプを追加します。
次に、デバッグ出力のタイムスタンプを分析して、起動スクリプト内のどのコマンドに時間がかかりすぎているかを確認できます。
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回目にログインしますか?(ものがキャッシュされるとき、それがずっと速いかどうか見るために。)
ほとんどの場合、これはDNS要求のタイムアウトです。
原因:サーバーは、クライアントのIPアドレスを使用して逆DNSルックアップを試行し、応答を取得しません。AがBに接続すると、BはAのIPアドレスを名前に変換しようとします。
回避策:サーバーのホストファイルにクライアントのIPアドレスと名前を入力します。
解決策:すべてのホストをDNSサーバーに認識させます。
ssh -v -v -v
そして、ur_shell -x
慎重なデバッグ手順かもしれません。