Linux下NFS上的并行文件写入性能

Posted

技术标签:

【中文标题】Linux下NFS上的并行文件写入性能【英文标题】:Parallel file writing performance on NFS under Linux 【发布时间】:2017-10-10 13:54:49 【问题描述】:

我对来自 Amazon 的 EFS 文件系统的性能有疑问,但我怀疑问题出在 Linux 配置上。

我的设置是 AWS 中的 m4.large 机器(2 核,8GB RAM),EFS 驱动器安装为标准设置的 NFS4.1 安装类型。

我有一个创建独特的 1 kB 小文件的脚本(见下文)。我正在使用 GNU 并行实用程序并行运行脚本,该实用程序可帮助我在不同数量的并行作业下运行。

我所做的测试表明,当我只运行 1 个作业时,速度为 60kB/秒,并行运行 2 个作业,整体速度几乎为 120kB/秒,但之后运行 3、4、10 个作业时并行,整体速度仍然保持在 120 kB/秒左右。

我已将文件描述符和打开文件的默认值增加到很大但没有影响。 CPU几乎没有使用,内存也不是很使用。根据规格,网络应该能够维持高达 45MB/秒的速度,所以我也离这个限制很远。此外,最大吞吐量的 EFS 限制约为 105 MB/秒。

除了增加机器上的内核数量之外,我还能设置什么来允许并行写入更多文件? (猜测文件将转换写入 NFS 挂载的 tcp 连接)

使用的脚本:

#!/bin/bash
value="$(<source1k.txt)"
host="$(hostname)"
client=$1
mkdir output4/"$host"
for i in 0..5000
do
    echo "$value" > "output4/$host/File_$(printf "%s_%03d" "$client" "$i").txt"
done

它被称为运行在 4 个并行作业上

parallel -j 4 sh writefiles.sh  ::: 1 2 3 4

编辑:我使用 4 kB 作为文件大小(它不接受 1)测试了 iozone 实用程序,吞吐量测试给出的结果是孩子看到 240MB,而父母看到 500kB(我找不到这实际上意味着什么,但那些 500kB 接近我测量的值)。

【问题讨论】:

我的猜测是您正在对脚本进行大量 CPU 处理以写入非常少的数据 (1K)。尝试使用真正的基准测试程序。 根据 top 命令,每个并行作业的 cpu 约为 1%。 shell 不会占用大量 CPU 时间,它会使用日历时间,这会扭曲您的基准测试数据。我再次建议使用真正的基准程序。 @JohnHanley 请你推荐一些基准测试工具,我试过 iozone,但我得到了一些奇怪的结果,我找不到明确的解释(我会将它们添加到问题中)跨度> 【参考方案1】:

经过多次测试和与亚马逊支持人员的讨论,我的瓶颈似乎是我将所有文件写入同一个文件夹(并且可能有一个用于命名目的的锁)。如果我将测试更改为将文件写入不同的文件夹,速度会提高很多。

【讨论】:

以上是关于Linux下NFS上的并行文件写入性能的主要内容,如果未能解决你的问题,请参考以下文章

FreeBSD 上的 NFS V4 托管,客户端和服务器都可以安装,但文件系统上没有读取或写入,报告输入/输出错误

Linux 6.3 对EXT4文件系统写入性能改进补丁

Linux 6.3 对EXT4文件系统写入性能改进补丁

NFS 时间间隔过长

在 Linux 上通过 NFS 触发 inotify 事件?

Linux6.5中搭建NFS服务,远程存储数据。