使Linux与本地磁盘读取同时写入网络文件系统


17

摘要

您如何将Linux配置为既可以从本地磁盘/文件系统读取又可以同时写入网络共享,而不是在没有数据通过网络传输时进行读取,然后在通过本地磁盘访问网络时通过网络发送数据闲?

同时读取和写入要快得多,而不是只交替执行一项操作,然后再执行另一项操作。

细节

我正在将大量数据从Linux计算机上的本地磁盘移至NAS设备。

rsync用来基本上复制/srv/data/mnt/nas,这是CIFS挂载。

它运行良好,读取速度为100MB /秒,写入NAS的速度为100MB /秒(千兆网络的限制),并且读取和写入同时进行。

但是现在,几个小时后,我发现它正在从本地磁盘读取,然后在将其写入NAS时停止读取,然后当没有更多数据要写入NAS时,它将恢复从磁盘中读取再次。读取磁盘时网络处于空闲状态,而使用网络时磁盘处于空闲状态。

不用说,先读取200MB再写入200MB比同时读取和写入200MB所需的时间长得多。

如何配置内核,使其同时保持早期的读写行为,而不是在读写之间交替进行,一次只执行一次操作?

一些观察:当本地磁盘以100 + MB / sec的速度读取时,一切似乎都并行发生,但是一旦磁盘变慢(由于某种原因,现在似乎仅以20MB / sec的速度),这就是这种读/写操作切换似乎发生了。

我还sync可以每隔几秒钟手动运行一次,以使写入与读取并行发生(尽管显然速度有所降低),但是放入sync一个while循环使其每五秒钟运行似乎不是正确的解决方案...

内核似乎会缓存大约1GB的数据,然后尽可能快地通过网络将其写出-很好-我只是不明白为什么在通过USB发送数据时为什么需要停止读取慢速磁盘网络。


1
从这个意义上说,大多数Unix工具绝对没有针对带宽进行优化,不是rsync,甚至不是简单的cp。它们是使用阻塞IO的单线程应用程序。
彼得-恢复莫妮卡

1
在纯连续工作负载中,您也可以在现代的普通7200 rpm旋转HDD上看到大约100 MB / s的速度。一旦开始查找(例如用于更新元数据或文件系统已碎片化),它就会下降,因为然后您将成为IOPS绑定的对象。
CVn

可以在NAS上安装rsync吗?
Jasen

Answers:


27

经过更多调查后,看来此问题与内核的相关性较小,而rsync与CIFS 如何交互的更多。

据我所知,正在发生的事情是,当rsync关闭目标文件时,CIFS(可能还有任何网络文件系统)确保在closesyscall返回之前将文件完全刷新并写入远程磁盘。这是为了确保任何应用程序一旦关闭操作成功完成,文件将被完全保存,并且没有任何可能导致数据丢失的错误的风险。

如果不这样做,则应用程序可能会关闭文件,以成功完成保存操作退出,然后稍后(可能由于网络问题)毕竟无法写入数据,但是到那时现在该应用程序对此做任何事情为时已晚,例如询问用户是否要将文件保存在其他位置。

此要求意味着每次rsync完成文件复制后,整个磁盘缓冲区必须先通过网络清空,然后rsync才能继续读取下一个文件。

一种解决方法是使用cache=none禁用该功能的选项来装载CIFS共享,并导致所有I / O直接进入服务器。这消除了问题,并允许并行执行读取和写入操作,但是此解决方案的缺点是性能会有所降低。就我而言,网络传输速度从110MB /秒降至80MB /秒。

这可能意味着,如果要复制大文件,则交替读/写行为的性能可能会更好。对于许多较小的文件,禁用缓存将导致每次关闭文件时减少刷新次数,因此性能可能会提高。

似乎rsync需要一个选项来关闭另一个线程中的文件句柄,因此它可以在仍刷新最后一个文件的同时开始读取下一个文件。

编辑:我已经确认,cache=none当传输大量小文件(将其从10MB /秒提高到80MB /秒)时绝对有帮助,但是当传输大文件(1GB +)时cache=none,传输速度从110MB /秒下降到相同的80MB /秒。这表明从许多小文件的缓慢传输与寻找源磁盘无关,而与从所有小文件获得如此多的缓存刷新有关。


2
那是一个非常有趣的问题,并感谢您发布解释。rsync确实会以不同的线程(实际上是不同的进程)读取文件,因为它被设计rsync为在网络的每一侧都运行一个副本,即使在您的情况下,两个副本都在同一侧(并且文件系统隐藏了该副本)。事实上存在网络)。我猜这无济于事,因为在写入器进程阻塞时,读取器进程非常快地填满了管道close()rsync如果您在线使用rsync而不是CIFS,性能会更好。
西拉达

1
我想,另一种解决方案是您无法rsync在NAS上运行,而是rsync在网络上使用(如rsync -a files localhost:/dest/path),同时以某种方式人为地在网络连接中引入了一个巨大的缓冲区(至少,例如数兆字节)。不确定执行此操作的最佳方法是什么样的。
Celada

@Celada:谢谢!是的,我想rsync在NAS 机壳上运行本身也可以解决此问题。虽然稍微复杂一些(奇怪的NAS权限,必须删除符号链接等),但是如果我要复制的数据更多,那么我认为值得花时间投资。
Malvineous

2
可能与您的情况无关:几年前,我将类似的问题写入dump(8)到通过NFS安装的NAS上。当时,我诊断出问题是由于NFS服务器和NAS上运行的防火墙的综合作用(此框未植根,并且无法完全禁用防火墙)网络界面)。当我们用旧PC取代NAS时,问题就消失了。FWIW。
佐藤桂

@SatoKatsura:绝对可以使用较旧的NAS设备,尽管在那种情况下,我想您会看到整体传输速度较慢,而不是像这样的突发性传输?我的NAS是双核Atom(〜2GHz),当最大化一个不带巨型帧的千兆NIC时,CPU使用率大约为30%,因此应该可以。
Malvineous
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.