Redis 的噩梦:阻塞

1. 发现阻塞

(1)当Redis阻塞时,应用方会收到大量Redis超时异常,比如JedisConnectionException异常。通过日志系统收集异常,异常达到阈值时报警。需要修改Jedis Connection 类下的connect ,sendCommand, readProtocolWithCheckingBroken 方法捕捉连接,发送命令,协议读取事件异常。

2. 内在原因

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

比如对一个包含成千上万元素的hash结构执行hgetall 操作。

(1)如何发现慢查询
执行slowlog get n:获取最近n条慢查询命令。

(2)如何发现大对象
Redis 本身提供了发现大对象的工具,对应命令为:redis-cli -h …

2.2. CPU 饱和

(1)单线程的Redis处理命令时只能使用一个CPU,而CPU饱和是指Redis把单核CPU使用率跑到接近100%
(2)redis-cli – stat
(3)通过集群水平扩展的方式赖分摊OPS压力。

2.3 持久化阻塞

(1)fork阻塞
发生在RDB和AOF重写。如果fork操作本身耗时过长,必然会导致主线程阻塞。

3. 外在原因

3.1 CPU竞态

3.2 内存交换(swap)

操作系统把Redis使用的部分内存换出到硬盘,由于硬盘和内存读写速度差几个数量级,会导致发生交换后的Redis性能急剧下降。

3.3 网络问题

(1)Redis连接拒绝。 Redis通过maxclients参数控制客户端最大连接数。
(2)**连接溢出。**操作系统一般会对进程的使用资源做限制,其中有一项是限制可打开的最大文件控制,通过ulimit -n 查看。

你可能感兴趣的:(Redis)