对dubbo的服务治理管理页面,有人查询已经上线的服务十分慢,甚至要5,6分钟才返回结果,但有些查询得时间比较正常。
由于是第一次接手这个项目,并不知到其中的原理,怎么实现查询的,有使用到zk加数据库的查询。大致判断应该是这两个耗时很长导致的。
接下来当然是开始在本地运行这个项目,好不容易跑起来,该怎样入手了?
首先,模拟用户的搜索,试了好几个dubbo接口,查询的速度都正常,好不容易找到一个时间返回很长的,开始调查。
既然使用到的是tomcat,一般来说接口也是同步返回的,没有另开线程返回异步结果,所以找到idea debugger下的所有线程。使用的是tomcat,tomcat开的线程用户请求,都是http-nio-{{port}}-exec-{{index}},找到其线程前缀,发现一个线程的状态一直是RUNNING,对其右键,选择suspend,暂停此线程。发现其卡在io的连接上,看到其调用栈,考到项目本身类所在的线程栈,发现是一个调用sql接口。
接下来就是复现了。复制其线程站传递给数据库的参数,构造相对应的语句,发现其运行了5分钟半才得到结果,至此原因找到了,是sql select出了问题,由于有些dubbo读物并没有手动设置group这时会手动指定其group为dubbo,而数据库数据又很多,根据group查询其结果超过100万条(),结果十分巨大。所以十分耗时,造成结果查询很慢。