我在我的 Amazon ElastiCache 环境中看到了“Network allowance exceeded”(超出网络限额)指标。
简短描述
当应用程序工作负载超过底层 ElastiCache 节点的网络能力时,可能会发生流量整形。要跟踪流量整形,请使用以下指标:
- NetworkBandwidthInAllowanceExceeded 和 NetworkBandwidthOutAllowanceExceeded
- NetworkPacketsPerSecondAllowanceExceeded
- NetworkConntrackAllowanceExceeded
解决方法
NetworkBandwidthInAllowanceExceeded 和 NetworkBandwidthOutAllowanceExceeded
NetworkBandwidthInAllowanceExceeded 和 NetworkBandwidthOutAllowanceExceeded 指标用于跟踪吞吐量超过总带宽限制时 ElastiCache 进行整形的网络数据包数量。
当您查看 NetworkBandwidthInAllowanceExceeded 和 NetworkBandwidthOutAllowanceExceeded 时,还必须查看 Amazon CloudWatch 中的 NetworkBytesIn 和 NetworkBytesOut 指标。当 CloudWatch 带宽使用量指标 NetworkBytesIn 和 NetworkBytesOut 低于节点级限制时,网络性能指标可能会显示 ElastiCache 超出了限额。有关详细信息,请参阅监控实例带宽。
**注意:**即使您的平均带宽处于限制范围内,短暂的流量突增也会导致流量整形。如果这些带宽限额指标偶尔出现峰值,但对应用程序端没有影响,则无需执行进一步操作。由于 Valkey 和 Redis OSS 使用 TCP,因此 TCP 会重新传输丢弃的数据包。
如果这些带宽限额指标一直很高,且您的应用程序出现延迟问题,请查看延迟问题的时间戳。如果错误时间戳与指标峰值的时间相匹配,请纵向扩展您的集群。有关详细信息,请参阅扩展自行设计的集群。
此外,请查看集群的缓存节点类型。如果应用程序工作负载导致网络使用量不断突增,超过了基准带宽,则可能会触发流量整形。有关详细信息,请参阅可用实例带宽。
**注意:**对于 ElastiCache 写入主节点的每个字节,ElastiCache 会将相同的信息复制到所有其他副本。当集群尝试处理复制积压时,节点类型较小、具有多个副本且写入请求密集的集群可能会出现问题。这种积压可能会导致主节点上的 NetworkBandwidthOutAllowanceExceeded 值较高。
要确定导致应用程序端指标突增的原因,请查找对多个键进行操作的命令。这包括以下示例:
如果您使用多个大键(例如大型 JSON 对象或哈希值),则可能会超过节点类型的带宽限制。然后,ElastiCache 会丢弃多余的流量,或根据当前负载将其添加到队列中。
NetworkPacketsPerSecondAllowanceExceeded
如果此指标的值不为 0,则表明底层缓存节点上的网络使用量超出了每秒数据包数 (PPS) 限制。此限制特定于您使用的节点类型。ElastiCache 会丢弃或排队处理超出节点限制的多余数据包。
对于需要处理高每秒查询次数 (QPS) 的小型请求的应用程序,节点可能会超出 PPS 限制。要确定命令执行率,请对每种命令数据类型使用 CloudWatch 指标。有关详细信息,请参阅 Valkey 和 Redis OSS 的指标。
要解决此问题,您可以暂时将集群纵向扩展到更大的节点类型。如果操作属于读密集型,则您可以向集群添加更多只读副本或进行分片,以分散负载。对于已启用集群模式 (CME) 的集群,如果操作属于写密集型,请添加更多分片以横向扩展集群。
**注意:**对于已禁用集群模式 (CMD) 的集群,必须将集群移至更大的节点才能扩展写入操作。
NetworkConntrackAllowanceExceeded
如果此指标的值不为 0,则表明 ElastiCache 超过了所有节点安全组中跟踪的最大连接数。达到连接限制后,在 ElastiCache 关闭现有连接之前,新连接将会失败。有关详细信息,请参阅 Amazon Elastic Compute Cloud (Amazon EC2) 安全组连接跟踪。
当工作负载创建大量网络连接且您未正确关闭这些连接时,连接会在服务器端保持打开状态。这些连接将保持空闲状态,并会导致 conntrack 耗尽。然后,ElastiCache 在关闭现有连接之前将无法接受新连接。
要在 ElastiCache 中解决此问题,请使用 timeout(超时)参数查看和修改空闲连接超时。配置 ElastiCache 服务器的参数,以便在空闲一段时间后关闭连接。
要在应用程序端解决此问题,请使用连接池设置来重用现有连接并降低 NewConnections 速率。有关详细信息,请参阅最佳实践: Redis 客户端和 Amazon ElastiCache for Redis。
**注意:**服务器端的 timeout(超时)参数和客户端的 Connection Pool(连接池)设置均用于管理连接建立,且需要进行应用程序负载测试。对应用程序进行负载测试,以确定超时和连接池设置的最佳配置。
相关信息
使用 CloudWatch 指标监控使用情况
扩展 ElastiCache
网络
Redis OSS 2.6.13 参数
Amazon EC2 实例级网络性能指标提供了新的见解