【问题标题】:Shared memory for grpc client and servergrpc客户端和服务器的共享内存
【发布时间】:2018-05-13 01:12:47
【问题描述】:

我的项目是读取服务器中的图像,进行一些处理,然后将整个图像传递给客户端。客户端占用图像并进行更多处理并将一些输出值返回给服务器。服务器和客户端之间使用的图像大小为 [640x480x3]。

以下是我想到的解决此问题的各种技术:

  1. 通过从服务器到客户端的消息传递整个像素值
    • 从一台服务器向一个客户端发送一条消息需要75ms,即使它们在同一个系统中! (绝不是一个好主意)
  2. 将整个图像分割成块,然后使用流从服务器向客户端发送消息。
    • 在 SO 中有各种答案。我目前正在努力让这个工作。
  3. 将像素值分配给服务器和客户端中 gRPC 识别的variable。换句话说,将图像放在 gRPC 的共享内存中,服务器和客户端都可以访问该内存(假设服务器和客户端都在同一个系统中)。
    • 这种服务器和客户端之间的消息传递模式是否可行?如果是,请提供一些对文档的引用或相同的示例。

【问题讨论】:

    标签: grpc


    【解决方案1】:

    gRPC(目前)不支持任何语言 API 中同一系统上不同进程之间的任何类型的共享内存传输。一个紧密的变体是 C++ 和 Java 支持的进程内传输。这用于在同一进程中的客户端和服务器之间发送消息(例如,如果您想在与可能也具有直接外部接口的服务器相同的地址空间中运行代理),并且两者之间的唯一区别是这种和传统的 gRPC 操作是在两种语言的通道创建以及在 Java 中构建服务器时。这方面的 Java 文档位于 https://grpc.io/grpc-java/javadoc/io/grpc/inprocess/InProcessServerBuilder.html 。对于 C++,您只需在服务器上调用 Server::InProcessChannel 而不是 grpc::CreateChannel,因为只要您有指针,所有服务器都会自动在 C++ 中具有进程内功能。

    希望有帮助!

    @vjpai

    【讨论】:

    【解决方案2】:

    我会说你不应该使用 gRPC。您的问题在我看来更像是分布式图像处理。我建议将 FPGA 用于此类事情。另一个使用 CPU 的解决方案可能是 R/DMA。使用 DMA,您只需绕过 CPU 并直接使用其内存。两个 CPU 都可以通过 gRPC 相互通信。假设您有 2 台服务器。服务器 A 有图像,服务器 B 想要它。服务器 B 通过 gRPC 请求指针地址,服务器 A 给他地址,服务器 B 通过 DMA 得到它。如果您使用 RDMA,请确保您拥有高速低延迟网络解决方案。具有 10 Gbit/s 或更高速率和纳秒延迟。两种解决方案都适用于更大的图像。如果您只想发送较小的图像,请使用一些文件传输协议。

    【讨论】:

      猜你喜欢
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-28
      相关资源
      最近更新 更多