【问题标题】:High performance ways to stream local files as they're being written to network在将本地文件写入网络时流式传输本地文件的高性能方式
【发布时间】:2020-06-26 07:38:17
【问题描述】:

今天存在一个系统,它会在数据包捕获文件进入时将它们写入本地磁盘。出于容错原因,将这些文件作为第一步删除到本地磁盘被认为是可取的。如果客户端死机并需要重新连接或在其他地方启动,我们可以享受从磁盘重播的能力。

数据管道的下一步是尝试将这些登陆到磁盘的数据发送到远程客户端。假设有足够的磁盘空间,我觉得使用本地磁盘(以及它上面的页面缓存)作为持久的无限先进先出非常方便。还希望使用文件系统来保持生产者和消费者之间的低耦合。

在我的研究中,我没有找到很多关于这种架构的指导。更具体地说,我没有在流行的开源库/框架中看到用于在文件被写入流式传输时读取文件的成熟模式。

我的问题:

  1. 此架构中是否存在我没​​有注意到或间接淡化的缺陷?

  2. 是否有建议在文件写入时使用它,并在文件中有更多可用数据时有效地阻塞和/或异步通知?

  3. 目标是显式或隐式地让消费者从页面缓存温暖中受益。有没有关于如何对此进行优化的建议?

【问题讨论】:

    标签: c++ file-io streaming posix disk-io


    【解决方案1】:

    基于文件的解决方案听起来很笨拙,但可以工作。类似于tail -f 的做法:

    • read 文件直到 EOF,但不要关闭它
    • 设置一个inode watch(使用inotify),等待更多的写入
    • 重复

    困难通常在于文件轮换和清理,即您需要注意新文件和/或截断。

    话虽如此,直接连接到数据包捕获接口可能更有效,或者设置一个客户端可以订阅的queue

    【讨论】:

    • 抓包接口其实是多个接口。即使是单独的这些管线也可能成为消防水带,并且担心可能需要断言背压并危及捕获的其他来源。除此之外,发送到网络也应该是无损的——如果代价是一些可以接受的传输延迟。
    • 关于您对 inotify 的建议 - 这在结构上是有道理的。令我惊讶的是,似乎没有预先打包的工具来适应这种用例(可能是使用 inotify)。 1)是否有任何推荐的开源库来包装这种功能? 2) 是否有充分的理由尚未结束?我可以自己投资建造它,但从历史上看,当这样的原始物不存在时,它就成了一种气味。
    • 外部库推荐在 StackOverflow 上是题外话。快速搜索显示:notify-cpp。我个人不喜欢它。
    猜你喜欢
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多