我正在尝试在我的生产服务器中使用以下代码(我想将其扩展到 500 TPS 以上)。当我用许多请求淹没服务器时,我面临以下问题。在 1000 个请求中至少有 1 个请求中,channel.close() 调用需要 10-10.5 秒。我在 Flask 服务器上运行代码。目前,对于每个请求,我都在创建一个频道并关闭它。请帮我解决一下这个。
channel = grpc.insecure_channel(serving_address)
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = predict_pb2.PredictRequest()
request.model_spec.name = model_name
request.model_spec.signature_name = 'serving_default'
request.inputs['model_2_input'].CopyFrom(
make_tensor_proto_engine(img_array, dtype=1, shape=[1, 224, 224, 3]))
result = stub.Predict(request, 6.0)
channel.close()
Run Code Online (Sandbox Code Playgroud) 我正在使用 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服务,客户端代码。有时,客户端会突然失败并显示以下错误:
Traceback (most recent call last):
File "grpc_client.py", line 35, in <module>
response = stub.YOLO_frame(image_req)
File "/home/vmuser/anaconda3/envs/lp_reg_brta/lib/python3.7/site-packages/grpc/_channel.py", line 923, in __call__
return _end_unary_response_blocking(state, call, False, None)
File "/home/vmuser/anaconda3/envs/lp_reg_brta/lib/python3.7/site-packages/grpc/_channel.py", line 826, in _end_unary_response_blocking
raise _InactiveRpcError(state)
grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
status = StatusCode.UNAVAILABLE
details = "failed to connect to all addresses"
debug_error_string = "{"created":"@1613478605.328638006","description":"Failed to pick subchannel","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":5390,"referenced_errors":[{"created":"@1613478605.328628806","description":"failed to connect to all addresses","file":"src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc","file_line":397,"grpc_status":14}]}"
>
Run Code Online (Sandbox Code Playgroud)
我的服务器:
import grpc
from concurrent import futures
import time
import darknet
# import the generated classes …Run Code Online (Sandbox Code Playgroud) 我部署了一个为多个模型提供服务的张量流服务器。客户端代码是这样的client.py,我调用预测函数。
channel = implementations.insecure_channel(host, port)
stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)
request = predict_pb2.PredictRequest()
def predict(data, shape, model_name, signature_name="predict"):
request.model_spec.name = model_name
request.model_spec.signature_name = signature_name
request.inputs['image'].CopyFrom(tf.contrib.util.make_tensor_proto(data, shape=shape))
result = stub.Predict(request, 10.0)
return result.outputs['prediction'].float_val[0]
Run Code Online (Sandbox Code Playgroud)
我有大约 100 个具有相同配置的客户端。这是调用该predict函数的示例代码:
from client import predict
while True:
print(predict(data, shape, model_name))
# time.sleep some while
Run Code Online (Sandbox Code Playgroud)
首先,当我运行客户端代码时,我可以正确收到响应。但几个小时后,客户端因错误而崩溃
_Rendezvous of RPC that terminated with (StatusCode.UNAVAILABLE, Socket closed)
Run Code Online (Sandbox Code Playgroud)
我尝试将我的客户端代码修改为
def predict(data, shape, model_name, signature_name="predict"):
channel = implementations.insecure_channel(host, port)
stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)
request …Run Code Online (Sandbox Code Playgroud) 我正在尝试想出更好的方法来处理 grpc 中 4mb 消息大小的限制。我需要一种方法来测量客户端收到的 grpc 响应的大小。当响应超过 4mb 限制时,grpc 将显示如下错误消息:
无法问候:rpc 错误:代码 = ResourceExhausted desc = grpc:收到的消息大于最大值(74000087 与 4194304)
“74000087”是响应的实际大小。这是如何计算的?有没有办法获得这个值?
我已经阅读了有关该主题的多篇文章,但什么也没找到?有人可以帮忙吗?谢谢。
我的实现是使用golang
我正在尝试从 Python 客户端调用在 .Net Core 项目上运行的 GRPC 服务器。
当针对localhost:5001它运行时工作正常,但针对同一网络内机器的实际 IP 运行时,192.168.1.230:5001它不起作用,并且出现错误DNS resolution failed。
我已经下载了 SSL 证书,目前正在从客户端将其作为文件读取。它在对抗时有效,localhost所以我认为这不是问题。
有没有更好的方法来进行这种让客户端在单独的设备上运行但与服务器在同一网络上的测试?在开发过程中将 GRPC 服务器托管在外部似乎并不是最好的解决方案。
Python代码:
import grpc
import datamessage_pb2 as datamessage
import datamessage_pb2_grpc as datamessageService
def main():
print("Calling grpc server")
with open("localhost.cer", "rb") as file:
cert = file.read()
credentials = grpc.ssl_channel_credentials(cert)
channel = grpc.secure_channel("https://192.168.1.230:5001", credentials)
# channel = grpc.secure_channel("localhost:5001", credentials)
stub = datamessageService.StationDataHandlerStub(channel)
request = datamessage.StationDataModel(
temperature=22.3, humidity=13.3, soilMoisture=35.0)
result = stub.RegisterNewStationData(request)
print(result)
main()
Run Code Online (Sandbox Code Playgroud)
服务器设置在Program.cs: …
我正在尝试使用 GRPC 从客户端调用服务器方法,但出现以下错误:从对等 ipv4 收到错误
我试图找到解决方案,但现在已经超过一天了,无法弄清楚,请有人帮忙。非常感谢任何帮助
服务器原型文件(chunk.proto):
syntax = "proto3";
service FileServer {
rpc upload_chunk_stream(stream Chunk) returns (Reply) {}
rpc upload_single_chunk(Chunk) returns (Reply) {}
rpc download_chunk_stream(Request) returns (stream Chunk) {}
rpc get_available_memory_bytes(Empty_request) returns (Reply_double) {}
rpc get_stored_hashes_list_iterator(Empty_request) returns (stream Reply_string) {}
rpc hash_id_exists_in_memory(Request) returns (Reply) {}
}
message Chunk {
bytes buffer = 1;
}
message Request {
string hash_id = 1;
}
message Reply {
bool success = 1;
}
message Reply_double {
double bytes = 1;
}
message …Run Code Online (Sandbox Code Playgroud) 错误 :
Rendezvous of RPC that terminated with: status = StatusCode.UNAVAILABLE details = "Socket closed" debug_error_string = "{"created":"@1576780304.349820911","description":"Error received from peer ipv4:104.155.6.79:443","file":"src/core/lib/surface/call.cc","file_line":1046,"grpc_message":"Socket closed","grpc_status":14}
Run Code Online (Sandbox Code Playgroud)
该错误的文档是这样说的:The service is currently unavailable. This is most likely a transient condition, which can be corrected by retrying with a backoff.
我发现可用的退避GRPC ARGS是:
grpc.initial_reconnect_backoff_ms
grpc.max_reconnect_backoff_ms
grpc.min_reconnect_backoff_ms
Run Code Online (Sandbox Code Playgroud)
这些参数似乎默认具有这些值
#define GRPC_SUBCHANNEL_INITIAL_CONNECT_BACKOFF_SECONDS 1
#define GRPC_SUBCHANNEL_RECONNECT_MIN_TIMEOUT_SECONDS 20
#define GRPC_SUBCHANNEL_RECONNECT_MAX_BACKOFF_SECONDS 120
Run Code Online (Sandbox Code Playgroud)
你怎么知道退避会重试多少次?它是否链接到“grpc.enable_retries”?因为文档提到“透明重试”,我不确定它是否与退避选项相关。
处理代码 14 错误的正确方法是什么?
我是 grpc 菜鸟,想创建一个 REST 端点来检查 grpc 服务器的健康状况。为此我决定使用 grpc 网关。
但是,文档中用于将 grpc 代理为 json 的 grpc-REST 网关的示例仅适用于 Golang。但我有一个 python 后端,想要使用 Google Cloud Endpoints 制作一个基于 gRPC 的 api,可以对传入的 REST 请求进行转码。
我确实在这个 stackoverflow答案中找到了手动生成注释的方法。但我想知道最好的方法是什么。这是我想要生成到类中的示例 .proto 文件。
syntax = "proto3";
package example;
+
+import "google/api/annotations.proto";
+
message StringMessage {
string value = 1;
}
service YourService {
- rpc Echo(StringMessage) returns (StringMessage) {}
+ rpc Echo(StringMessage) returns (StringMessage) {
+ option (google.api.http) = {
+ post: "/v1/example/echo"
+ body: "*" …Run Code Online (Sandbox Code Playgroud) 我有一个游戏或任何带有服务器和多个客户端的远程用户界面,它们应该通过网络进行通信。 客户端和服务器都应该能够异步发送更新。
这似乎是一个非常自然的服务定义,让 grpc 管理会话。
syntax = "proto3";
package mygame;
service Game {
rpc participate(stream ClientRequest) returns (ServerResponse);
}
message ClientRequest {
// Fields for the initial request and further updates
}
message ServerResponse {
// Game updates
}
Run Code Online (Sandbox Code Playgroud)
实现客户端很简单(尽管下面的代码显然是不完整和简化的)。
syntax = "proto3";
package mygame;
service Game {
rpc participate(stream ClientRequest) returns (ServerResponse);
}
message ClientRequest {
// Fields for the initial request and further updates
}
message ServerResponse {
// Game updates
}
Run Code Online (Sandbox Code Playgroud)
看起来困难的是在不阻塞的情况下实现服务器。
class Client: …Run Code Online (Sandbox Code Playgroud) grpc-python ×10
grpc ×7
python ×5
python-3.x ×3
.net-core ×1
asp.net-core ×1
flask ×1
go ×1
grpc-gateway ×1
grpc-go ×1
protoc ×1
rpc ×1
sockets ×1
tensorflow ×1