redis-阻塞

当Redis阻塞时,Jedis客户端会跑出JedisConnectionException异常。
内在原因:

  1. API或数据结构使用不合理。
  2. CPU饱和。
  3. 持久化相关阻塞。

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
edisRedis-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
edisRedis-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)

原文地址:https://www.cnblogs.com/thewindkee/p/12873168.html