通过各种形式的文件传输传输大量(数 GB)数据时,例如:FTP、SFTP、NFS 和 Samba。他们都遇到了相同的问题,即多个小文件有时会阻碍速度降至 MB 或 KB——甚至超过 10Gbps 的链接。
但是,如果我要在传输之前对整个文件夹进行 zip、tar 或 rar 压缩,那么网络链接就会完全饱和。
是什么导致了这种效果?
可以采取哪些措施来提高通过网络传输许多小型单个文件的大型传输的性能?
在可用的文件传输协议中,哪种最适合?
我拥有对网络的全面管理,因此所有配置和选项都可用,例如在网络接口上设置 MTU 和缓冲区大小,以及在文件服务器配置中关闭异步和加密,这是一些一次性的想法。
每个单独的文件传输都是一个事务,每个事务都有与之相关的开销。一个粗略的例子:
在步骤 1,2 和 4 中,客户端和服务器之间有一个额外的往返,这会降低吞吐量。此外,在这些步骤中发送的信息加起来就是要传输的整体数据。如果元数据是 20 字节,那么对于 100 字节的文件,这将是 20% 的开销。
没有办法避免协议上的每个文件开销。
文件系统元数据。系统管理员低估了使文件成为可能所需的开销。直到他们尝试处理许多小文件。
假设您有 100 万个 4 KB 的小文件,具有 8 个驱动器主轴的速度相当快的存储,以及一个 10 Gb 的链接,该阵列有时会因顺序读取而饱和。进一步假设每个主轴 100 IOPS,每个文件需要一个 IO(这过于简单,但说明了这一点)。
21分钟!相反,假设数百万个文件位于一个存档文件中,并且顺序传输会使 10 Gb 链路饱和。80% 的有用吞吐量,由于被包裹在以太网中的 IP 中。
4秒是相当快的。
如果底层存储是小文件,那么任何文件传输协议都会有很多问题。当阵列的 IOPS 成为瓶颈时,位于其之上的文件服务器的协议并没有真正的帮助。
最快的方法是复制一个大存档或磁盘映像。主要是顺序 IO,最少的文件系统元数据。
也许使用文件服务协议,您不必复制所有内容。挂载远程共享并访问您需要的文件。但是,访问具有大量文件的目录或将它们全部复制仍然很慢。(请注意,NFS 服务器意外关闭可能会导致客户端永远卡在 IO 中。)