【问题标题】:splice() for anonymous memory — any performance benefits?splice() 用于匿名内存——任何性能优势?
【发布时间】:2018-04-18 12:10:55
【问题描述】:

根据splice 的手册页,它允许您

在两个文件描述符之间移动数据,而不在内核地址空间和用户地址空间之间复制。

这是否意味着如果将其与匿名内存一起使用会带来任何性能优势,例如从memfd_create返回的fd?

【问题讨论】:

  • 这也取决于另一端。你打算从哪里转移到哪里?
  • @ZangMingJie — 假设 dst 是一个 tcp conn :)
  • 不,你不能在 tcp 和 memfd 之间使用拼接,这些都不是管道。

标签: linux system-calls splice


【解决方案1】:

memory -([vm]splice)-> pipe -(splice)-> socket 可能比 send 或 write 系统调用更有效,因为内核只能转发指针并指示网络卡从源执行 DMA,而不是在假设它们可能被修改的情况下从用户空间缓冲区复制。但是这样做意味着您向内核保证在内存真正从发送队列中耗尽之前不会修改内存,这在调用完成后可能需要任意时间。所以这对于不会被修改的内存非常有用。或者,您可以使用MSG_ZEROCOPY 选项在页面最终发送时接收通知,以便您可以重复使用它。

一般情况下,尽可能使用 sendfile 会更简单

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 2017-03-04
    • 1970-01-01
    • 2017-05-11
    • 2017-09-05
    • 2010-10-20
    相关资源
    最近更新 更多