gRPC服务随机出现[Errno 5]输入输出错误,请求协助排查
gRPC服务随机IO错误排查求助
我基于以下proto文件实现了gRPC服务:
示例proto文件
syntax = "proto3"; package protofile; import "google/protobuf/timestamp.proto"; import "google/protobuf/struct.proto"; option go_package = "./contracts/grpc"; message EventCallbackRequest { string event_sid = 1; string event_type = 2; string event_name = 3; google.protobuf.Timestamp event_timestamp = 4; string action_sid = 5; string action_custom_parameter = 6; google.protobuf.Struct event_data = 7; google.protobuf.Struct data = 8; } message EventCallbackResponse { string message = 1; bool success = 2; } service EventCallbackTriggerService { rpc TriggerCallbackEvent(EventCallbackRequest) returns (EventCallbackResponse) {} }
服务端代码(sample_server.py)
部署在Ubuntu服务器的50051端口:
import grpc from concurrent import futures import sample_pb2 import sample_pb2_grpc from google.protobuf.json_format import MessageToDict class SampleEventHandler(sample_pb2_grpc.EventCallbackTriggerServiceServicer): def TriggerCallbackEvent(self, request, context): print("hiiiiiiii----------------") data = MessageToDict(request) print(f"data is {data}") return sample_pb2.EventCallbackResponse(message="Event received", success=True) def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=1)) sample_pb2_grpc.add_EventCallbackTriggerServiceServicer_to_server(SampleEventHandler(), server) server.add_insecure_port('[::]:50051') print("gRPC server running on port 50051...") server.start() server.wait_for_termination() if __name__ == '__main__': serve()
客户端代码(sample_client.py)
从本地调用部署在grpc-test.squadstack.com:443/protofile.EventCallbackTriggerService/TriggerCallbackEvent的服务:
import grpc from google.protobuf import struct_pb2, timestamp_pb2 import sample_pb2_grpc as pb2_grpc import sample_pb2 as pb2 from datetime import datetime def run(): target2 = 'grpc-test.squadstack.com:443/protofile.EventCallbackTriggerService/TriggerCallbackEvent' credentials = grpc.ssl_channel_credentials() # Establish a secure channel with Nginx (SSL and HTTP/2 for gRPC) with grpc.secure_channel(target2, credentials) as channel: # Create a stub (client) to make requests to the gRPC service stub = pb2_grpc.EventCallbackTriggerServiceStub(channel) # Prepare timestamp event_timestamp = timestamp_pb2.Timestamp() event_timestamp.FromDatetime(datetime.now()) # Prepare sample Struct data event_data = struct_pb2.Struct() event_data["key1"] = "value1" event_data["key2"] = "value2" # Create a request with necessary event details request = pb2.EventCallbackRequest( event_sid="2K8DQQuKWiXhXdfpMnXJYKV0TdB", event_type="leg_lifecycle_event", event_name="leg_incoming", event_timestamp=event_timestamp, action_sid="action-123", action_custom_parameter="custom-param", event_data=event_data, data={ "account_sid": "abcd60", "caller_id": "XXXX", "contact_uri": "YYYY", "date_created": "2023-01-10T10:41:39.607712401Z", "date_updated": "2023-01-10T10:41:39.607712401Z", "dc_code": "101", "direction": "inbound", "exophone": "YYYY", "leg_sid": "2K8DQQr2eoPW6HXJej7VesxsTUy00000", "network_type": "pstn", "nso_code": "9988fd96-ce41-11ed-9a09-0242ac110003", "start_time": "2023-01-10T10:41:39.039873482Z", "state": "ringing", "time_limit": 14400 } ) # Send request to the gRPC server via Nginx and receive response try: response = stub.TriggerCallbackEvent(request) print(f"Server response: {response.message}, Success: {response.success}") except grpc.RpcError as e: print(f"gRPC call failed: {e}") if __name__ == '__main__': run()
Nginx日志(请求返回200)
已配置Nginx监听50051端口,日志显示请求返回200:
{"level": "info","ts": "2024-09-18T08:18:14+00:00","message": "handled request POST /protofile.EventCallbackTriggerService/TriggerCallbackEvent","request": {"id": "50bb0cfe3ba03c733693c656ad331579","remote_ip": "192.168.1.95","remote_port": "18562","protocol": "HTTP/2.0","method": "POST","scheme": "https","host": "grpc-test.squadstack.com","uri": "/protofile.EventCallbackTriggerService/TriggerCallbackEvent","headers": {"user-agent": "grpc-python/1.66.1 grpc-c/43.0.0 (osx; chttp2)","accept": "","accept-encoding": "","referer": "","x-forwarded-for": "49.249.150.126","x-forwarded-proto": "https"}},"connection": {"bytes_read": 907,"bytes_sent": 124},"timing": {"duration_msecs": 0.001,"upstream_connect_time": "0.000","upstream_header_time": "0.000","upstream_response_time": "0.000"},"response": {"status": 200,"headers": {"content_length": "0","content_type": "application/grpc"}},"upstream": {"address": "127.0.0.1:50051","status": "200","response_length": "0","cache_status": ""},"ssl": {"protocol": "TLSv1.3","cipher": "TLS_AES_128_GCM_SHA256","session_reused": ".","server_name": "","client_verify": "NONE","client_s_dn": ""},"gzip_ratio": ""}
问题现象
运行客户端代码时,10次调用中有8次出现如下错误:
gRPC call failed: <_InactiveRpcError of RPC that terminated with: status = StatusCode.UNKNOWN details = "Exception calling application: [Errno 5] Input/output error" debug_error_string = "UNKNOWN:Error received from peer {grpc_message:"Exception calling application: [Errno 5] Input/output error", grpc_status:2, created_time:"2024-09-18T14:41:17.38932+05:30"}" >
成功时能正常收到响应:
Server response: Event received, Success: True
已排查内容
- 服务器磁盘空间充足
- 客户端与服务端均使用Python3.9、grpcio==1.66.1版本
目前无法定位该随机输入输出错误的原因,恳请协助排查。
内容的提问来源于stack exchange,提问作者user15511887
相关产品推荐
相关产品推荐

