<p>我知道您已经得到了问题的答案,但这让我对Linux中这些缓存的工作方式感到好奇,所以我执行了一个小的基准测试。在</p>
<p>我创建了一个有1000个子目录的目录,在每个子目录中我创建了1000个文件。总共1000个文件夹和100万个文件。在</p>
<pre><code>seq 1000 | parallel "mkdir {} && seq 1000 | parallel touch {}/\{\}"
</code></pre>
<p>这应该会给<code>os.walk</code>一些工作。接下来,我创建了一个测试脚本,它只计算目录中的文件数,递归地使用<code>os.walk</code>:</p>
^{pr2}$
<p>我运行了几次,结果平均执行时间为2.27秒。在</p>
<p>接下来,我再次运行测试几次,但在每次执行之间刷新页面缓存,然后再次刷新dentry/inode缓存,最后执行相同的操作,但刷新了以上所有缓存。在</p>
<pre><code>To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
</code></pre>
<p>结果:</p>
<pre><code> no flush page cache dentries/inodes all
mean 2.27 2.56 4.24 4.80
stdev 0.052 0.055 0.127 0.108
%RSD 2.27% 2.15% 2.99% 2.26%
median 2.26 2.54 4.21 4.78
iterations 27 27 31 10
</code></pre>
<p>基准测试是在新的SSD驱动器上的<code>ext4</code>文件系统上运行的。Linux版本是3.17.7。在</p>
<p>毫不奇怪,页面缓存以及dentries/inodes缓存对这个基准测试的结果有很大影响。不过,我有点惊讶,只刷新页面缓存会产生如此大的差异,因为应该可以一次读取这些文件的大部分文件系统元数据,但我可能遗漏了一些东西。在</p>
<p>我会说页面缓存没有多大区别,因为包含文件系统元数据的页面的缓存未命中相对较少。但我的直觉似乎错了。你知道为什么吗?在</p>