一次线上的502错误排查问题

   

   问题描述:应用人员反映有好几个页面查询等待一段时间返回502错误,其余页面都正常查询。

   网络环境:项目环境是由N台主机部署应用程序,并由nginx配置组成集群提供服务。

    通过百度查询502错误一般是指网关错误,往往意味着一个或两个机器已不正确或不完全编程。而在项目中   502错误的问题一般属于后台服务器挂掉的问题,例如:CPU使用过满、数据库连接数过大、内存不足、甚至是内存溢出等等因素诱发导致。

    而此次我们在项目中出现问题的页面为地图监控页面,该页面会每分钟调用一次定时查询功能。通过后台的tomcat日志发现并没有报错,此时想到可能是数据库层面的问题,我们通过show variables like "%max_connection%" 查询到数据库最大连接数为200

--查询当前数据库不为Sleep且未被释放的语句:

SELECT count(*) FROM information_schema.PROCESSLIST WHERE COMMAND <> 'sleep';

此时我们查询到的数量稳定在150左右!!!问题就出在这里了,数据量未释放的连接过大,通过dstat命令查看数据库系统CPU的使用情况都高达80甚至是90以上,其实我们去查询这些未释放的语句,大多是地图监控的查询语句。通过客户了解知道,大部分客户都一直开着这个页面且长时间未关闭,且该页面会自动调用自动查询功能,由于以前用户量较少并没有爆发出这个问题。并且通过慢sql查询查询到该语句查询过慢,造成数据库连接过大,且迟迟不能释放。至于为什么是报502错误,自己并没有找到正确答案。通过了解应该是当该连接数量过多且速度过慢时nginx会判定该服务不健康,当集群中所有节点都不健康时,认为服务不存在,会有极短的一段时间对接受的连接直接返回502,即使本该200的url也受此影响。

 解决方法:重构该方法,且优化该慢sql语句。 

 

 

 

 

 

你可能感兴趣的:(http请求)