ls
引数なしで実行すると、ディレクトリが開かれ、すべての内容が読み取られ、ソートされて出力されます。
を実行するとls *
、最初にシェルが展開されます*
。これは、simple ls
が実行したものと事実上同じであり、現在のディレクトリ内のすべてのファイルで引数ベクトルを作成し、を呼び出しますls
。ls
その後、その引数ベクトルを処理し、各引数について、access(2)
ファイルを呼び出して、その存在を確認する必要があります。次に、最初の(単純)と同じ出力を出力しls
ます。シェルの大きな引数ベクトルとls
の両方の処理には、小さなブロックの多くのメモリ割り当てが含まれる可能性が高く、これには時間がかかる場合があります。ただし、時間sys
とuser
時間はほとんどなく、多くのreal
時間があるため、CPUを使用してメモリ割り当てを行うのではなく、ほとんどの時間をディスクの待機に費やしていました。
を呼び出すたびにaccess(2)
、ファイルのiノードを読み取って許可情報を取得する必要があります。これは、単にディレクトリを読み取るよりもはるかに多くのディスク読み取りおよびシークを意味します。これらの操作がGPFSでどれほど高価なのかはわかりませんがls -l
、ワイルドカードの場合と同様の実行時間を持つ比較を示したように、inode情報を取得するのに必要な時間が支配的になっています。GPFSが各読み取り操作でローカルファイルシステムよりも若干高いレイテンシを持っている場合、これらのケースではより顕著になると予想されます。
ワイルドカードの場合とls -l
50%の違いは、ディスク上のiノードの順序によって説明できます。iノードがディレクトリ内のファイル名と同じ順序で連続して配置され、ls -l
ソートする前にファイルをディレクトリ順にstat(2)したls -l
場合、ほとんどのiノードがスイープで読み取られる可能性があります。ワイルドカードを使用すると、シェルはファイル名をに渡す前にソートするls
ためls
、iノードを異なる順序で読み取り、ディスクヘッドの移動を増やします。
time
出力には、シェルがワイルドカードを展開するのにかかる時間は含まれないことに注意してください。
何が起こっているのか本当に知りたい場合は、以下を使用しますstrace(1)
。
strace -o /tmp/ls-star.trace ls *
strace -o /tmp/ls-l-star.trace ls -l *
それぞれのケースで実行されているシステムコールを確認します。
¹ access(2)
が実際に使用されているのか、それともstat(2)
。ただし、どちらもおそらくiノード検索を必要とします(iノード検索access(file, 0)
をバイパスするかどうかはわかりません)。
ls
、それは単に「のiノードの子何のファイルシステムを頼むことができるpwd
と同様に」ls *
「iノードの子(およびファイル)とは何かa
」に続いてb、c、dなどを尋ねる必要があります。1つのクエリと多くのクエリ。