电子书 当前页面的脚本发生错误 Redis性能问题排查解决手册(值得收藏)
cnblogs.com/mushroom/p/4738170.htm
阅读目录:
性能相关的数据指标
内存使用率used_memory
命令处理总数total_commands_processed
延迟时间
内存碎片率
回收key
总结
性能相关的数据指标
通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息。通过这些信息来分析文章后面提到的一些性能指标。
info命令输出的数据可分为10个类别,分别是:
这篇主要介绍比较重要的2部分性能指标memory和stats。
需要注意的是info命令返回的信息,并没有命令响应延迟相关的数据信息,所以后面会详细介绍怎么获取与延迟相关的数据指标。
倘若你觉得info输出的信息太多并且杂乱无章,可以指定info命令的参数来获取单个分类下的数据。比如输入info memory命令,会只返回与内存相关的数据。
为了快速定位并解决性能问题,这里选择5个关键性的数据指标,它包含了大多数人在使用Redis上会经常碰到的性能问题。
内存使用率used_memory
上图中used_memory 字段数据表示的是:由Redis分配器分配的内存总量,以字节(byte)为单位。其中used_memory_human上的数据和used_memory是一样的值,它以M为单位显示,仅为了方便阅读。
used_memory是Redis使用的内存总量,它包含了实际缓存占用的内存和Redis自身运行所占用的内存(如元数据、lua)。它是由Redis使用内存分配器分配的内存,所以这个数据并没有把内存碎片浪费掉的内存给统计进去。
其他字段代表的含义,都以字节为单位:
因内存交换引起的性能问题
内存使用率是Redis服务最关键的一部分。如果一个Redis实例的内存使用率超过可用最大内存 (used_memory > 可用最大内存),那么操作系统开始进行内存与swap空间交换,把内存中旧的或不再使用的内容写入硬盘上(硬盘上的这块空间叫Swap分区),以便腾出新的物理内存给新页或活动页(page)使用。
在硬盘上进行读写操作要比在内存上进行读写操作,时间上慢了近5个数量级,内存是0.1μs单位、而硬盘是10ms。如果Redis进程上发生内存交换,那么Redis和依赖Redis上数据的应用会受到严重的性能影响。
通过查看used_memory指标可知道Redis正在使用的内存情况,如果used_memory>可用最大内存,那就说明Redis实例正在进行内存交换或者已经内存交换完毕。管理员根据这个情况,执行相对应的应急措施。
跟踪内存使用率
若是在使用Redis期间没有开启rdb快照或aof持久化策略,那么缓存数据在Redis崩溃时就有丢失的危险。因为当Redis内存使用率超过可用内存的95%时,部分数据开始在内存与swap空间来回交换,这时就可能有丢失数据的危险。
当开启并触发快照功能时,Redis会fork一个子进程把当前内存中的数据完全复制一份写入到硬盘上。因此若是当前使用内存超过可用内存的45%时触发快照功能,那么此时进行的内存交换会变的非常危险(可能会丢失数据)。倘若在这个时候实例上有大量频繁的更新操作,问题会变得更加严重。
通过减少Redis的内存占用率,来避免这样的问题,或者使用下面的技巧来避免内存交换发生:
「1. 假如缓存数据小于4GB,就使用32位的Redis实例。」
因为32位实例上的指针大小只有64位的一半,它的内存空间占用空间会更少些。这有一个坏处就是,假设物理内存超过4GB,那么32位实例能使用的内存仍然会被限制在4GB以下。