2010-07-23 51 views
1

我想更好地理解磁盘读取对于简单的ls命令和特定文件夹上的cat *命令的工作方式。磁盘在目录列表中的共享unix服务器上读取/寻找

据我所知,磁盘读取是服务器/任何机器的“最慢”操作,而我想到的一个webapp会针对某个文件夹非常频繁地进行ls和cat *调用。

什么是“园球”磁盘的估算值“LS”和“猫*”读参与下列数量的条目?

   Disk reads for ls      Disk reads for cat * 
200 
2,000 
20,000 
200,000 

每个文件条目是文本

+0

也许你最好问“我怎么测量?” – 2010-07-23 02:32:39

+0

“我怎么测量?” :) – 2010-07-23 06:07:08

回答

1

整蛊回答的只是一个单一的线 - 这可能是为什么花了这么长时间得到任何答案都没有。

部分答案取决于文件系统 - 不同的文件系统会给出不同的答案。但是,执行'ls'需要读取包含目录条目的页面,并阅读包含目录中标识的inode的页面。多少个页面 - 因此有多少个磁盘读取 - 取决于页面大小和目录大小。如果您认为每个文件名的开销为6-8字节,则不会太远。如果名称每个大约12个字符,则每个文件大约有20个字节,如果您的页面大小为4096个字节(4KB),则每个目录页面大约有200个文件。

如果您仅使用'ls'列出名称而不是其他属性,则表示完成。如果列出属性(大小等),则必须读取inode。我不确定现代inode有多大。几十年前,在一个原始文件系统上,它每个都是64字节;从那时起它可能会增长。每个页面会有多个inode,但是你不能确定你需要的inode是连续的(在磁盘上彼此相邻)。在最糟糕的情况下,您可能需要为每个单独的文件阅读另一个页面,但在实践中这是不太可能的。幸运的是,内核在缓存磁盘页面方面相当不错,所以不太可能需要重新读取页面。我们不可能很好地猜测相关inode条目的密度;它也许可能是每页4个inode,但是从1到64的任何估计可能是合理的。因此,您可能需要为包含200个文件的目录读取50个页面。

当涉及到在文件上运行'cat'时,系统必须为每个文件找到inode,就像'ls'一样;然后它必须读取文件的数据。除非数据存储在inode本身中(我认为这在某些带有较大inode和足够小文件体的文件系统中是可行的),那么您必须为每个文件读取一个页面 - 除非小文件的部分页面聚集在一起在一页上(我似乎还记得在某些文件系统中可能会发生这种情况)。

所以,对于一个200文件目录:

  • 平原ls:1页
  • ls -l
  • cat * 51页:

我不知道我是251页d非常相信这些数字 - 但您可以看到改进估算所需的那种数据。

+0

哇 - 非常好解释 - 并且对我来说够好!对于我可以用来确定(a)磁盘寻求的任何输入或(b)上面提到的“页面”的大小? – 2010-07-23 06:06:40

+0

@JD_ED:(a)磁盘查找 - 取决于磁盘上页面的布局和读取顺序,以及调度,加上......非常复杂。 (b)应该在内核的头文件中可用 - 可能是,或者可能取决于正在使用的文件系统,在这种情况下,您可能需要查看特定于所用文件系统的头文件。 – 2010-07-23 06:58:45