Python GRPC Server性能瓶颈

时间:2020-02-12 05:53:53

标签: python grpc grpc-python

我写了一个包含多个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. 如何改善我的表现?在线程池执行器中添加更多max_workers会有所帮助吗?

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

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

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

1 个答案:

答案 0 :(得分:3)

您描述的性能问题听起来像是并发问题。 gRPC Python服务器使用ThreadExecutor来处理RPC,并增加工作线程的数量应能够允许更多并发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()
相关问题