问题现象
pod中istio sidecar容器监控中发现内存消耗持续升高。
原因分析
istio采用envoy作为数据面代理,动态内存消耗主要有以下方面:
原因 | 说明 |
---|---|
网格配置 | 默认情况下网格中的配置和服务发现信息会全量同步到所有sidecar,当网格中的配置增多或者pod数量增多时,将导致sidecar代理的内存升高。 |
动态请求消耗的内存 | Envoy中会为请求申请buffer用于缓存请求及应答信息,当请求量和消息比较大的时候会增加内存消耗。 |
可观测指标发散 | 当指标的tag较多时将会在内存中产生较多副本,增加内存消耗。 |
HTTP2流量控制相关 | sidecar实现HTTP2编解码中有流级别及连接级别的缓存字节数限制,默认为256MB,当sidecar处理能力不足将导致数据在内存中累积。 |
解决方法
对于网格配置导致的sidecar内存升高,可以通过限定资源的可见范围较少配置扩散,如VirtualService、DestinationRule的exportTo字段指定配置分发的命名空间;通过配置sidecar资源,限定当前服务可见的服务发现范围等。
对于动态请求导致的内存消耗,考虑减少sidecar代理的流量。默认情况下sidecar会拦截所有inbound和outbound的流量,可以根据业务需要对不需要代理的端口取消流量拦截;具体可以通过sidecar管理-sidecar代理配置菜单下配置全局及命名空间级别的流量拦截策略。
对于指标发散和HTTP2缓冲配置导致的内存升高,我们将在后续的版本中提供优化方案。