我写了一个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)
我的问题是:
我怎样才能提高我的表现?在 threadpoolexecutor 中添加更多 max_workers 会有帮助吗?
如何诊断问题并找出导致速度变慢的原因?
我在想在这种情况下响应的大小是否重要,因为我正在将字节串流式传输到客户端。有没有办法测量响应的大小,或者在 python grpc 中这很重要吗?
我想知道你如何诊断你的 python grpc 服务器,以便你知道哪里需要改进?
我通过多进程池为每个子进程实例化一个 grpc 服务器。当我使用多个客户端访问服务器时,发现以下两个问题?
顺便说一下,我的开发环境是:
[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) 我真的很努力地尝试使用 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 开发一些 python 微服务,并且使用 docker 作为 cassandra 数据库和微服务。有没有办法在 docker-compose 中设置更改时重新加载?
我猜测首先我需要将代码安装为卷,但我没有看到像 Flask 那样在 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吗?
GRPC 服务器确实对请求进行排队,并根据服务器启动时传递的 maxWorker 配置来为它们提供服务。如何打印队列中项目的指标数量?本质上,我想跟踪处于等待状态的请求数量。
为了为我的GRPC服务器/客户端设置提供更好的调试信息,我试图找到一个API,grpc.server该API 可让我检查哪些客户端连接到服务器。
我发现的最有希望的问题是问题,它为如何在Java GRPC中执行此操作提供了一个起点。但是,Python GRPC实现中不存在Java API。
到目前为止,我使用中的context.peer()方法跟踪唯一的对等项grpc.ServicerContext。如果对等端在一段时间内未发送请求(超时设置为2秒),则认为客户端已断开连接。
我已经开始查看python-grpc源代码,但没有取得任何进展。
如果有人知道我可以使用python中的类似API,将不胜感激!即使是内部API也足以满足这些调试需求。
我正在使用 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。
我有一个在多线程环境中使用的 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] 资源暂时不可用
这些请求似乎已成功完成,但是,这些消息充斥着我的日志,让我感到紧张!
在我的测试中,每个线程创建自己的通道并提交自己的异步请求。无论服务负载如何,都会发生错误。如果客户端在不同进程中运行,则不会发生错误。
我的设置:
3.8.6grpcio版本:1.35.0任何见解表示赞赏!
python python-multithreading python-asyncio grpc grpc-python
我只想完成一个简单的演示,但收到此错误消息。
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 ×10
grpc ×9
python ×6
python-3.x ×2
docker ×1
grpc-java ×1
multiprocess ×1
setuptools ×1