现象
生产环境和测试环境都发现有个外围应用通过搜索服务调用搜索引擎时,偶尔会出现大量的访问超时的问题,通过如下方式进行分析排查:
l 首先是拿到搜索服务的JavaCore,发现其堵在HttpClient的发送上面,被堵的连接有数百个,原因是不能够从连接池中获取到连接;
l 首先想到的就是连接池没有释放,检查代码,也确实存在着一些调用没有释放连接,特别是在异常的情况下,针对这一部分代码进行修复后,可是一段时间之后还是出现了访问超时的问题;
l 考虑到这个外围应用的访问现出问题的时候,其它的外围应用调用搜索服务是没有问题的,因此确定当前搜索服务还没有挂;
l 不同的外围应用可能调用的后台搜索引擎是不一样的,难道是该外围应用对应的搜索引擎出现了问题?不过经过对该搜索引擎进行分析,该搜索引擎本身是正常的,但是有一个奇怪的现象,在外围应用调用搜索服务发生超时时,搜索引擎本身没有接受到任何请求;
l 也就是说经搜索服务的请求都没有提交到该搜索引擎上,难道是搜索服务与该搜索引擎之间的连接有问题?通过网络排查,使用Ping和Telnet进行正向和反向确定,从搜索服务和搜索引擎之间的网络是正常的,且端口也可以正常访问;
l 再回到搜索服务所在的服务器,通过netstat一看,发现有400个CLOSE_WAIT与该搜索引擎相关的连接,这个数字恰好是应用中设置的单个Route所能够连接的最大