我正在组装一个Linux盒子,它将充当持续集成构建服务器。我们将主要构建Java东西,但是我认为这个问题适用于任何编译语言。
我应该使用什么文件系统和配置设置?(例如,我知道我不需要花时间!)构建服务器将花费大量时间读取和写入小文件,并扫描目录以查看哪些文件已被修改。
更新:在这种情况下,数据完整性是低优先级;这只是一台构建机器……最终的工件将被压缩并存档在其他地方。如果构建机器上的文件系统损坏并丢失了所有数据,我们可以擦除并重新映像;构建将继续像以前一样运行。
我正在组装一个Linux盒子,它将充当持续集成构建服务器。我们将主要构建Java东西,但是我认为这个问题适用于任何编译语言。
我应该使用什么文件系统和配置设置?(例如,我知道我不需要花时间!)构建服务器将花费大量时间读取和写入小文件,并扫描目录以查看哪些文件已被修改。
更新:在这种情况下,数据完整性是低优先级;这只是一台构建机器……最终的工件将被压缩并存档在其他地方。如果构建机器上的文件系统损坏并丢失了所有数据,我们可以擦除并重新映像;构建将继续像以前一样运行。
Answers:
使用ext4fs作为基本文件系统,并提供一些加速选项,例如
noatime,data=writeback,nobh,barrier=0,commit=300
然后,union在其上安装一个tmpfs ramdisk,以便在构建过程中写入的文件获得ramdisk的好处。在构建结束时,可以更改构建过程以将生成的二进制文件从tmpfs中移出,或者将tmpfs合并回ext4fs中,然后再进行卸载。
barrier=0
从Arch Wiki:“在断电情况下无法保证磁盘无法正确写入高速缓存时禁用障碍会导致严重的文件系统损坏和数据丢失。”
最快的文件系统?将tmpfs从可用RAM中装入,并进行noatime
设置。
仅当您具有检出构建源树所需的一切的过程(因为重新启动时tmpfs文件系统的内容将消失)并且源和对象都位于可用RAM的合理位置时,此方法才可行(还剩下足够的钱来运行您的编译器和链接器而无需交换)。那就是说,您无法击败为了提高速度而在RAM中工作。
我可以补充一下Michael Dillon的答案,您可以用很少的选择创建ext4文件系统:
mkfs.ext4 -O dir_index,extent -i 8096 /dev/<disk>
dir_index
Use hashed b-trees to speed up lookups in large directories.
extent
Instead of using the indirect block scheme for storing the location of data blocks in an inode, use extents instead. This is a much more efficient encoding which speeds up filesystem access, especially for large files.
-i 8096为您提供每个大小更多的索引节点,这很有用,因为构建环境会创建许多文件。
您描述的操作提供了一些关键的提示,说明理想的文件系统需要能够执行的操作:
Btrfs和Ext4是上面的三个,第四个是有问题的。Ext4可能已经足够成熟,但是btrfs尚未完成烘烤。noatime
有助于提高元数据操作的效率,但是当您创建大量新文件时,仍然需要元数据操作来快速地尖叫。
那时,基础存储开始成为一个因素。XFS元数据操作倾向于集中在几个块中,这可能会使操作紧张。Ext样式的文件系统最好使元数据更接近其描述的数据。但是,如果您的存储足够抽象(您正在VPS上运行,或者已连接到SAN),那就没关系了。
每个文件系统几乎没有提速,可以加快速度以获取更多的百分点。基础存储的性能如何将极大地影响您将看到的收益。
用存储的话来说,如果存储中有足够的I / O操作开销,那么文件系统的低效率就不再那么重要了。如果您将SSD用作构建分区,那么选择文件系统的重要性就不如您更习惯使用文件系统。
对于很多小文件,我建议在ext3,xfs,jfs ...上使用Reiser,尽管我听说ext4比以前的版本更适合这种访问方式。
Reiser将大量文件结构推入了inode树-因此,在处理小文件时,它确实工作得很好。
但是,与通过拥有足够的物理内存来有效地缓存/缓冲所获得的收益相比,领先的文件系统之间的行为差异相对较小。
并扫描目录以查看哪些文件已被修改。
这是解决问题的a脚方法,尽管它相对简单。如果那很重要,请考虑编写一个inotify处理程序来索引mod。
OTOH,如果您使用的是闪存固态硬盘(这将使您的寻道时间非常短),我建议您使用fs来延长寿命,从而更有效地分配写入数据-例如JFFS2