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

C 如何避免物理磁盘I/O,c,linux,memory,disk,C,Linux,Memory,Disk,我有一个通过网络写入大量数据的过程。假设它在机器A上运行,并通过NFS在机器B上转储大约70-80GB的文件。进程1完成并退出后,我的进程2运行机器A并通过NFS从机器B获取此文件。整个周期中的瓶颈是这个巨大数据文件的写入和读取。我怎样才能减少这个 I/O时间?我是否可以以某种方式将加载的数据保留在内存中,以便在进程1退出后由进程2使用 我希望你能给我一些建议。谢谢 编辑:由于进程2直接从网络“读取”数据,因此 是否先在本地复制数据,然后从本地磁盘读取? 我的意思是会 (通过网络读取时间)>(c

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

我希望你能给我一些建议。谢谢

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

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

如果您希望将数据加载到内存中,则需要70-80 GB的RAM

最好是将本地存储(硬盘驱动器)连接到系统a,以便本地保存此文件

  • 您可以使用RAM磁盘作为存储
  • NFS速度很慢。尝试使用另一种方法将数据传输到另一台PC。示例-TCP/IP流
  • 另一个解决方案-您可以使用inmemory数据库(示例为TimesTen)
  • 用于将内存用作(临时)文件

    与一起使用可在不存储中间流的情况下,简单地从一个端口中继到另一个端口,但仍允许以不同的速度进行流传输:

    机器1:8001->机器2:8002->机器3:8003

    在machine2上,配置如下作业:

     netcat -l -p 8002 | mbuffer -m 2G | netcat machine3 8003
    
    这将允许缓冲最多2 Gig的数据。如果缓冲区已满100%,machine2将开始阻止machine1的读取,延迟输出流而不会失败


    当machine1完成传输时,第二个
    netcat
    将一直存在,直到mbuffer耗尽

    使用这种方法会产生大量的网络和IO开销。因此,您可能无法进一步降低延迟

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

  • 无论您是使用
    mmap
    还是普通
    读取
    /
    写入
    都应该没有什么区别;无论哪种方式,一切都是通过文件系统缓存/缓冲区进行的。最大的问题是NFS。唯一有效的方法是将中间数据本地存储在机器A上,而不是通过网络将其发送到机器B,然后再将其拉回来。

    为什么不将文件保存在机器A上?可以将数据直接从进程1传输到进程2吗?这是一个很好的观点。是否有安全挂载,我可以用作本地存储?我可能没有“cwd”中的写入权限…共享内存大小有一个上限。我认为默认值是32MB。有没有办法通过我的应用程序增加它?您可以通过
    ipcs-l
    查看限制,也可以通过
    /etc/sysctl.conf
    更改限制。设置
    kernel.shmmax=
    并执行
    sysctl-p
    。您只能以root用户身份执行此操作。虽然
    \u sysctl()
    可以通过应用程序实现这一点,但不推荐使用此函数。