我有一个通过网络写入大量数据的过程。假设它在机器A上运行,并通过NFS在机器B上转储大约70-80GB的文件。在进程1完成并退出后,我的进程2运行机器A并通过NFS从机器B获取该文件。整个周期的瓶颈是写入和读取这个巨大的数据文件。我怎样才能减少这一点 I / O时间?我可以以某种方式将数据加载到内存中,即使在进程1退出后也可以由进程2使用吗?
我很欣赏这方面的想法。感谢。
编辑:由于进程2'直接从网络读取'数据,它会更好 首先在本地复制数据,然后从本地磁盘读取? 我的意思是 (通过网络读取时间)> (cp到本地磁盘)+(从本地磁盘读取)
答案 0 :(得分:2)
如果你想将数据保存在内存中,那么你需要70-80 GB的RAM。
最好的办法是将本地存储(硬盘驱动器)连接到系统A,以便将此文件保存在本地。
答案 1 :(得分:1)
显而易见的答案是减少网络写入 - 这似乎可以节省指数级别的时间并提高可靠性 - 将任何文件复制到另一台计算机上只是为了将其复制回来似乎没什么意义,为了更准确地回答您的问题,我们需要更多信息。
答案 2 :(得分:1)
这种方法有很多网络和IO开销。因此,您可能无法进一步减少延迟。
答案 3 :(得分:1)
无论您使用mmap
还是普通read
/ write
都应该没什么区别;无论哪种方式,一切都通过文件系统缓存/缓冲区发生。最大的问题是NFS。实现这一目标的唯一方法是将中间数据本地存储在机器A上,而不是通过网络将其全部发送到机器B,只是在之后再将其拉回。
答案 4 :(得分:0)
答案 5 :(得分:0)
使用tmpfs将内存用作(临时)文件。
使用mbuffer和netcat简单地从一个端口中继到另一个端口而不存储中间流,但仍然允许以不同的速度进行流式传输:
machine1:8001 - > machine2:8002 - > machine3:8003
在machine2上配置如下作业:
netcat -l -p 8002 | mbuffer -m 2G | netcat machine3 8003
这将允许缓冲最多2 gig的数据。如果缓冲区被100%填充,则machine2将开始阻止从machine1读取,从而延迟输出流而不会失败。
当machine1完成传输时,第二个netcat
将保持不变,直到mbuffer耗尽