如果云数据库 Tair(兼容 Redis)实例的内存使用率告警显示内存占用较高,或您的应用程序出现OOM异常,但性能监控显示的内存使用率并不高,可参考本文排查原因并解决问题。
问题现象
现象一:
您收到实例内存告警,显示内存使用率超过阈值(例如,连续满足3次平均值>=90%),但查看控制台的监控页面发现内存使用率远低于阈值。
现象二:
您的应用程序出现异常command not allowed when used memory > 'maxmemory'
,但查看控制台的监控页面发现内存并没有满或只有一个数据分片的内存使用率较高。
问题原因
为什么内存监控与内存告警不一致?
如果性能监控与内存告警中的内存使用率不一致,可能是因为您的实例是集群版,您查看的是实例全局的监控,而不是数据节点的监控。
请确认您收到的告警信息中的实例详情是否写了nodeId = <实例ID>-db-<数字>
。如果是,表示仅<实例ID>-db-<数字>
标识的数据节点的内存使用超过阈值。
请按以下步骤确认该数据节点的内存使用率是否与内存告警一致。
访问实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏,单击性能监控。
单击数据节点页签,选择
<实例ID>-db-<数字>
对应的数据节点,查看该数据节点的内存使用率是否与内存告警一致。
为什么某个数据节点的内存使用率很高,其他数据节点的内存使用率却很低?
当集群版实例中有一个或N个数据节点的内存使用率非常高,而其他数据节点的内存使用率很低时,意味着数据可能发生了倾斜。您可以使用发起实例诊断功能,一键排查当前实例是否存在倾斜的情况。
为什么会发生内存倾斜?
发生内存倾斜,主要原因如下:
存在大Key。
集群版实例通过CRC算法计算出Key所属的Slot,并将数据写入Slot所属的数据分片节点。
即使Key被均匀地分散到不同的数据分片节点,但如果某个Key存放过多或过大的field也会导致单个Key过大,从而导致内存倾斜。
使用了Hash Tag。
使用Hash Tag时,例如
user:{1000}:name
,实例会对花括号内的字符串进行CRC计算,并将带有相同Hash Tag的Key映射到相同的槽,即存在同一数据分片节点。如果大量的Key设置相同的Hash Tags将会导致数据集中在某个数据分片节点,从而导致内存倾斜。
解决方案
检查是否存在大Key,并拆分大Key
查找大Key
通过离线全量Key分析找出大Key。
更多找出大Key的方法,请参见发现并处理大Key和热Key。
拆分大Key
例如将含有数万成员的一个HASH Key拆分为多个HASH Key,并确保每个Key的成员数量在合理范围。在集群架构实例中,拆分大Key能对数据分片间的内存平衡起到显著作用。
检查是否使用了Hash Tag
如果使用了Hash Tag,请根据业务实际情况,评估将一个Hash Tag拆分为多个Hash Tag,使数据更加均匀地分布在不同的数据分片节点上。
扩容实例规格
扩容实例规格,可以增加实例每个分片的内存,是改善内存倾斜的临时解决方案,具体操作请参见变更实例配置。
变配时实例会进行数据倾斜预检查,若您选择的实例规格无法解决内存倾斜问题,实例会进行拦截与报错,请您调大实例规格后重试。
在成功升级实例规格后,会改善内存倾斜问题,但可能也引起带宽倾斜或CPU倾斜。