You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I have an Envoy deployment (managed via Envoy Gateway) and a Go HTTP server configured with H2C, and it seems Linkerd proxy does not create new connections when it reaches the server's max concurrent streams limit (250 by default)1. Looking at the goroutines running:
I would expect Linkerd proxy to behave the same as Envoy2:
New connections are established anytime there is a pending request without a connection that can be dispatched to
It seems that in some cases, it can lead to the service being completely unavailable, where the client has reset all the streams and is gone, but with all the pending streams and the ones opened "busy", these resets are never passed to the server, until the connection is closed (e.g. when restarting Envoy). (maybe some kind of HOL blocking?)
(I have observed the same from a Go client using H2C to the Go server)
Have I missed a configuration? Is this behavior expected?
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Hello! 👋
I have an Envoy deployment (managed via Envoy Gateway) and a Go HTTP server configured with H2C, and it seems Linkerd proxy does not create new connections when it reaches the server's max concurrent streams limit (250 by default)1. Looking at the goroutines running:
Without the proxy, we can see that as many streams as needed are opened:
I would expect Linkerd proxy to behave the same as Envoy2:
It seems that in some cases, it can lead to the service being completely unavailable, where the client has reset all the streams and is gone, but with all the pending streams and the ones opened "busy", these resets are never passed to the server, until the connection is closed (e.g. when restarting Envoy). (maybe some kind of HOL blocking?)
(I have observed the same from a Go client using H2C to the Go server)
Have I missed a configuration? Is this behavior expected?
Linkerd version:
edge-25.9.3Footnotes
https://github.com/golang/go/blob/go1.25.4/src/net/http/h2_bundle.go#L4007 ↩
https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/upstream/connection_pooling#http-2 ↩
Beta Was this translation helpful? Give feedback.
All reactions