Python GRPC Server 性能瓶颈

Mar*_*ada 7 python grpc grpc-python

我写了一个grpc服务器,其中包含多个rpc服务。有些是一元的,有些是服务器端流。

它连接到 grpc kubernetes 服务器,因此我使用 python kubernetes 客户端来查询服务器

目前,我遇到了一些性能问题,因为我认为如果有多个请求进来,它会缓冲每个工作人员在可以服务传入请求之前完成。

def startServer():
    global server
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    servicer_grpc.add_Servicer_to_server(Servicer(), server)
    server.add_insecure_port('[::]:' + str(port))
    server.start()
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 我怎样才能提高我的表现?在 threadpoolexecutor 中添加更多 max_workers 会有帮助吗?

  2. 如何诊断问题并找出导致速度变慢的原因?

  3. 我在想在这种情况下响应的大小是否重要,因为我正在将字节串流式传输到客户端。有没有办法测量响应的大小,或者在 python grpc 中这很重要吗?

我想知道你如何诊断你的 python grpc 服务器,以便你知道哪里需要改进?

Lid*_*eng 3

您描述的性能问题听起来像是并发问题。gRPC Python服务器使用ThreadExecutor来处理RPC,增加worker的数量应该能够允许更多的并发RPC。

grpc.server(futures.ThreadPoolExecutor(max_workers=1000))
Run Code Online (Sandbox Code Playgroud)

对于问题 2,像 cProfile 这样的分析器perf是调试性能问题的强大工具。

对于问题 3,响应的大小并不重要(KB 级)。

另一方面,我们正在开发 gRPC Python 的 AsyncIO 版本。它具有显着的性能提升,并解决了并发 RPC 受限的问题。目前它还处于实验阶段,但请随意尝试一下。

from grpc.experimental import aio

class Servicer(...):
    async def ServerStreamingMethodHandler(...):
        for ...:
            yield response

async def startServer():
    global server
    server = aio.server()
    servicer_grpc.add_Servicer_to_server(Servicer(), server)
    server.add_insecure_port('[::]:' + str(port))
    await server.start()
Run Code Online (Sandbox Code Playgroud)