1

私はコンピューティング クラスタに取り組んでいますが、非常に奇妙な /usr/bin/env の動作をしています...つまり、動作が非常に遅いのです。ヘッド ノード:

$ time /usr/bin/env which
<which output>

real    0m0.025s
user    0m0.001s
sys     0m0.001s

計算ノードで:

$ qsub -I                                                                                                                
qsub: waiting for job 176620.scyld.localdomain to start
qsub: job 176620.scyld.localdomain ready

-bash-3.2$ time which
<which output>

real    0m0.003s
user    0m0.000s
sys     0m0.003s

-bash-3.2$ time /usr/bin/env /usr/bin/which

<which output>
real    0m0.003s
user    0m0.000s
sys     0m0.003s


-bash-3.2$ time /usr/bin/env which
<which output>

real    5m0.003s
user    0m0.001s
sys     0m0.001s

ps axはこれを報告します:

12884 pts/3    S+     0:00 /usr/bin/env which

使用状況バナーを印刷するのに 5 分かかります。なぜこれが起こるのでしょうか?

編集1:

追加情報:

-bash-3.2$ type -a which
which is /usr/bin/which
-bash-3.2$ file /usr/bin/which
/usr/bin/which: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped
-bash-3.2$ echo $PATH
/bin:/usr/bin:/home/gusev/.rvm/bin:/home/gusev/bin

編集 2

私はしたstraceのです/usr/bin/env whichが、それは行き詰まります

execve("/bin/which", ["which"], [/* 47 vars */]

今平野を走っている

/bin/which

もスタックしますが、このファイルは存在しません:

-bash-3.2$ ls /bin/which
ls: /bin/which: No such file or directory

/binNFS 経由でマウントされます。

-bash-3.2$ mount | grep bin
10.54.0.1:/bin on /bin type nfs (nolock,nonfatal)
10.54.0.1:/usr/bin on /usr/bin type nfs (nolock,nonfatal)

したがって、これはネットワークの問題かもしれません...

編集3:

which which完全に正常に動作します:

-bash-3.2$ time which which
/usr/bin/which

real    0m0.002s
user    0m0.000s
sys     0m0.002s

の出力strace -e trace=execve /usr/bin/env which

execve("/usr/bin/env", ["/usr/bin/env", "which"], [/* 47 vars */]) = 0
execve("/bin/which", ["which"], [/* 47 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/bin/which", ["which"], [/* 47 vars */]) = 0
<which output>

編集4:

ハング時間は常に正確に 5 分です。ある種のデフォルト値のタイムアウトのようです。

4

3 に答える 3

0

問題を引き起こしているのは、whichコマンドではなくコマンドである可能性があります。env

非常に異なる結果が表示されているため、

time /usr/bin/env /usr/bin/which

対。

time /usr/bin/env which

、おそらくまたはに別のwhichコマンドがある可能性があります。何を教えてくれますか?あなたはどのように見えますか?$PATH/usr/local/bin$HOME/bintype -a which$PATH

whichシェルスクリプトまたは実行可能ファイルのいずれかであることに注意してください。シェル スクリプトの場合は、そのコピーを取得して追加set -xし、その動作を確認してください。

于 2012-12-17T09:38:13.207 に答える
0

この問題は、以前の質問execveで説明した問題と同様に、計算メモに戻るのに時間がかかることが原因のようです。パス内のディレクトリが NFS マウントされているという事実が一因である可能性があります。

を介してコマンドを実行すると、が を繰り返し呼び出して、各パスにコマンドが存在するかどうかプローブされていることがstraceわかります。envexecve

[me@home]$ echo $PATH
/home/me/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/me/work/bin

[me@home]$ strace -e execve /usr/bin/env which
execve("/usr/bin/env", ["/usr/bin/env", "which"], [/* 53 vars */]) = 0
execve("/home/me/bin/which", ["which"], [/* 53 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/lib/lightdm/lightdm/which", ["which"], [/* 53 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/local/sbin/which", ["which"], [/* 53 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/local/bin/which", ["which"], [/* 53 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/sbin/which", ["which"], [/* 53 vars */]) = -1 ENOENT (No such file or directory)
execve("/usr/bin/which", ["which"], [/* 53 vars */]) = 0

上記のコメントで確認したようにwhich which、同じ問題は発生しません。これは、パスをプローブするstat代わりに使用するためです。execve

[me@home]$ strace -e execve,stat /usr/bin/which which
execve("/usr/bin/which", ["/usr/bin/which", "which"], [/* 53 vars */]) = 0
stat("/home/me", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/home/me/bin/which", 0x7fff79ae8760) = -1 ENOENT (No such file or directory)
stat("/usr/lib/lightdm/lightdm/which", 0x7fff79ae8760) = -1 ENOENT (No such file or directory)
stat("/usr/local/sbin/which", 0x7fff79ae8760) = -1 ENOENT (No such file or directory)
stat("/usr/local/bin/which", 0x7fff79ae8760) = -1 ENOENT (No such file or directory)
stat("/usr/sbin/which", 0x7fff79ae8760) = -1 ENOENT (No such file or directory)
stat("/usr/bin/which", {st_mode=S_IFREG|0755, st_size=946, ...}) = 0
/usr/bin/which

残念ながら、根本的な問題に対処するための提案を提供することはできませんが、それまでの間、次の方法で問題を回避できます。

  1. envコマンドを解決する代わりに、コマンドへのフル パスを使用します。
  2. 本当に を使用したい場合はenv、可能な限り並べ替えて$PATH、検索を最小限に抑えてください。例えば:

    PATH=/usr/bin:$PATH /usr/bin/env which   # place most likely path first
    
于 2012-12-17T11:00:41.133 に答える
0

PATH最後に、非常に長い環境変数があることがわかりました。execveそして、NFS共有の呼び出しに何らかの影響を与えた可能性があります。

そのため、一連の実行可能ファイルを単一のディレクトリに移動し、多くのエントリをPATH1 つのディレクトリに置き換えました。それ以来、私は何の問題も経験していません。

于 2013-01-28T10:17:04.323 に答える