2012-06-28 19 views
6

我打算构建大文件服务器,并且需要堆栈溢出社区对文件系统选择(linux)的建议。在适度写入下使用nginx服务1GB文件的最佳文件系统,读取性能明智?

文件服务器将服务1-2GB大小的静态文件的Nginx通过(主要是每个请求不同)下,在恒定中等写入磁盘(RAID5 SATA/7200磁盘大规模)。写入读取比率约为1:5-10,每写入1个字节每秒,读取5-10个。 对我来说最重要的是读取性能,我可以忍受较慢的写入。

什么Linux文件系统将是这个任务的最佳解决方案?为什么:)谢谢!

回答

0

非常大的文件往往不是非常依赖于您所使用的文件系统,现代文件系统(即不胖!)做存储的大型连续块分配它们,从而减少寻道延迟的一个很好的工作。如果你倾向于看到它们之间的差异在于小文件性能,在空间不足情况下的分裂阻力,并发性等等。存储大文件是一个相对容易的问题,我怀疑你会看到可衡量的差异。

但一如既往:如果你真的关心,基准。关于文件系统性能没有简单的答案。

+0

所以没有真正:(你有没有试过删除上ext2-3大文件VS XFS VS JFS?还有,看看内核源代码就已经透露给你,不同的FS司机花不同时间的临界部分,他们往往在高IO压力下表现出不同的表现。 –

+0

删除大文件不是用例。如果你有号码,给他们看。我支持我写的内容。 –

+0

数字? “有谎言,该死的谎言,然后基准”我还没有看到没有任何营销目标的基准。我在谈论我的经验和公开的Linux内核源码。然而,“我怀疑你会看到可衡量的差异”这一点是荒谬的。 –

4

为用户提供服务重内容最好的结果,有调别的东西。请通过下面Nginx core developer's comment看一看:

  1. 切断的sendfile,它可以在linux下 此类工作负载不好,由于没有能力控制预读(从 磁盘读取,因此块)。

    sendfile off;

  2. 使用大输出缓冲器

    output_buffers 1 512K

  3. 尝试使用AIO,以确保更好的磁盘并发(下 Linux的,它需要的directio以及注),即是这样的

    aio on; directio 512;

其他建议:

  1. 检查文件系统交换,不使用

  2. 文件系统 - EXT4,XFS。很好地启用data_writeback和noatime安装选项

5

我实现了每“真实”磁盘(主轴)“随机读取”性能80MB/s。 这是我的发现。

因此,首先决定你需要多少流量向下推至用户,有多少存储你每台服务器需要。

由于您已经有RAID5设置,您可以跳过下面给出的磁盘设置建议。

让我们举一个带有3 * 2TB磁盘的专用1Gbps带宽服务器的例子。 保留专用于OS和tmp的第一张磁盘。对于其他2个磁盘,你可以创建一个软件RAID(对我来说,它比板载硬件RAID更好)。否则,你需要在独立的磁盘上平分你的文件。想法是保持两个磁盘共享读/写负载平等。软件raid-0是最好的选择。

的Nginx的conf 有两种方法来实现使用nginx的性能高的水平。

  1. 使用上的directio

    AIO;
    directio 512; output_buffers 1 8m;

    “这个选项需要你有大量内存” 需要大约12-16GB的ram。

  2. 用户级的IO

    output_buffers 1个2M;

    “请确保您已设置预读以4-6MB软件RAID安装” blockdev看看-setra 4096的/ dev/md0的(或独立磁盘安装)

    此设置将优化使用系统文件缓存,并需要更少的内存。 需要8GB左右的内存。

共同注:

  • 保持 “SENDFILE关闭;”

您可能还想使用带宽限制来启用可用带宽上的100个连接。每个下载连接将使用4MB的活动RAM。

 limit_rate_after 2m; 
     limit_rate 100k; 

两个上述溶液将缩放3磁盘服务器上容易到1 k +同时发生的用户。 假设您有1Gbps的带宽,并且每个连接都以1Mb/ps的速度进行节流 需要额外的设置来优化磁盘写入而不会影响读取量。

使所有上传到mount os/tmpuploads上的主os磁盘。这将确保没有间歇性干扰,而重读正在进行。然后使用“dd”命令将文件从/ tmpuploads移至withlag = direct。像

dd if=/tmpuploads/<myfile> of=/raidmount/uploads/<myfile> oflag=direct bs=8196k