当Redis阻塞时,Jedis客户端会跑出JedisConnectionException异常。
内在原因:
- API或数据结构使用不合理。
- CPU饱和。
- 持久化相关阻塞。
1.使用slowlog get {n} 查询慢查询。
1)修改为为低算法度的命令。如hgetall改为hmget,禁用sort等。
2)调整大对象。
使用redis-cli.exe -h {ip} -p {port} --bigkeys 发现大对象
2.
使用redis-cli.exe -h {ip} -p {port} --stat 查看cpu占用
使用info commandstats 分析出命令不合理的开销时间。
3.
1)fork阻塞,发生在RDB和AOF重写时。执行info stats 查看latest_fork_usec(表示Redis最近一次fork操作耗时)。
2)AOF刷盘阻塞,一般每秒执行一次刷盘。硬盘压力过大时,fsync操作需要等待。查看日志或查看info persistence的aof_delayed_fsync。
外在原因:
1.CPU竞争。
2.内存交换。
3.网络问题。
1.
进程竞争。Redis是CPU密集型应用。其他CPU密集型服务过度消耗CPU时影响到Redis。
绑定CPU。为了充分利用多核CPU,一台机器部署多个实例,将Redis绑定到了CPU。但是在RDB/AOF重写时,子进程重写对CPU使用率在90%以上,影响了性能。 建议开启了持久化或参与复制的主节点不绑定CPU。
2.
内存交换。操作系统把Redis使用的部分内存换出到了硬盘。先查Redis进程号,再根据进程号查询交换信息。
# redis-cli -p 6379 info server |grep process_id
process_id:4476
# cat /proc/4476/smap |grep Swap
Swap: 0 kb
Swap: 4 kb
....
3.
网络问题。
网络闪断。Redis连接被拒绝,如超过最大连接数。连接溢出,如进程限制,backlog队列超出。
D:\Program Files\redis\Redis-x64-3.2.100>redis-cli.exe --stat
------- data ------ --------------------- load -------------------- - child -
keys mem clients blocked requests connections
1 1.72M 3 0 2691 (+0) 6
1 1.72M 3 0 2693 (+2) 6
1 1.72M 3 0 2695 (+2) 6
^C
D:\Program Files\redis\Redis-x64-3.2.100>redis-cli.exe --bigkeys
# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type. You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).
[00.00%] Biggest string found so far 'mykey' with 1 bytes
-------- summary -------
Sampled 1 keys in the keyspace!
Total key length in bytes is 5 (avg len 5.00)
Biggest string found 'mykey' has 1 bytes
1 strings with 1 bytes (100.00% of keys, avg size 1.00)