grpc resource_error ai_generated true

INTERNAL: grpc: stream creation failed due to max concurrent streams limit (128) on server

ID: grpc/stream-creation-failure-max-streams

Also available as: JSON · Markdown · 中文
75%Fix Rate
84%Confidence
1Evidence
2024-04-10First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
gRPC C++ 1.63.0 active
gRPC Java 1.61.0 active
gRPC Python 1.64.0 active

Root Cause

The gRPC server reached its configured maximum number of concurrent streams (default 100 or 128), rejecting new stream creation.

generic

中文

gRPC 服务器达到了配置的最大并发流数(默认 100 或 128),拒绝创建新流。

Official Documentation

https://grpc.io/docs/guides/performance/#http2-settings

Workarounds

  1. 80% success Increase `GRPC_ARG_HTTP2_MAX_CONCURRENT_STREAMS` to a higher value (e.g., 256) on server: `server = grpc.server(futures.ThreadPoolExecutor(max_workers=10), options=[('grpc.max_concurrent_streams', 256)])`
    Increase `GRPC_ARG_HTTP2_MAX_CONCURRENT_STREAMS` to a higher value (e.g., 256) on server: `server = grpc.server(futures.ThreadPoolExecutor(max_workers=10), options=[('grpc.max_concurrent_streams', 256)])`
  2. 75% success Implement client-side connection pooling to reuse streams: `channel = grpc.insecure_channel('localhost:50051', options=[('grpc.use_local_subchannel_pool', 1)])`
    Implement client-side connection pooling to reuse streams: `channel = grpc.insecure_channel('localhost:50051', options=[('grpc.use_local_subchannel_pool', 1)])`

中文步骤

  1. 在服务器端增加 `GRPC_ARG_HTTP2_MAX_CONCURRENT_STREAMS` 到更高值(如 256):`server = grpc.server(futures.ThreadPoolExecutor(max_workers=10), options=[('grpc.max_concurrent_streams', 256)])`
  2. 实现客户端连接池以复用流:`channel = grpc.insecure_channel('localhost:50051', options=[('grpc.use_local_subchannel_pool', 1)])`

Dead Ends

Common approaches that don't work:

  1. Increase max streams limit to an extremely high value like 10000 60% fail

    May cause memory exhaustion and degrade performance; doesn't address inefficient stream usage.

  2. Disable the stream limit entirely by setting to 0 70% fail

    gRPC interprets 0 as unlimited, but may cause resource starvation and DoS vulnerability.

  3. Restart server every time it hits limit 90% fail

    Temporary fix; the issue recurs as traffic grows.