ASM中GRPC/HTTP2流式传输场景的Sidecar资源占用调优

简介: 当应用使用GRPC流式传输时,数据经由Sidecar进行转发,由于Sidecar工作于7层,所以Sidecar会对GRPC消息元信息进行解析后在转发,在一些场景下(例如在单连接上建立大规模Stream)可能会造成Sidecar内存占用提升。本文将介绍Sidecar控制GRPC流式传输性能的相关参数和其作用机制,用户可以通过这些参数对Sidecar资源占用进行调整,已取得运行性能和资源消耗的平衡。S

当应用使用GRPC流式传输时,数据经由Sidecar进行转发,由于Sidecar工作于7层,所以Sidecar会对GRPC消息元信息进行解析后在转发,在一些场景下(例如在单连接上建立大规模Stream)可能会造成Sidecar内存占用提升。本文将介绍Sidecar控制GRPC流式传输性能的相关参数和其作用机制,用户可以通过这些参数对Sidecar资源占用进行调整,已取得运行性能和资源消耗的平衡。

Sidecar针对GRPC的配置参数

Sidecar针对流式GRPC传输提供了如下参数,对这些参数进行调整,可使得Sidecar在性能与资源占用上取得平衡。

参数名称

作用

有效取值范围

默认值

http2_protocol_options.initial_connection_window_size

该参数用于设置GRPC流式传输中发送端的连接(Connection)级别的HTTP2流初始窗口大小。在上游(Upstream)调低该值可以降低上下游双端的内存压力。

参考1:HTTP2流控windows size;参考2:Envoy文档

65535 - 2147483647

65535

http2_protocol_options.initial_stream_window_size

该参数用于设置GRPC流式传输中发送端的流(Stream)级别的HTTP2流初始窗口大小。在上游(Upstream)调低该值可以降低上下游双端的内存压力。

参考1:HTTP2流控windows size;参考2:Envoy文档

65535 - 2147483647

65535

http2_protocol_options.max_concurrent_streams

该值用于设置在一个连接上最多建立多少个流,调高该值可以提高并发数量及传输效率,同时增大发送、接收双方的CPU/Memory占用;适当降低该值可以将降低并发数量和传输效率,但可以减少发送、接收双方的CPU & Memory占用。

1 - 2147483647

2147483647

stream_idle_timeout(仅下游连接)

空闲流(Stream)的超时时间,当流(Stream)在该时间没有任何活动时,该流(Stream)将被终止。缩短该时间可以更快将空闲stream关闭,从而释放其相关上下文和缓冲区所占用的空间。

300s

应用配置到Sidecar

要将上述配置作用到指定ASM Sidecar,需要借助自定义ASM提供的EnvoyFilter模板,详细步骤如下:

一、使用模板编写EnvoyFilter

本文提供三个模板,分别用于调整上游连接、下游连接、和上下游连接,需要将模板中的${TO_BE_POPULATE}替换为期望值。

调整上游连接参数模板:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: h2-control
  namespace: default
spec:
  configPatches:
  - applyTo: CLUSTER
    match:
      proxy:
        proxyVersion: ^1\.[1-9][0-9].*
    patch:
      operation: MERGE
      value:
        http2_protocol_options:
          initial_connection_window_size: ${TO_BE_POPULATE}
          initial_stream_window_size: ${TO_BE_POPULATE}
          max_concurrent_streams: ${TO_BE_POPULATE}

调整下游连接参数模板:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: h2-control
  namespace: default
spec:
  configPatches:
  - applyTo: NETWORK_FILTER
    match:
      listener:
        filterChain:
          filter:
            name: envoy.filters.network.http_connection_manager
      proxy:
        proxyVersion: ^1\.[1-9][0-9].*
    patch:
      operation: MERGE
      value:
        typed_config:
          '@type': type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          http2_protocol_options:
            initial_connection_window_size: ${TO_BE_POPULATE}
            initial_stream_window_size: ${TO_BE_POPULATE}
            max_concurrent_streams: ${TO_BE_POPULATE} 
          stream_idle_timeout: ${TO_BE_POPULATE}

调整上下游连接模板:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: h2-control
  namespace: default
spec:
  configPatches:
  - applyTo: CLUSTER
    match:
      proxy:
        proxyVersion: ^1\.[1-9][0-9].*
    patch:
      operation: MERGE
      value:
        http2_protocol_options:
          initial_connection_window_size: ${TO_BE_POPULATE}
          initial_stream_window_size: ${TO_BE_POPULATE}
          max_concurrent_streams: ${TO_BE_POPULATE}
  - applyTo: NETWORK_FILTER
    match:
      listener:
        filterChain:
          filter:
            name: envoy.filters.network.http_connection_manager
      proxy:
        proxyVersion: ^1\.[1-9][0-9].*
    patch:
      operation: MERGE
      value:
        typed_config:
          '@type': type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          http2_protocol_options:
            initial_connection_window_size: ${TO_BE_POPULATE}
            initial_stream_window_size: ${TO_BE_POPULATE}
            max_concurrent_streams: ${TO_BE_POPULATE} 
          stream_idle_timeout: ${TO_BE_POPULATE}

二、创建自定义Envoy过滤器模板

打开服务网格控制台,并进入服务网格详情页面,点击导航栏中的【插件市场】,搜索【自定义】,找到自定义Envoy过滤器模板,点击【应用此模板】

输入名称h2-control(该名称可自定义),点击【添加Envoy过滤器模板适配版本】,并在新增的项目上选择这个Envoy过滤器适配的版本。选择当前网格实例版本即可。

将第一步通过模板编写的EnvoyFilter YAML粘贴至刚才添加的适配版本输入框中,点击确定保存。完成创建。参考文档:https://help.aliyun.com/document_detail/157263.html绑定工作负载至期望调整的Workload。

目录
相关文章
|
2月前
|
安全 前端开发 网络协议
|
3月前
|
缓存 网络协议 安全
计算机网络 TCP、RPC、GRPC、HTTP 对比
【1月更文挑战第1天】计算机网络 TCP、RPC、GRPC、HTTP 对比
|
6月前
|
存储 JSON Go
Golang 语言 gRPC 服务怎么同时支持 gRPC 和 HTTP 客户端调用?
Golang 语言 gRPC 服务怎么同时支持 gRPC 和 HTTP 客户端调用?
76 0
|
3天前
|
安全 Go
解决https页面加载http资源报错
请注意,混合内容可能导致安全性问题,因此在使用上述方法时要小心。最好的方式是尽量减少或完全消除混合内容,以确保页面的安全性。
5 0
|
1月前
|
JSON 前端开发 数据格式
糊涂工具类真是场景下请求http接口的案例
糊涂工具类真是场景下请求http接口的案例
21 0
|
1月前
|
缓存
HTTP协议中,GET和POST有什么区别?分别适用什么场景?
HTTP协议中,GET和POST有什么区别?分别适用什么场景?
36 0
|
2月前
|
网络协议 安全 数据安全/隐私保护
HTTP/2与HTTP/3:互联网传输协议的新旧交替
HTTP/2与HTTP/3:互联网传输协议的新旧交替
23 2
|
2月前
|
缓存
什么是http状态码?常见的有哪些?分别代表什么含义?哪些场景会出现?
什么是http状态码?常见的有哪些?分别代表什么含义?哪些场景会出现?
|
3月前
|
缓存 安全 数据安全/隐私保护
HTTP协议中,GET和POST有什么区别?分别适用什么场景?
HTTP协议中,GET和POST有什么区别?分别适用什么场景?
20 0
|
3月前
|
网络协议 安全 API
计算机网络 TCP、RPC、GRPC、HTTP 总结
【1月更文挑战第1天】计算机网络 TCP、RPC、GRPC、HTTP 总结