【问题标题】:How to implement zero-copy form gRPC c++如何实现零拷贝形式的gRPC c++
【发布时间】:2021-07-21 09:52:14
【问题描述】:

我想编写一个 gRPC 服务器(c++),在某些情况下用作 FTP 服务器。具体来说,客户端通过文件名请求文件,而服务器返回文件内容(如果存在)。在传统的socket编程中,我可以利用sendfile为linux系统实现零拷贝。这意味着文件内容将直接从磁盘进入套接字缓冲区,而无需在用户空间中传输。但在 gRPC 世界中,套接字详细信息是隐藏的,这意味着您可能无法访问 sendfile 所需的套接字后面的文件描述符:

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

因此,我必须先将文件字节读入内存,然后在 gRPC 响应中返回。这是不必要的性能损失。我想知道是否有任何 API 或解决方法。

【问题讨论】:

  • 没有用于此的 API。 gRPC 不是零拷贝。

标签: c++ linux grpc zero-copy


【解决方案1】:

直接在低级 grpc 套接字上执行sendfile 没有多大意义,因为 grpc 协议本身将围绕正在发送的数据进行大量框架。您的数据将自然地分块并可能与其他控制数据复用。因此,没有 API 可以做你想做的事。

【讨论】:

  • 在我的情况下,服务器接收来自客户端的带有文件名的请求,如果存在则返回文件内容。大多数文件都很大,如果将数据从磁盘复制到内存,然后从内存复制到网络,可能会导致性能损失。这就是为什么我需要 sendfile 并且我认为它没有意义。我认为在这种情况下 gRPC 可能是不合适的选择。
猜你喜欢
  • 2015-08-23
  • 2017-07-06
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多