我写了一个包含多个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()
我的问题是:
如何改善我的表现?在线程池执行器中添加更多max_workers会有所帮助吗?
如何诊断问题并找出导致速度下降的原因?
在这种情况下,我正在考虑响应的大小是否重要,因为我正在向客户端传输字节串。 有没有办法测量响应的大小,或者在python grpc中有关系吗?
我想知道您如何诊断python grpc服务器,以便您知道需要改进的地方?
答案 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()