我在使用 RAID 1+0 组合的 HP ML370 G5、Smart Array P400、SAS 磁盘上使用 Openfiler 2.3。
我使用 Openfiler 的基于 Web 的配置从 ext3 分区设置了 NFS 共享,并且成功地从另一台主机挂载了该共享。两台主机都使用专用的千兆链路连接。
使用简单的基准测试dd
:
$ dd if=/dev/zero of=outfile bs=1000 count=2000000
2000000+0 records in
2000000+0 records out
2000000000 bytes (2.0 GB) copied, 34.4737 s, 58.0 MB/s
我看到它可以达到中等传输速度(58.0 MB/s)。
但是,如果我复制一个包含许多总大小约为 300 MB 的小文件(每个文件大约 1-4 kB)的目录,则该.php
过程将在大约 10 分钟内结束。.jpg
cp
NFS 不适合像上述情况那样的小文件传输吗?还是有一些必须调整的参数?
我没有太多 NFS 经验,但我对其他网络文件共享协议的经验表明,在“许多小文件”场景中,性能几乎普遍受到影响。您正在招致往返延迟,并且在一大组文件中延迟加起来。
传输许多小文件总是比传输单个大文件慢的原因有很多。对于读取,文件更有可能分散在磁盘周围,需要到处寻找才能获取它们。正如 Evan 所提到的,在 NFS(或任何其他文件系统)的情况下还涉及元数据,这也使事情变得复杂。
您可以尝试增加NFS 挂载的参数
rsize
和wsize
参数,看看这是否有助于提高性能。还可以查看这个关于调整 NFS 以获得最小延迟的问题,因为它有很多有用的建议,可以在许多小文件传输的情况下提供帮助。您是否尝试过使用不同的文件系统,例如 XFS?它解决了我在进行大量小型 iSCSI 块传输时的所有问题。不知道为什么。
此外,iSCSI/NFS 通常配置用于相当大的数据帧(巨型帧等),如果您一次复制一个小文件,可能会伤害您。也许tar'ing然后转移会帮助你。
检查您是否正在使用 TCP 连接(mount -t nfs -o tcp host:/mount /target)。现代系统的性能不会受到影响,但如果您的网络已加载,小型 IO 可能会显着提高。
您还应该尝试其他一些文件系统;ext3 基本上是最慢的。它很可靠,众所周知,但它非常不适合文件服务器。XFS 要好得多,reiserfs 在小型 IO 上也好得多。
如果你想通过 NFS 传输一个由小文件组成的大目录树,并且你可以登录到服务器,最好的方法是在客户端制作一个自动解压的 tar 文件,如下所示:
tar c mydirectory | ssh user@host tar -xf - -C destdir
这样,只有一个“文件”通过网络传输,您立即将所有文件放在主机上。
问题是您的共享是使用
sync
选项(默认值)导出的。用于async
大大加快写入速度。见 nfs.sourceforge.net/nfs-howto/ar01s05.html与克里斯的回答类似的解决方案是定期将您的文件同步到客户端。如果您想进行双向更改,您也可以使用一致。