线上PHP程序动不动就报PHP Fatal error: Uncaught RedisException: read error on connection错误,就是连接Redis在那么1秒钟有问题,我们的架构是:

PHP程序—>twemproxy代理—>Redis实例(5个节点)

PHP-FPM的超时时间是1s钟,也就是说如果PHP程序执行超过1s钟就会中断,另外由于Redis是单线程的,所以如果一个请求的时间太久就会造成Redis假死状态,接收不了其他请求,继而就会造成PHP程序连接报错。

首先接收到错误日志是在ELK上面,如下图:

PHP程序连接Redis报read error on connection问题_时间戳

看一下报错的时间和报错数量,报错的数据有3000多个,而报错时间都在14:41分。

然后看了twemproxy的日志。

PHP程序连接Redis报read error on connection问题_redis_02

可以看出执行时间都是1s多,肯定是不正常的,正常情况下一个Redis Get请求大概在20ms左右。同时可以看出twemproxy报错的后端服务器都是同一个(一共有5个后端)。

然后去172.18.129.135:6546这个实例上面查看慢日志。

127.0.0.1:6546> SLOWLOG get 1 1) 1) (integer) 50 2) (integer) 1470724891 #执行时间戳,转换为正常时间为2016/8/9 14:41:31; 3) (integer) 1761020 #执行时间,微秒; 4) 1) "ZRANGE" 2) "summer_user_rank" 3) "0" 4) "-1" 5) "WITHSCORES"
1
2
3
4
5
6
7
8
9
127.0.0.1:6546> SLOWLOG get 1
1) 1) (integer) 50
   2) (integer) 1470724891    #执行时间戳,转换为正常时间为2016/8/9 14:41:31;
   3) (integer) 1761020       #执行时间,微秒;
   4) 1) "ZRANGE"
      2) "summer_user_rank"
      3) "0"
      4) "-1"
      5) "WITHSCORES"

看这条慢日志的时间刚好与ELK日志中的报错时间相同,同时执行时间为1.7秒。所以接下来就是找研发确定这个Key,改进问题。

PHP程序连接Redis报read error on connection问题_时间戳_03

转载自:http://www.ywnds.com/?p=5556