Linux システムでは、約 100.000 個のファイル (いくつかの統計データが含まれています) を含むディレクトリがあります。ワイルドカードを使用してそれらにアクセスする必要がありますが、パフォーマンスの問題が発生しています。特定のファイルにアクセスするときは、非常に高速です。
time ls 19991
19991
real 0m0.004s
user 0m0.000s
sys 0m0.000s
ワイルドカードを使用すると、(ご想像のとおり) 遅くなります。
time ls 19991*
19991
real 0m0.043s
user 0m0.020s
sys 0m0.020s
しかし:ファイルに同時にアクセスしようとすると、すべてのアクセスが遅くなります:
i=1; while [ $i -le 10 ]; do (time ls 19991* &) ; let i=i+1; done
19991
19991
real 0m0.248s
user 0m0.010s
sys 0m0.020s
19991
real 0m0.279s
user 0m0.000s
sys 0m0.040s
19991
19991
19991
real 0m0.306s
user 0m0.050s
sys 0m0.000s
real 0m0.236s
user 0m0.010s
sys 0m0.030s
real 0m0.257s
user 0m0.010s
sys 0m0.040s
real 0m0.263s
user 0m0.020s
sys 0m0.020s
19991
19991
real 0m0.196s
user 0m0.030s
sys 0m0.010s
real 0m0.175s
user 0m0.020s
sys 0m0.020s
19991
real 0m0.095s
user 0m0.040s
sys 0m0.000s
19991
real 0m0.158s
user 0m0.020s
sys 0m0.040s
アクセスがカーネルによってシリアル化されたとしても、最初の "ls" に約 40 ミリ秒、2 番目に 80 ミリ秒、3 番目に 120 ミリ秒かかると予想されます。しかし今では、最速の "ls" でさえ 95 ミリ秒かかり、そのほとんどは約 200 ミリ秒です。
これは、ローカル ファイル システム (ext3) を使用している場合と、ネットワーク マウント ディレクトリ (nfs) を使用している場合に発生します。したがって、特定のファイルシステムとは何の関係もないと思います。
この速度低下の原因や修正方法はありますか?