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