为什么跟踪大量的符号链接会很快变慢?

为什么跟踪大量的符号链接会很快变慢?

我有一个目录,其中包含大约 200 万个符号链接,这些符号链接指向同一驱动器上的真实文件,该驱动器是真实的本地硬盘(不是网络挂载)。文件名都是唯一的,它们指向的文件分散在不同的目录中,但它们都共享相同的父路径。我正在使用符号链接合并多个目录中的文件。

/some/full/path/consolidated/my_file -> /some/full/path/mydir2/my_file
/some/full/path/consolidated/my_file2 -> /some/full/path/mydir3/my_file2
/some/full/path/consolidated/my_file3 -> /some/full/path/mydir4/my_file3
/some/full/path/consolidated/my_file4 -> /some/full/path/mydir4/my_file4
/some/full/path/consolidated/my_file5 -> /some/full/path/mydir2/my_file5
/some/full/path/consolidated/my_file6 -> /some/full/path/mydir3/my_file6

保证符号链接不会被破坏。

问题是

time find "/some/full/path/consolidated/" -maxdepth 1 -type l -print > /tmp/foo

快速完成:

1.24 user 0.83 system 0:02.08elapsed

然而,

time find -L "/some/full/path/consolidated/" -maxdepth 1 -type f -print > /tmp/foo

其次是

watch wc -l /tmp/foo

显示它很快就达到约 660,000 行,然后停滞不前,时不时地添加几千行结果。

为什么它会停止运行?能否使第二个命令与第一个命令一样快?

编辑: 根本/tmp没有显示mount(所以我假设它不是 tmpfs)。根据 htop,我的内存并不低;我有大约 50GB 的可用内存。CPU 使用率也很低。对于find -L path/tmp/foo当速度变慢时,它会停止,大约为 90MB。对于find path,它不会停止,/tmp/foo为 111MB。

当将输出重定向到 ~/foo 时,我也遇到了同样的速度减慢的情况。

编辑:目测时iotopfind -L列出的 I/O 为 99.99%,但仅在约 10 秒后,这远远超过了正常find完成的时间。

答案1

尝试增加你的 inode 缓存

echo 50 | sudo tee /proc/sys/vm/vfs_cache_pressure

值 100 是平均值,较低的值 = 更大的 inode+dentry 缓存
缺点:更大的缓存可能会更慢,因此您也可以尝试使用以下方法减少缓存

echo 200 | sudo tee /proc/sys/vm/vfs_cache_pressure

或者你可以使用缓存文件列表

sudo updatedb
locate /some/full/path/consolidated

还要注意 inode 的使用情况,符号链接占用 inode(硬链接也是如此)

df -i

有关的:https://serverfault.com/questions/338097/tuning-linux-cache-settings-for-inode-caching

有关磁盘调整的更多信息:https://unix.stackexchange.com/questions/30286/can-i-configure-my-linux-system-for-more-aggressive-file-system-caching/41831

相关内容