如果我们必须写入内存中已有的数据,sendfile 会更好吗?

would sendfile be better if we have to write data that is already in memory?

提问人:Rajat Aggarwal 提问时间:10/27/2023 更新时间:10/27/2023 访问量:47

问:

我在用户空间内存缓冲区中有一些数据,我想通过套接字发送。我正在阅读有关 Linux 中的零拷贝的信息,想知道在这种情况下是否可以使用它或在此处进行任何可能的优化。

char buff[buffer_size]; // buffer already in memory (user space)
while (condition) {
  buff[(i++) % buffer_size] = 1; // do some changes in buffer
  write(sockfd, buff, buffer_size); // can we use sendfile here? would it give benefit?
}
C 套接字 sendfile

评论

2赞 tadman 10/27/2023
提示在名称中:发送文件。它绕过了文件 -> OS 缓冲区 -> 用户空间 -> 内核 -> 网络堆栈混乱,只是有效地将文件 -> 内核 -> 网络堆栈。如果你在用户空间中已经有一些东西,那就无济于事了。sendfile
0赞 Rajat Aggarwal 10/27/2023
@tadman我所理解的上面的代码正在通过数据(用户空间)->内核->网络堆栈,我问是否可以在我的情况下删除任何步骤?
1赞 tadman 10/27/2023
除非您编写在内核中运行的代码,否则您不会获得“内核中的内存块”。它始终是用户空间内存,尤其是在您操作它时。您不能从用户空间代码中更改任意内核内存。
1赞 tadman 10/27/2023
在这里,您可以优化的内容只有这么多。如果此数据位于内存映射文件中,那么也许您可以将其视为常规调用,但这很少是可行的路径。如今,大多数数据在传输过程中都是加密的,这意味着无论如何您都需要通过 TLS 流来提供这些数据。sendfile
1赞 Andrew Henle 10/28/2023
@tadman Linux 确实有 memfd_create():“与普通文件不同,它位于 RAM 中,并具有易失性备份存储......”了解 Linux 和 glibc,它可能只是一个在文件系统中使用 'd 文件的 hack,但它有可能在后台做一些有用的事情。mmap()tmpfs

答: 暂无答案