如何避免物理磁盘I / O.

时间:2011-08-23 10:44:44

标签: c linux memory disk

我有一个通过网络写入大量数据的过程。假设它在机器A上运行,并通过NFS在机器B上转储大约70-80GB的文件。在进程1完成并退出后,我的进程2运行机器A并通过NFS从机器B获取该文件。整个周期的瓶颈是写入和读取这个巨大的数据文件。我怎样才能减少这一点 I / O时间?我可以以某种方式将数据加载到内存中,即使在进程1退出后也可以由进程2使用吗?

我很欣赏这方面的想法。感谢。

编辑:由于进程2'直接从网络读取'数据,它会更好 首先在本地复制数据,然后从本地磁盘读取? 我的意思是 (通过网络读取时间)> (cp到本地磁盘)+(从本地磁盘读取)

6 个答案:

答案 0 :(得分:2)

如果你想将数据保存在内存中,那么你需要70-80 GB的RAM。

最好的办法是将本地存储(硬盘驱动器)连接到系统A,以便将此文件保存在本地。

答案 1 :(得分:1)

显而易见的答案是减少网络写入 - 这似乎可以节省指数级别的时间并提高可靠性 - 将任何文件复制到另一台计算机上只是为了将其复制回来似乎没什么意义,为了更准确地回答您的问题,我们需要更多信息。

答案 2 :(得分:1)

这种方法有很多网络和IO开销。因此,您可能无法进一步减少延迟。

  1. 由于文件超过80 GB,因此创建一个mmap,进程1将写入,以后进程2可以从中读取 - 不涉及网络,仅使用机器A - 但仍然是IO开销是不可避免的。
  2. 更快:两个进程可以同时运行,您可以拥有信号量或其他信令机制,其中进程1可以指示进程2文件已准备好被读取。
  3. 最快的方法:让进程1创建一个共享内存并与进程2共享它。每当达到一个限制(可以根据你的RAM大小加载到内存中的最大数据块)时,让进程1信号进程2可以读取和处理数据 - 只有当文件/数据实际上可以通过块而不是80GB的大块处理时,这个解决方案才会生效。

答案 3 :(得分:1)

无论您使用mmap还是普通read / write都应该没什么区别;无论哪种方式,一切都通过文件系统缓存/缓冲区发生。最大的问题是NFS。实现这一目标的唯一方法是将中间数据本地存储在机器A上,而不是通过网络将其全部发送到机器B,只是在之后再将其拉回。

答案 4 :(得分:0)

  1. 您可以将RAM磁盘用作存储
  2. NFS很慢。尝试使用替代方法将数据传输到另一台PC。对于示例 - TCP / IP流。
  3. 另一种解决方案 - 您可以使用内存数据库(TimesTen for sample)

答案 5 :(得分:0)

使用tmpfs将内存用作(临时)文件。

使用mbuffernetcat简单地从一个端口中继到另一个端口而不存储中间流,但仍然允许以不同的速度进行流式传输:

  

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耗尽