添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Python GRPC服务器的性能瓶颈

5 人关注

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

它连接到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()

我的问题是。

  • 我怎样才能提高我的性能? 在threadpoolexecutor中添加更多的max_workers是否有帮助?

  • 我怎样才能诊断出问题,并分离出导致速度减慢的原因?

  • 我在想,在这种情况下,响应的大小是否重要,因为我是以字节为单位流向客户端的。 有什么方法可以测量响应的大小,或者在python grpc中它是否重要?

  • 我想知道你是如何诊断你的Python grpc服务器的,这样你就会知道哪里需要改进?

    python
    grpc
    grpc-python
    Mark Estrada
    Mark Estrada
    发布于 2020-02-12
    1 个回答
    Lidi Zheng
    Lidi Zheng
    发布于 2020-02-13
    已采纳
    0 人赞同

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

    grpc.server(futures.ThreadPoolExecutor(max_workers=1000))
    

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

    对于问题3,回答的大小并不那么重要(KB级)。

    另一方面,我们正在开发一个AsyncIO版本的gRPC Python。它有明显的性能提升,并解决了有限的并发RPC问题。它目前是实验性的,但可以随时试用。

    from grpc.experimental import aio
    class Servicer(...):
        async def ServerStreamingMethodHandler(...):
            for ...:
                yield response
    async def startServer():
        global server