最大并发流(活动 HTTP 请求)数

RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2) https://httpwg.org/specs/rfc7540.html#rfc.section.5.1.2

5.1.2. Stream Concurrency

A peer can limit the number of concurrently active streams using the SETTINGS_MAX_CONCURRENT_STREAMS parameter (see Section 6.5.2) within a SETTINGS frame. The maximum concurrent streams setting is specific to each endpoint and applies only to the peer that receives the setting. That is, clients specify the maximum number of concurrent streams the server can initiate, and servers specify the maximum number of concurrent streams the client can initiate.

Streams that are in the "open" state or in either of the "half-closed" states count toward the maximum number of streams that an endpoint is permitted to open. Streams in any of these three states count toward the limit advertised in the SETTINGS_MAX_CONCURRENT_STREAMS setting. Streams in either of the "reserved" states do not count toward the stream limit.

Endpoints MUST NOT exceed the limit set by their peer. An endpoint that receives a HEADERS frame that causes its advertised concurrent stream limit to be exceeded MUST treat this as a stream error (Section 5.4.2) of type PROTOCOL_ERROR or REFUSED_STREAM. The choice of error code determines whether the endpoint wishes to enable automatic retry (see Section 8.1.4) for details).

An endpoint that wishes to reduce the value of SETTINGS_MAX_CONCURRENT_STREAMS to a value that is below the current number of open streams can either close streams that exceed the new value or allow streams to complete.

 

 

GRPC 性能最佳做法 | Microsoft Docs https://docs.microsoft.com/zh-cn/aspnet/core/grpc/performance?view=aspnetcore-7.0

连接并发

HTTP/2 连接通常会限制一个连接上同时存在的最大并发流(活动 HTTP 请求)数。 默认情况下,大多数服务器将此限制设置为 100 个并发流。

gRPC 通道使用单个 HTTP/2 连接,并且并发调用在该连接上多路复用。 当活动调用数达到连接流限制时,其他调用会在客户端中排队。 排队调用等待活动调用完成后再发送。 由于此限制,具有高负载或长时间运行的流式处理 gRPC 调用的应用程序可能会因调用排队而出现性能问题。

.NET 5 引入 SocketsHttpHandler.EnableMultipleHttp2Connections 属性。 如果设置为 true,则当达到并发流限制时,通道会创建额外的 HTTP/2 连接。 创建 GrpcChannel 时,会自动将其内部 SocketsHttpHandler 配置为创建额外的 HTTP/2 连接。 如果应用配置其自己的处理程序,请考虑将 EnableMultipleHttp2Connections 设置为 true

C#
var channel = GrpcChannel.ForAddress("https://localhost", new GrpcChannelOptions
{
    HttpHandler = new SocketsHttpHandler
    {
        EnableMultipleHttp2Connections = true,

        // ...configure other handler settings
    }
});

.NET Core 3.1 应用有几种解决方法:

  • 为具有高负载的应用的区域创建单独的 gRPC 通道。 例如,Logger gRPC 服务可能具有高负载。 使用单独的通道在应用中创建 LoggerClient
  • 使用 gRPC 通道池,例如创建 gRPC 通道列表。 每次需要 gRPC 通道时,使用 Random 从列表中选取一个通道。 使用 Random 在多个连接上随机分配调用。

 重要

提升服务器上的最大并发流限制是解决此问题的另一种方法。 在 Kestrel 中,这是用 MaxStreamsPerConnection 配置的。

不建议提升最大并发流限制。 单个 HTTP/2 连接上的流过多会带来新的性能问题:

  • 尝试写入连接的流之间发生线程争用。
  • 连接数据包丢失导致在 TCP 层阻止所有调用。

 

 

posted @ 2022-09-15 14:42  papering  阅读(525)  评论(0编辑  收藏  举报