Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
磁盘在共享unix服务器上读取/查找目录列表_Unix_Optimization_Shared Hosting_Disk - Fatal编程技术网

磁盘在共享unix服务器上读取/查找目录列表

磁盘在共享unix服务器上读取/查找目录列表,unix,optimization,shared-hosting,disk,Unix,Optimization,Shared Hosting,Disk,我想更好地了解对于简单的ls命令和特定文件夹上的cat*命令,磁盘读取是如何工作的 据我所知,磁盘读取对于服务器/任何机器来说都是“最慢”的操作,我想到的一个webapp会经常对某个文件夹进行ls和cat*调用 对于“ls”和“cat*”所涉及的磁盘读取,以下条目数的“ball-park”估计值是多少 Disk reads for ls Disk reads for cat * 200 2,000 20,000 200,00

我想更好地了解对于简单的ls命令和特定文件夹上的cat*命令,磁盘读取是如何工作的

据我所知,磁盘读取对于服务器/任何机器来说都是“最慢”的操作,我想到的一个webapp会经常对某个文件夹进行ls和cat*调用

对于“ls”和“cat*”所涉及的磁盘读取,以下条目数的“ball-park”估计值是多少

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

每个文件条目只是一行文本

很难回答,这可能就是为什么它花了这么长时间才找到答案的原因

在某种程度上,答案取决于文件系统——不同的文件系统会给出不同的答案。但是,执行“
ls
”需要读取包含目录项的页面,再加上读取包含目录中标识的索引节点的页面。这是多少页,因此也就是多少磁盘读取,取决于页面大小和目录大小。如果按每个文件名6-8字节的开销来考虑,就不会太远了。如果名称每个大约12个字符,那么每个文件大约有20个字节,如果页面是4096个字节(4KB),那么每个目录页面大约有200个文件

如果只列出名称,而不使用'
ls
'列出其他属性,那么就完成了。如果列出属性(大小等),则必须读取索引节点。我不知道现代inode有多大。几十年前,在一个原始文件系统上,每个文件系统有64个字节;从那时起,它可能会增长。每页将有多个inode,但您不能确保所需的inode是连续的(在磁盘上彼此相邻)。在最坏的情况下,您可能需要为每个单独的文件读取另一个页面,但实际上这不太可能。幸运的是,内核非常擅长缓存磁盘页面,因此不太可能需要重新读取页面。我们不可能很好地猜测相关inode条目的密度;它可能是,也许,每页4个索引节点,但任何从1到64的估计都可能是可信的。因此,对于包含200个文件的目录,您可能需要读取50页

在文件上运行“
cat
”时,系统必须找到每个文件的inode,就像“
ls
”一样;然后它必须读取文件的数据。除非数据存储在inode本身中(我认为在某些具有较大inode和足够小的文件体的文件系统中,这是/是可能的),否则您必须读取每个文件的一页—除非小文件的部分页面集中在一页上(同样,我似乎记得在某些文件系统中可能会听到这种情况)

因此,对于200文件目录:

  • 普通
    ls
    :1页
  • ls-l
    :51页
  • cat*
    :251页

我不确定我是否会非常相信这些数字,但你可以看到改善估计所需的数据类型。

回答起来很棘手-这可能就是为什么它花了这么长时间才找到答案的原因

在某种程度上,答案取决于文件系统——不同的文件系统会给出不同的答案。但是,执行“
ls
”需要读取包含目录项的页面,再加上读取包含目录中标识的索引节点的页面。这是多少页,因此也就是多少磁盘读取,取决于页面大小和目录大小。如果按每个文件名6-8字节的开销来考虑,就不会太远了。如果名称每个大约12个字符,那么每个文件大约有20个字节,如果页面是4096个字节(4KB),那么每个目录页面大约有200个文件

如果只列出名称,而不使用'
ls
'列出其他属性,那么就完成了。如果列出属性(大小等),则必须读取索引节点。我不知道现代inode有多大。几十年前,在一个原始文件系统上,每个文件系统有64个字节;从那时起,它可能会增长。每页将有多个inode,但您不能确保所需的inode是连续的(在磁盘上彼此相邻)。在最坏的情况下,您可能需要为每个单独的文件读取另一个页面,但实际上这不太可能。幸运的是,内核非常擅长缓存磁盘页面,因此不太可能需要重新读取页面。我们不可能很好地猜测相关inode条目的密度;它可能是,也许,每页4个索引节点,但任何从1到64的估计都可能是可信的。因此,对于包含200个文件的目录,您可能需要读取50页

在文件上运行“
cat
”时,系统必须找到每个文件的inode,就像“
ls
”一样;然后它必须读取文件的数据。除非数据存储在inode本身中(我认为在某些具有较大inode和足够小的文件体的文件系统中,这是/是可能的),否则您必须读取每个文件的一页—除非小文件的部分页面集中在一页上(同样,我似乎记得在某些文件系统中可能会听到这种情况)

因此,对于200文件目录:

  • 普通
    ls
    :1页
  • ls-l
    :51页
  • cat*
    :251页

我不确定我是否会非常信任这些数字,但你可以看到改进估算所需的数据类型。

也许你最好问“我如何衡量?”也许你最好问“我如何衡量?”哇-解释得很好-对我来说足够好了!关于我可以使用什么来确定(a)磁盘搜索或(b)您上面提到的“页面”大小的任何输入?@JD_ED:(a)磁盘搜索-取决于磁盘上页面的布局和顺序