Jar*_*edC 41 linux performance compiling ubuntu
我一直在测试不同的方法来缩短编译整个 C++ 项目所需的时间。目前大约需要 5 分钟。我试验了 distcc、ccache 和其他。最近,我发现如果我将整个项目复制到 RAM 驱动器上,然后从那里编译,它会将编译时间减少到原来的 30% —— 只需 1.5 分钟。
显然,从 RAM 驱动器工作是不切实际的。那么,有谁知道我可以强制操作系统始终缓存某个目录的方法吗?我仍然希望目录像往常一样同步回磁盘,但我也总是希望在内存中复制一份数据。这可能吗?
编辑:
作为一种可能的解决方案,我们只是想启动一个rsync每 10 秒左右运行一次的守护程序,以将磁盘驱动器与 RAM 驱动器同步。然后我们从 RAM 驱动器运行编译。该rsync是极快的,但这样做真的有用吗?当然,操作系统可以做得更好......
Gil*_*il' 20
将一堆文件保存在缓存中的明显方法是经常访问它们。Linux 非常擅长在交换和缓存之间进行仲裁,所以我怀疑您观察到的速度差异实际上不是由于操作系统没有将内容保存在缓存中,而是由于您使用 tmpfs 和其他尝试之间的其他一些差异。
尝试观察每种情况下正在执行 IO 的操作。其基本工具是iotop. 其他工具可能有用;按文件系统路径和/或进程查看Linux 磁盘 IO 负载细分?, Linux 中有什么程序可以随时间测量 I/O?,以及 Server Fault 上的其他线程。
这里有一些关于可能发生的事情的假设。如果您进行测量,请出示它们,以便我们确认或反驳这些假设。
noatimemount 选项关闭它们。你的tmpfs + rsync的解决方案从未读取从硬盘,这样永远不会花费额外的时间写作atimes。sync()还是因为内核频繁刷新其输出缓冲区,写入到硬盘的时间将比写入 tmpfs 的时间长。Linux默认使用 RAM 作为磁盘缓存。作为演示,尝试运行time find /some/dir/containing/a/lot/of/files > /dev/null两次,第二次要快得多,因为每个磁盘 inode 都被缓存了。这里的重点是如何利用此内核功能并停止尝试替换它。
重点是改变swappiness. 让我们考虑三种主要的内存使用类型:活动程序、非活动程序和磁盘缓存。显然,活动程序使用的内存不应该被换出,另外两个之间的选择是相当随意的。您想要快速的程序切换还是快速的文件访问?一个低swappiness更愿意保留在内存中的程序(即使没有长期使用)和高swappiness喜欢保留更多的磁盘高速缓存(通过交换未使用的程序)。(swappiness 范围从 0 到 100,默认值为 60)
我对您的问题的解决方案是将 swappiness 更改为非常高(90-95 不是 100)并加载缓存:
echo 95 | sudo tee /proc/sys/vm/swappiness > /dev/null # once after reboot
find /your/source/directory -type f -exec cat {} \; > /dev/null
Run Code Online (Sandbox Code Playgroud)
正如您猜测的那样,您必须有足够的可用内存来缓存所有源文件和目标文件以及编译器、包含的头文件、链接库、IDE 和其他使用过的程序。
如果我想将某些文件或所有文件保留在缓存中的某个目录中,这件事似乎对我有用。
vmtouch似乎就是这样做的。示例 5 可能是您需要的。
vmtouch -dl /whatever/directory/
Run Code Online (Sandbox Code Playgroud)
我需要以 root 身份运行它 sudo
inosync如果您要将 rsync rsync 到 ramdisk ,守护程序听起来就像您想要的那样。它不是每 10 秒左右 rsync 一次,而是使用 Linux 的 inotify 工具在文件更改时进行 rsync。我在 Debian 存储库中找到它作为inosync包,或者它的源代码可以在http://bb.xnull.de/projects/inosync/ 找到。