使用nginx提供1GB文件的最佳文件系统,在中等写入,读取性能方面?

bbb*_*oon 6 linux filesystems nginx

我将构建大型文件服务器,并需要文件系统选择(linux)的堆栈溢出社区建议.

文件服务器将通过Nginx提供1-2GB大小的静态文件(大多数不同于每个请求),在不断适度写入磁盘(大量RAID5 SATA/7200磁盘)下.写入读取比约为1:5-10,对于每秒写入的每1字节,读取5-10.对我来说最重要的是读取性能,我可以忍受较慢的写入.

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

Ana*_*oly 5

为了提供最好的结果,提供丰富的内容,还有其他一些东西需要调整.请看下面的Nginx核心开发者评论:

  1. 关闭sendfile,由于无法控制readahead(因此从磁盘读取块),它在linux下的此类工作负载上运行正常.

    sendfile off;

  2. 使用大输出缓冲区

    output_buffers 1 512k

  3. 尝试使用aio来确保更好的磁盘并发性(并在linux下注意它也需要directio),即这样的东西

    aio on; directio 512;

其他建议:

  1. 检查文件系统交换是否未使用

  2. 文件系统 - ext4,xfs.很高兴启用data_writeback和noatime挂载选项


Vin*_*eet 5

我为每个"真实"磁盘(主轴)实现了80MB/s的"随机读取"性能.以下是我的发现.

因此,首先要确定向用户推送需要多少流量以及每台服务器需要多少存储空间.

由于您已经安装了RAID5,因此可以跳过下面给出的磁盘设置建议.

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

Nginx Conf 使用nginx有两种方法可以实现高水平的性能.

  1. 使用directio

    aio on;
    directio 512; output_buffers 1 8m;

    "这个选项需要你有大量的内存"需要大约12-16GB的内存.

  2. userland io

    output_buffers 1 2m;

    "确保已将预读设置为4-6MB进行软件raid安装"blockdev --setra 4096/dev/md0(或独立磁盘安装)

    此设置将最佳地使用系统文件缓存,并且需要更少的内存.需要大约8GB的内存.

常见说明:

  • 保持"sendfile off;"

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

        limit_rate_after 2m;
        limit_rate 100k;
Run Code Online (Sandbox Code Playgroud)

以上两种解决方案都可以在3磁盘服务器上轻松扩展到1k +并发用户.假设您有1Gbps带宽,并且每个连接都以1Mb/ps进行限制.优化磁盘写入需要额外的设置,而不会影响读取.

将所有上传到mount上的主os磁盘上说/ tmpuploads.这将确保在重读时不会出现间歇性干扰.然后使用带有oflag = direct的"dd"命令从/ tmpuploads移动文件.就像是

dd if=/tmpuploads/<myfile> of=/raidmount/uploads/<myfile> oflag=direct bs=8196k
Run Code Online (Sandbox Code Playgroud)


And*_*oss 0

非常大的文件往往不太依赖于您使用的文件系统,现代文件系统(即不是 FAT!)可以很好地将它们分配到大的连续存储块中,从而最大限度地减少查找延迟。您往往会发现它们之间的差异在于小文件性能、空间不足情况下的碎片抵抗、并发性等......存储大文件是一个相对简单的问题,我怀疑您会看到可测量的差异。

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