web-dev-qa-db-ja.com

たくさんのファイルがあるNFSディレクトリでlsコマンドの割り込みが遅いのはなぜですか?

NFS上のファイルがたくさんあるディレクトリで気づいた

ls *

次に、Ctrl-Cを押すと、lsが戻るまでにしばらく(たとえば20秒)かかる場合があります。

どうして? lsコマンドを修正して応答性を高めることはできますか?

3
steve

ls *を実行すると、最初に発生するのは、シェルが現在のディレクトリのリストを取得することです。ディレクトリが巨大でサーバーが遅い場合、これにはしばらく時間がかかる可能性があります。

シェルは、現在のディレクトリ内のファイル名のリストを取得すると、そのリストを並べ替え(ネットワークの相互作用と比較して非常に高速です)、lsを呼び出します。 lsコマンドは、各ファイルを順番に検索し、そのメタデータを取得して( stat 呼び出し)、それがディレクトリであるかどうかを確認します。ファイルがディレクトリの場合、lsは、ディレクトリ自体ではなく、その内容を一覧表示します。

押すと Ctrl+C、これは現在のNFS操作を中断しません。システムが一貫性のない状態になる可能性があるため、ファイルシステムの操作をどこでも中断することはできません。ファイルを読み取っても、アクセス時間が更新される可能性があります。ほとんどの場合、ファイルに対する基本的な読み取りまたは書き込み操作は、人間の標準では瞬時に行われますが、NFSは例外であり、特に低速のネットワーク上に大量のデータがある場合は例外です。

したがって、 Ctrl+C のみ有効になります:

  • シェルが現在ファイル名のリストを生成している場合、そのリストが完全に取得されたとき。
  • lsが開始され、現在ファイルに関するメタデータを取得している場合、サーバーがメタデータを提供するとき。
  • lsが開始され、現在ディレクトリをリストしている場合、リストが完全に取得されたとき、または少なくともそのチャンクの後に。

lsコマンドのせいではありません(まだ開始されていない可能性があります)。それはシェルのせいでもありません:それはNFSのせいです。 NFSはかなり遅いです。

仮説:NFSを介してディレクトリをトラバースすると、一度に予想されるよりも多くのデータが投機的にロードされます。サーバー側でIOが多すぎるため、1回のNFS呼び出しに20秒以上かかる場合があります。intrオプションを指定してマウントすると、Ctrl-Cで実行中の呼び出しが中断される可能性があります。

Googleは、READDIRPLUSを含むNFS呼び出しのリストを見つけました。基本的に、各ファイルのreaddir +次にstat。また、getacl。言い換えると、基本的にls -lを実行するNFS呼び出しが1つあります(特定の数のファイルに対して)。ファイルごとに個別のstatリクエストを送信する代わりに。

Nfsreaddirplusのグーグル-これは非常にもっともらしいようです。最初の結果は(ペイウォールの)バグレポートです。

RHEL6:NFSv3 READDIRPLUSは、NFSディレクトリでのグロビングを大幅に遅くし、パフォーマンスの問題を引き起こします

  • 標準マウントのRHEL 6.2では、3000を超えるディレクトリを含むディレクトリのグロブは218秒(約4分)かかります。
  • Nordirplusオプションを使用してreaddirplus呼び出しの使用を無効にする同じディレクトリのマウント、同じディレクトリのglobはわずか1.7秒かかります

興味深い調査のようです。


編集:あなたの例ls *もグロビングの使用であることに注意してください。 ls .はグロブを回避します。それが特定の質問に違いをもたらす場合、グロブがlsではなくシェルで行われるためである可能性があり、Ctrl-Cの処理方法に影響を与える可能性があります。それが問題だとは思いませんが、興味深い質問だと思いました。

4
sourcejedi

NFSディレクトリでlsコマンドが遅くなる理由はいくつか考えられます。

  • ディレクトリが自動マウントされない可能性があります。
  • マシンが同じネットワーク内にない可能性があります。

ただし、これは[〜#〜] nfs [〜#〜]に固有ではなく、より一般的な考え方です。並べ替えなしでファイルを一覧表示するには、並べ替えずにファイルを一覧表示するls -Uを試すことができます。 lsのmanページから、

-Uはソートしません。エントリーをディレクトリー順にリストします。 one_per_line形式 ‘-1’と組み合わせると、ファイルがすぐに表示され、メモリの制限はありません。

並べ替えを避けるためにいくつかのバリエーションがあります。システムのmanページをチェックして、以下のオプションのいずれかを試すことができます。

ls -f
ls -U
ls --sort=none
0
Ramesh

Lsのエイリアスがあると速度が低下する可能性がある場合は、\ ls -altr OR lsの他のオプションでも\ lsを試してください。

0
user248656