《Redis开发与运维》学习笔记--阻塞

2018-10-26  本文已影响65人  小北觅

Redis是典型的单线程架构,所有的读写操作都是在一条主线程中完成的。当Redis用于高并发场景时,这条线程就变成了它的生命线。如果出现阻塞,哪怕是很短时间,对于应用来说都是噩梦。

导致阻塞问题的原因:

一、发现阻塞

二、内在原因

2.1 API或数据结构使用不合理

通常Redis执行命令速度非常快,但是,如果对一个包含上万个元素的hash结构执行hgetall操作,由于数据量比较大且命令算法复杂度是O(n),这条命令执行速度必然很慢。

对于高并发的场景应该尽量避免在大对象上执行算法复杂度超过O(n)的命令。

(1)如何发现慢查询

Redis原生提供慢查询统计功能,执行slowlog get{n}命令可以获取最近的n条慢查询命令,默认对于执行超过10毫秒的命令都会记录到一个定长队列中,线上实例建议设置为1毫秒便于及时发现毫秒级以上的命令。

(2)发现慢查询后如何调整

(3)如何发现大对象
Redis本身提供发现大对象的工具。具体命令:

redis-cli -h {ip}  -p {port} --bigkeys

内部原理采用分段进行scan操作,把历史扫描过的最大对象统计出来便于分析优化。

2.2 CPU饱和

单线程的Redis处理命令时只能使用一个CPU。而CPU饱和是指Redis把单核CPU使用率跑到接近100%。使用top命令很容易识别出对应Redis进程的CPU使用率。CPU饱和是非常危险的,将导致Redis无法处理更多的命令,严重影响吞吐量和应用方的稳定性。对于这种情况,首先判断当前Redis的并发量是否达到极限,建议使用统计命令redis-cli -h {ip} -p {port} --stat获取当前Redis使用情况

2.3 持久化阻塞

对于开启了持久化功能的Redis节点,需要排查是否是持久化导致的阻塞。

三、外在原因

3.1 CPU竞争

3.2 内存交换

内存交换(swap)对于Redis来说是非常致命的,Redis保证高性能的一个重要前提是所有的数据在内存中。如果操作系统把Redis使用的部分内存换出到硬盘,由于内存与硬盘读写速度差几个数量级,会导致发生交换后的Redis性能急剧下降。

预防内存交换:

3.3 网络问题

(1)连接拒绝

(2)网络延迟
网络延迟取决于客户端到Redis服务器之间的网络环境。主要包括它们之间的物理拓扑和带宽占用情况。常见的物理拓扑按网络延迟由快到慢可分为:同物理机>同机架>跨机架>同机房>同城机房>异地机房。但它们容灾性正好相反,同物理机容灾性最低而异地机房容灾性最高。

网络延迟问题经常出现在跨机房的部署结构上,对于机房之间延迟比较严重的场景需要调整拓扑结构,如把客户端和Redis部署在同机房或同城机房等。
带宽瓶颈通常出现在以下几个方面:

(3)网卡软中断
网卡软中断是指由于单个网卡队列只能使用一个CPU,高并发下网卡数据交互都集中在同一个CPU,导致无法充分利用多核CPU的情况。网卡软中断瓶颈一般出现在网络高流量吞吐的场景。

参考资料:
《Redis开发与运维》

上一篇 下一篇

猜你喜欢

热点阅读