为了账号安全,请及时绑定邮箱和手机立即绑定

Python GRPC 服务器性能瓶颈

Python GRPC 服务器性能瓶颈

德玛西亚99 2022-07-26 10:35:05
我编写了一个包含多个 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 服务器,以便您知道哪里需要改进?
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

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


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

对于问题 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()


查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号