如何实现零拷贝形式gRPC c++



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

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

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

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

最新更新