grpc runtime_error ai_generated true

DEADLINE_EXCEEDED: grpc: deadline exceeded after 5000ms while waiting for server to respond

ID: grpc/grpc-deadline-exceeded-server-busy

Also available as: JSON · Markdown · 中文
82%Fix Rate
86%Confidence
1Evidence
2024-03-01First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
gRPC v1.44.0 active
gRPC v1.51.0 active
gRPC v1.59.0 active

Root Cause

The server took longer than the client's deadline to respond, often due to server overload or slow processing.

generic

中文

服务器响应时间超过客户端截止时间,通常是由于服务器过载或处理缓慢。

Official Documentation

https://grpc.io/docs/guides/deadlines/

Workarounds

  1. 85% success Profile the server to identify slow operations (e.g., database queries, external API calls). Use tools like pprof or tracing. Example in Go: go tool pprof http://localhost:6060/debug/pprof/profile
    Profile the server to identify slow operations (e.g., database queries, external API calls). Use tools like pprof or tracing. Example in Go: go tool pprof http://localhost:6060/debug/pprof/profile
  2. 75% success Implement server-side rate limiting or request queuing to handle load spikes. Use a circuit breaker pattern to reject requests when the server is overloaded.
    Implement server-side rate limiting or request queuing to handle load spikes. Use a circuit breaker pattern to reject requests when the server is overloaded.
  3. 80% success Increase the client deadline to a reasonable value (e.g., 10 seconds) and add retry with exponential backoff. Example in Python with grpc.aio: await asyncio.wait_for(stub.MyRpc(request), timeout=10)
    Increase the client deadline to a reasonable value (e.g., 10 seconds) and add retry with exponential backoff. Example in Python with grpc.aio: await asyncio.wait_for(stub.MyRpc(request), timeout=10)

中文步骤

  1. Profile the server to identify slow operations (e.g., database queries, external API calls). Use tools like pprof or tracing. Example in Go: go tool pprof http://localhost:6060/debug/pprof/profile
  2. Implement server-side rate limiting or request queuing to handle load spikes. Use a circuit breaker pattern to reject requests when the server is overloaded.
  3. Increase the client deadline to a reasonable value (e.g., 10 seconds) and add retry with exponential backoff. Example in Python with grpc.aio: await asyncio.wait_for(stub.MyRpc(request), timeout=10)

Dead Ends

Common approaches that don't work:

  1. 60% fail

    This masks the problem but doesn't fix server performance; long deadlines can cause resource leaks.

  2. 75% fail

    The underlying performance issue (e.g., slow database queries) will reappear after restart.

  3. 80% fail

    Repeated retries can overwhelm the server further, worsening the problem.