使用Linux中的通配符缓慢并发文件访问

时间:2013-01-15 10:47:24

标签: linux filesystems

在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”需要大约40ms,第二个80ms,第三个120ms,....但现在即使是最快的“ls”也需要95ms,其中大部分都需要200ms左右。

使用本地文件系统(ext3)时以及使用网络安装目录(nfs)时会发生这种情况。所以我认为它与特定的文件系统无关。

是什么原因导致这种放缓或如何解决?

1 个答案:

答案 0 :(得分:0)

所用的总时间是多少?

如果我查看用户时间和系统时间,那么它们仍然很小。所以也许这就是您所看到的:

init job1
init job2
init job3
...
init job10
run half of job1
...
run half of job10
finish jobs1
...
finish jobs10

比较这些:

$ time ( i=1; while [ $i -le 100 ]; do time ls 19991* &  let i=i+1; done ;wait)
real    0m1.278s
user    0m2.532s
sys     0m2.236s

$ time ( i=1; while [ $i -le 100 ]; do time ls 19991* ; let i=i+1; done ;wait)
real    0m3.197s
user    0m1.669s
sys     0m1.535s

用户和sys大致相同。并行版本中更长的用户+系统时间可以通过分叉的开销来解释。较低的实时性可以通过拥有多个CPU来解释。

因此,并行运行的更多作业会严重影响您的时间安排。