现象:
程序更新上线一段时间后,某一个业务处理出现速度极慢的情况,一个简单的业务处理需要10多秒,甚至更久时间。
原因分析:
通过日志打印时间进行分析,发现在系统启动的时候,处理速度很快,当程序运行一段时间后,处理速度极慢。以前没有出现过这么慢的情况,自从更新了程序以后出现该问题,初步推断是代码编写问题。
通过TOP命令查看CPU利用率,CPU在95%的时间都处于空闲状态,这说明了程序大量时间都没有执行有效任务,应该是耗在了IO操作上。
然后通过排查代码,发现业务代码,只有redis以及Mysql的网络IO,猜想应该不是Mysql的问题,于是到redis所在服务器,通过TOP命令查看redis进程情况,发现redis进程的CPU使用率,一直保持在100%。进一步通过redis命令行查询慢查询日志,发现有大量的KEYS【*】的操作,每一个KEYS【*】操作耗时都在几百毫秒,加上redis单线程处理,如果在高并发的情况下很容易导致redis的请求堆积,从而降低redis任务处理速度。
比如:一个redis请求耗时200毫秒的话,如果同时有10个查询请求发送到redis,那么第10个redis查询请求,会在2秒后才得到响应,2秒的耗时任务的应用系统中是难以接受的。而且在redis官网也说明了,在生产环境中谨慎使用KEYS,会影响性能。
解决方案:
改为精准KEY查询,不使用KEYS指令模糊查询。修改过后,该问题得到有效解决。