标签: grpc-python

Python GRPC Server 性能瓶颈

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

它连接到 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()
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 我怎样才能提高我的表现?在 threadpoolexecutor 中添加更多 max_workers 会有帮助吗?

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

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

我想知道你如何诊断你的 python grpc 服务器,以便你知道哪里需要改进?

python grpc grpc-python

7
推荐指数
1
解决办法
5989
查看次数

为什么多进程 python grpc 服务器不起作用?

我通过多进程池为每个子进程实例化一个 grpc 服务器。当我使用多个客户端访问服务器时,发现以下两个问题?

  • 所有客户端访问相同的服务器子进程
  • 客户端引发 MaybeEncodingError

顺便说一下,我的开发环境是:

[OS]
ProductName:    Mac OS X
ProductVersion: 10.14.6
BuildVersion:   18G5033

[packages]
grpcio = '1.30.0'
grpcio-tools = '1.30.0'
multiprocess = "0.70.10"
grpcio-status = "1.30.0"
googleapis-common-protos = "1.52.0"

[requires]
python_version = "3.8.3"
Run Code Online (Sandbox Code Playgroud)

这是服务器输出:

[PID 83287] Binding to 'localhost:52909'
[PID 83288] Starting new server.
[PID 83289] Starting new server.
[PID 83290] Starting new server.
[PID 83291] Starting new server.
[PID 83292] Starting new server.
[PID 83293] Starting new server.
[PID 83294] Starting new server.
[PID 83295] Starting …
Run Code Online (Sandbox Code Playgroud)

python multiprocess python-3.x grpc grpc-python

7
推荐指数
1
解决办法
2598
查看次数

将 retryPolicy 与 python GRPC 客户端一起使用

我真的很努力地尝试使用 GRPC 文档的嵌入 retryPolicy(https://github.com/grpc/proposal/blob/master/A6-client-retries.md#retry-policy),但我不明白我应该在哪里在我的代码中设置配置。
理想情况下,我希望 python 客户端指定其重试策略,但我也有兴趣了解如何从服务器端管理它。

经过一番挖掘,我想出了这个剪断,但它不起作用。

import json
from grpc import insecure_channel

service_default_config = {
    # see https://github.com/grpc/proposal/blob/master/A6-client-retries.md#retry-policy-capabilities
    "retryPolicy": {
        "maxAttempts": 5,
        "initialBackoff": "1s",
        "maxBackoff": "10s",
        "backoffMultiplier": 2,
        "retryableStatusCodes": [
            "RESOURCE_EXHAUSTED",
            "UNAVAILABLE"
        ]
    }
}
service_default_config = json.dumps(service_default_config)

options = [
    ('grpc.service_config', service_default_config)
]

insecure_channel(hostname, options=options)
Run Code Online (Sandbox Code Playgroud)

谁能指出我的相关文档,让我了解这是如何工作的,或者向我解释我的误解?

grpc grpc-python

7
推荐指数
1
解决办法
1172
查看次数

如何在Python中热重载grpc-server?

我正在使用 grpc 开发一些 python 微服务,并且使用 docker 作为 cassandra 数据库和微服务。有没有办法在 docker-compose 中设置更改时重新加载?

我猜测首先我需要将代码安装为卷,但我没有看到像 Flask 那样在 GRPC 服务器上重新加载的方法。

python docker grpc grpc-python

7
推荐指数
1
解决办法
2183
查看次数

如何从 setuptools 安装程序 (setup.py) 中生成 python grpc 代码?

我们在一个 repo 中有一些 gRPC 的 proto 文件,我读到提交生成的代码并不好。所以我想我需要将生成作为包安装的一部分(例如 setuptools、setup.py)

但是,要生成 gRPC 代码,您需要先pip install grpcio-tools根据docs运行安装包。但是 setup.py 的目的是自动下拉依赖,比如grpcio-tools

那么是否有这样做的最佳实践?如在,如何从 setuptools 中生成依赖于另一个 python 包的代码?我最好创建一个单独的build.sh脚本来手动 pip-installs 并生成代码吗?或者我应该期望软件包的用户已经安装了grpcio-tools吗?

python setuptools grpc grpc-python

6
推荐指数
1
解决办法
1919
查看次数

跟踪 grpc 服务器中的请求队列

GRPC 服务器确实对请求进行排队,并根据服务器启动时传递的 maxWorker 配置来为它们提供服务。如何打印队列中项目的指标数量?本质上,我想跟踪处于等待状态的请求数量。

grpc grpc-java grpc-python

6
推荐指数
1
解决办法
3526
查看次数

如何检查连接到GRPC服务器的客户端

为了为我的GRPC服务器/客户端设置提供更好的调试信息,我试图找到一个API,grpc.server该API 可让我检查哪些客户端连接到服务器。

我发现的最有希望的问题是问题,它为如何在Java GRPC中执行此操作提供了一个起点。但是,Python GRPC实现中不存在Java API。

到目前为止,我使用中的context.peer()方法跟踪唯一的对等项grpc.ServicerContext。如果对等端在一段时间内未发送请求(超时设置为2秒),则认为客户端已断开连接。

我已经开始查看python-grpc源代码,但没有取得任何进展。

如果有人知道我可以使用python中的类似API,将不胜感激!即使是内部API也足以满足这些调试需求。

python-3.x grpc grpc-python

6
推荐指数
1
解决办法
415
查看次数

Grpc 不增加消息的最大大小:收到的消息大于最大值

我正在使用 grpc 发送一些非常大的消息(网络上机器学习模型的参数)。问题是当我进行 grpc 调用时出现以下错误:

grpc: received message larger than max (261268499 vs. 4194304)
Run Code Online (Sandbox Code Playgroud)

正如其他帖子中所建议的,我尝试增加通道和 grpc 服务器上的最大消息大小,但我一直收到相同的错误。关于如何让它发挥作用的任何想法?

我的服务器代码:

maxMsgLength = 1024 * 1024 * 1024
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10),
                     options=[('grpc.max_message_length', maxMsgLength),
                              ('grpc.max_send_message_length', maxMsgLength),
                              ('grpc.max_receive_message_length', maxMsgLength)])
Run Code Online (Sandbox Code Playgroud)

客户端:

maxMsgLength = 1024 * 1024 * 1024
channel = grpc.insecure_channel(ip_port, 
                                options=[('grpc.max_message_length', maxMsgLength),
                                         ('grpc.max_send_message_length', maxMsgLength),
                                         ('grpc.max_receive_message_length', maxMsgLength)])
Run Code Online (Sandbox Code Playgroud)

编辑:

不是解决方案,但也许可以更深入地了解问题。出于某种原因,如果我将最大消息大小设置为 1024 * 1024 * 1024,它最终会默认为 4194304,正如错误消息所暗示的那样。不太确定为什么会这样。但无论如何,我尝试将最大消息大小减小到 1024 * 1024 * 200,它在错误消息 (209715200) 中显示了正确的最大消息大小。似乎存在 grpc 未正确设置最大消息大小的问题。不知道如何解决这个问题。

在错误消息显示正确最大值的情况下,我可以使用的最大数量是 2^28。如果我将最大消息大小设置为 2^29,则默认为 4194304。

python grpc grpc-python

6
推荐指数
1
解决办法
708
查看次数

python asyncio gRPC 客户端的多线程支持

我有一个在多线程环境中使用的 asyncio gRPC 客户端。当多个线程同时通过客户端连接到服务时,我看到以下错误流:

2021-01-27 09:33:56,937 错误 [asyncio] [thread_0] 回调 PollerCompletionQueue._handle_events()() 中出现异常
处理: )()>
回溯(最近一次调用最后一次):
  文件“/usr/local/lib/python3.8/asyncio/events.py”,第 81 行,在 _run 中
    self._context.run(self._callback, *self._args)
  文件“src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi”,第 147 行,位于 grpc._cython.cygrpc.PollerCompletionQueue._handle_events 中
BlockingIOError:[Errno 11] 资源暂时不可用
2021-01-27 09:33:56,937 错误 [asyncio] [thread_1] 回调 PollerCompletionQueue._handle_events()() 中出现异常
处理: )()>
回溯(最近一次调用最后一次):
  文件“/usr/local/lib/python3.8/asyncio/events.py”,第 81 行,在 _run 中
    self._context.run(self._callback, *self._args)
  文件“src/python/grpcio/grpc/_cython/_cygrpc/aio/completion_queue.pyx.pxi”,第 147 行,位于 grpc._cython.cygrpc.PollerCompletionQueue._handle_events 中
BlockingIOError:[Errno 11] 资源暂时不可用

这些请求似乎已成功完成,但是,这些消息充斥着我的日志,让我感到紧张!

在我的测试中,每个线程创建自己的通道并提交自己的异步请求。无论服务负载如何,都会发生错误。如果客户端在不同进程中运行,则不会发生错误。

我的设置:

  • Python版本:3.8.6
  • grpcio版本:1.35.0

任何见解表示赞赏!

python python-multithreading python-asyncio grpc grpc-python

6
推荐指数
1
解决办法
3549
查看次数

Python gprc AttributeError:“NoneType”对象没有属性“message_types_by_name”

我只想完成一个简单的演示,但收到此错误消息。

Traceback (most recent call last):
  File "E:/grpc/biliService.py", line 10, in <module>
    import hello_bilibili_pb2 as pb2
  File "E:\grpc\hello_bilibili_pb2.py", line 21, in <module>
    _HELLODEWEIREQ = DESCRIPTOR.message_types_by_name['HelloDeweiReq']
AttributeError: 'NoneType' object has no attribute 'message_types_by_name'
Run Code Online (Sandbox Code Playgroud)

grpc-python

6
推荐指数
1
解决办法
6785
查看次数