我要构建大型文件服务器,并且需要用于文件系统选择(linux)的堆栈溢出社区建议。
文件服务器将通过Nginx提供1-2GB大小的静态文件(大多数不同于每个请求),在不断适度写入磁盘(大量RAID5 SATA / 7200磁盘)下。写入读取比约为1:5-10,对于每秒写入的每1字节,读取5-10。 对我来说最重要的是读取性能,我可以忍受较慢的写入。
哪种Linux文件系统最适合此任务?为什么:)谢谢!
答案 0 :(得分:5)
为了提供最好的结果,提供丰富的内容,还有其他一些需要调整的地方。请查看下面的Nginx core developer's comment:
关闭 sendfile ,它在linux下的此类工作负载上运行不佳 由于无法控制预读(因此无法读取块) 磁盘)。
sendfile off;
使用大型输出缓冲区
output_buffers 1 512k
尝试使用 aio 来确保更好的磁盘并发性(请注意下 linux它还需要directio),就像这样的东西
aio on; directio 512;
其他建议:
检查文件系统交换未使用
文件系统 - ext4,xfs。很高兴启用data_writeback和noatime挂载选项
答案 1 :(得分:5)
我为每个“真实”磁盘(主轴)实现了80MB / s的“随机读取”性能。 以下是我的发现。
因此,首先要确定向用户推送需要多少流量以及每台服务器需要多少存储空间。
由于您已经安装了RAID5,因此可以跳过下面给出的磁盘设置建议。
让我们举一个带有3 * 2TB磁盘的专用1Gbps带宽服务器的例子。 保留第一个专用于OS和tmp的磁盘。对于其他2个磁盘,您可以创建一个软件raid(对我而言,它比板载硬件raid更好)。否则,您需要在独立磁盘上平均分配文件。想法是保持两个磁盘共享读/写负载相同。软件raid-0是最佳选择。
Nginx Conf 使用nginx有两种方法可以实现高性能。
使用directio
aio on;
directio 512;
output_buffers 1 8m;
“此选项将要求您拥有大量的公羊” 需要大约12-16GB的内存。
userland io
output_buffers 1 2m;
“确保已将预读设置为4-6MB以进行软件raid挂载” blockdev --setra 4096 / dev / md0(或独立磁盘安装)
此设置将最佳地使用系统文件缓存,并且需要更少的内存。 需要大约8GB的内存。
常用说明:
您可能还希望使用带宽限制来在可用带宽上启用100个连接。每个下载连接将使用4MB的活动RAM。
limit_rate_after 2m;
limit_rate 100k;
以上两种解决方案都可以在3磁盘服务器上轻松扩展到1k +并发用户。 假设您有1Gbps带宽,并且每个连接都以1Mb / ps的速率进行限制 需要额外的设置来优化磁盘写入而不会影响读取。
将所有上传到mount上的主os磁盘上说/ tmpuploads。这将确保在重读时不会出现间歇性干扰。然后使用带有oflag = direct的“dd”命令从/ tmpuploads移动文件。
之类的东西dd if=/tmpuploads/<myfile> of=/raidmount/uploads/<myfile> oflag=direct bs=8196k
答案 2 :(得分:0)
非常大的文件往往不会非常依赖于您使用的文件系统,现代文件系统(即不是FAT!)可以很好地将它们分配到大的连续存储块中,从而最大限度地减少搜索延迟。你倾向于看到它们之间的区别在于文件性能较差,在空间不足情况下的碎片抗性,并发性等等......存储大文件是一个相对容易的问题,我怀疑你会看到可测量的差异。 / p>
但一如既往:如果你真的关心,那么基准。关于文件系统性能没有简单的答案。