为什么在使用 GNU 链接器时 Linux 不缓存对象 and/or“.so”文件?
Why doesn't Linux cache object and/or ".so" files when using GNU Linker?
当在大型项目中 linking 可执行文件(超过 200 个)时,我得到 link 每秒 0.5 个可执行文件,即使我有 运行 [=20= 】 一分钟前上台。 vmstat 显示超过 20MB/s 的磁盘读取速率。
但是如果我使用 "tar cf /dev/null build-dir" 预缓存构建目录一次,我得到一致的 link 速率,每秒 4.8 个可执行文件,磁盘读取速率基本上为零。
为什么 Linux 在 GNU Linker 读取目标文件 and/or “.so” 文件时不缓存它们,而在 tar 读取它们时缓存它们?有足够的 RAM (16GB)。内核版本为 4.4.146。 CentOS 7.5.
看起来 vm.vfs_cache_pressure = 1000 的不正确设置导致了这种不当行为。将其设置为 70 解决了问题并恢复了良好的缓存性能。
并且 documentation 明确建议不要将该值增加到 100 以上。不幸的是,Internet 上到处都是像 1000 这样的疯狂值的例子。
当在大型项目中 linking 可执行文件(超过 200 个)时,我得到 link 每秒 0.5 个可执行文件,即使我有 运行 [=20= 】 一分钟前上台。 vmstat 显示超过 20MB/s 的磁盘读取速率。
但是如果我使用 "tar cf /dev/null build-dir" 预缓存构建目录一次,我得到一致的 link 速率,每秒 4.8 个可执行文件,磁盘读取速率基本上为零。
为什么 Linux 在 GNU Linker 读取目标文件 and/or “.so” 文件时不缓存它们,而在 tar 读取它们时缓存它们?有足够的 RAM (16GB)。内核版本为 4.4.146。 CentOS 7.5.
看起来 vm.vfs_cache_pressure = 1000 的不正确设置导致了这种不当行为。将其设置为 70 解决了问题并恢复了良好的缓存性能。
并且 documentation 明确建议不要将该值增加到 100 以上。不幸的是,Internet 上到处都是像 1000 这样的疯狂值的例子。