将所有文件传递给 mv 更好还是并行运行一堆 mv 进程更好?

将所有文件传递给 mv 更好还是并行运行一堆 mv 进程更好?

我有三种跑步方式mv。第一的:

mv /db/dbfile1 /db/dbfile2 /db/dbfile3  /usb_storage/

第二:

mv /db/dbfile1  /usb_storage/ &
mv /db/dbfile2  /usb_storage/ &
mv /db/dbfile3  /usb_storage/ &

第三(我认为第一和这是一样的?)

mv /db/dbfile1  /usb_storage/ 
mv /db/dbfile2  /usb_storage/ 
mv /db/dbfile3  /usb_storage/ 

这些方法中哪种更好?为什么?

答案1

如果并行移动文件有任何优点,那么很可能它mv本身就已经这样做了,或者存在类似的工具。 ;)

mv在同一源/目标磁盘上并行运行没有任何意义,因为无论如何您通常都会受到存储介质速度的限制。如果/usb_storage/是 USB 记忆棒,它不会使记忆棒运行得更快。

mv /db/dbfile1 /db/dbfile2 /db/dbfile3 /usb_storage/

应该是最好的方法,因为它会执行您想要的操作,直到完成为止(为了使您的替代方案大致等效,您必须wait在末尾添加 a )。按顺序而不是并行写入文件也有助于防止不必要的文件碎片。

此外,如果/usb_storage/文件大小不足以容纳要移至其中的所有文件,并行工作时您可能会获得至少一个完整的文件,而不是在并行工作时得到三个不完整/无副本。

答案2

并行运行 mv 具有潜在的性能提升:当一个进程等待读取返回时,如果另一个文件在缓存中,它可以直接执行另一个 I/O 请求。此外,IO 调度程序可以对您尝试移动的所有文件的扇区请求进行重新排序,以便 HDD 上的读/写磁头(显然 USB Key 上没有那么多)可以尽可能少地或可能地移动。

也就是说,并行运行的性能优势将非常小,除非您有大量文件系统碎片(为了避免读/写头到处乱窜而受益)。

不过,如果您关心性能,我会确保您的 USB 密钥的调度程序是“noop”,这样当在没有读/写的介质上进行一次性拍摄并不重要时,它就不会花时间重新排序请求头。如果您的常规 HDD 调度程序是 cfq,您还可以尝试使用 ionice magic 将 mv 操作优先于系统中发生的任何其他操作。

相关内容