- content
现象
生产环境碰到了性能问题,应用有如下症状:
- Redis cpu突然上升到100%
- 所有应用节点pod全部挂掉重启
- php-fpm达到最大线程限制
定位过程
- 看到Redis有排队的请求,连接数突然飙高十倍,但OPS还算正常,请求处理正常
- 应用节点在Redis cpu达到100%后7分钟左右则全部挂掉
- 所有节点的心跳检测失败
最终发现是在商品修改价格时会频繁操作Redis,当前代码逻辑是商品循环修改Redis中的数据,但是中间使用了Redis::keys方法,这一行代码就阻塞了Redis 0.8s,这样循环1000次就是阻塞了800s(由于Redis是单进程处理请求),导致正常的请求无法处理而阻塞,进而导致php无能力处理心跳请求而最终挂掉
-
Redis军规
下面的军规写的就比较好了,还是要强调禁止使用Redis::keys方法,同时多条命令建议使用pipline