【问题标题】:Python GRPC Server performance bottleneckPython GRPC 服务器性能瓶颈
【发布时间】:2020-05-27 15:14:25
【问题描述】:

我编写了一个包含多个 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()

我的问题是:

  1. 如何提高我的表现?在 threadpoolexecutor 中添加更多 max_workers 会有帮助吗?

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

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

我想知道您如何诊断您的 python grpc 服务器,以便您知道需要改进的地方?

【问题讨论】:

    标签: python grpc grpc-python


    【解决方案1】:

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

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

    对于问题 2,cProfile、yep 和 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()
    

    【讨论】:

    • 感谢您的回复。只是想问一下,在grpc服务器中运行cProfile的正确方法是什么?假设我想分析每个 rpc 服务,或者我应该只分析以 main 作为入口点的类。另外,如何测量响应流的大小以确定它是否为 KB 级别。
    • 运行 cProfile 的方式:gRPC 服务器是一个多线程应用程序,这意味着您需要检测每个单线程。或者,您可以使用自动为您执行此操作的开源版本:github.com/sumerc/yappi 响应流:len(response.SerializeToString())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2016-06-12
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多