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 查看。