NFS上のファイルがたくさんあるディレクトリで気づきました
ls *
次に、Ctrl-Cを押すと、lsが戻るまでにしばらく(たとえば20秒)かかる場合があります。
なんで? lsコマンドを修正して応答性を高めることはできますか?
承認された回答:
ls *
を実行すると 、最初に発生するのは、シェルが現在のディレクトリのリストを取得することです。ディレクトリが巨大でサーバーが遅い場合、これにはしばらく時間がかかる可能性があります。
シェルは、現在のディレクトリ内のファイルの名前のリストを取得すると、そのリストを並べ替え(ネットワークの相互作用と比較して非常に高速です)、ls
を呼び出します。 。 ls
コマンドは各ファイルを順番に検索し、そのメタデータを取得します(stat
呼び出し)それがディレクトリであるかどうかを確認します。ファイルがディレクトリの場合、ls
ディレクトリ自体ではなく、その内容を一覧表示します。
Ctrlを押したとき + C 、これは現在のNFS操作を中断しません。システムが一貫性のない状態になる可能性があるため、ファイルシステムの操作をどこでも中断することはできません。ファイルを読み取るだけでも、アクセス時間が更新される可能性があります。ほとんどの場合、ファイルに対する基本的な読み取りまたは書き込み操作は、人間の標準では瞬時に行われますが、NFSは例外であり、特に低速のネットワーク上に大量のデータがある場合は例外です。
したがって、 Ctrlを押します + C 有効になるのは次のとおりです:
- シェルが現在ファイル名のリストを生成している場合、そのリストが完全に取得されたとき。
-
ls
の場合 サーバーがメタデータを提供するときに、が開始され、現在ファイルに関するメタデータを取得しています。 -
ls
の場合 リストが完全に取得されたとき、または少なくともそのチャンクの後に、が開始され、現在ディレクトリをリストしています。
ls
のせいではありません コマンド(まだ開始されていない可能性があります)。それはシェルのせいでもありません。それはNFSのせいです。 NFSはかなり遅いです。