Redis变慢了,到底慢在哪儿?(1)
作者:快盘下载 人气:00、redis变慢了,到底慢在哪儿?
最近由于工作需要,在维护线上的Redis,Redis相关的原理部分看的比较多,Redis最常见的业务问题就是响应慢,今天我们来看看Redis慢在哪里?以及如何解决这些慢的现象。
首先来看有可能引起Redis变慢的那些情况。其实,Redis变慢的主要因素是各种类型的阻塞,可以这么说:阻塞是Redis的噩梦。Redis是单线程处理模型,一旦某个环节出现阻塞,后续环节肯定会受到影响,这是毋庸置疑的。
总体上来说,Redis的阻塞存在很多可能,今天重点说以下2个方面:
1、Redis内部的阻塞式操作或者命令
2、CPU核心以及NUMA架构
01、Redis内部的阻塞式操作或命令
假设你的Redis是以最复杂的集群的模式部署的,那么在Redis客户端和Redis服务交互的时候,整个链路包含网络IO、磁盘写入、主从节点复制、切片集群数据迁移等等,这些步骤都可能产生阻塞,下面逐一分析。
1、阻塞式命令会影响Redis的性能。
集合的全量查询keys *等命令、当集合中有N个数据的时候,复杂度就是O(n),阻塞的时间和数据个数正相关;
删除命令也会影响Redis的性能,删除key的时候,操作系统会将释放的内存块插入一个空闲的内存块链表,这个操作本身会阻塞当前的应用,如果释放的key占用内存较多,例如是一个bigKey,那么大概率会影响Redis的性能
清空数据库的命令flushall和flushdb也存在类似的阻塞风险
2、AOF落盘时候产生阻塞
Redis中记录AOF日志时候,会根据不同的回写策略来进行数据落盘,跟磁盘的交互总是很慢的,如果大量的写操作需要同步落盘,就会阻塞主线程了。
3、主从节点交互产生的阻塞
主从节点进行交互的时候,从节点上有2个阻塞点,第一是从节点需要使用flushdb清空数据库,如果从节点之前有数据,这可能造成阻塞;另外一个就是从节点需要加载主节点发送过来的RDB文件,如果RDB文件很大,则会加载很慢,产生阻塞
4、切片集群Redis Cluster交互时候的阻塞点
切片集群在进行bigkey迁移的时候,会造成主线程的阻塞,因为Redis Cluster采用了同步迁移。
02、CPU核心NUMA架构的影响
多核CPU下面,对Redis的性能影响还是挺大的。我们先来看看多核心CPU的一般架构。
在目前主流服务器上,一般都拥有多个CPU处理器,而一个CPU处理器,会拥有10~20个物理核心。如果一个服务器拥有多个CPU处理器,那么我们也成这个服务器拥有多个CPU Socket,Socket简单理解,就是一个CPU处理器,
如图为4核心CPU的架构,其中,CPU核心1、2在同一个Socket中,CPU核心3、4在另外一个Socket中。Socket之间,通过CPU总线来连接,每个Socket控制一块内存。
1、跨Socket的访问
如果一个Redis服务部署在这样的服务器上,它有可能在Socket1和Socket2之间来回切换,假设一个Redis应用现在Socket1上运行了一段时间,那么它的数据会保存在Socket1所对应的内存上,如果它再次被调度到另外一个Socket2上,此时,应用再进行内存访问的时候,就需要通过总线跨越到Socket1上来访问内存,这种访问属于远端访问,它会增加访问的延迟。
而我们常说的NUMA,则是对上述情况的一种描述,叫非统一内存访问架构(Non-uniform Memory Access,简称NUMA架构)
2、频繁的CPU核心切换
除了跨Socket访问外,在多核心访问的场景下,如果一个程序需要在一个新的CPU核心上运行,那么运行时信息就要重新加载到新的CPU核心上,新的CPU核心也需要更新缓存中的信息,这也会间接导致运行时间增加。如果这个核心之间的调度很频繁,则会大大影响Redis的性能。
加载全部内容