今天web大量超时报错,查看日志显示,tomcat链接RPC服务timeout,查看tomcat机器和RPC服务所在机器资源都正常。尝试重启RPC服务后,web仍然报错,查看nginx日志,有大量499报错。经查询得知,nginx的499报错解释如下:

499 / ClientClosed Request
    An Nginx HTTP server extension. This codeis introduced to log the case when the connection is closed by client whileHTTP server is processing its request, making server unable to send the HTTP header back

原因可能是服务端处理时间太长了,看一下upstream_response_time时间可以了解到后端程序处理了多久。

先了解一下什么是upstream_response_time和request_time分别是什么:

request_time:服务端从接受客户端请求的第一个字节到服务端应用程序处理完发送完响应数据的时间,包括请求数据时间、程序响应时间、输出响应时间
upstream_response_time:指nginx向后端如php,tomcat等建立连接开始到到处理完数据关闭连接为止的时间。

查看nginx日志,果然upstream_response_time和request_time都很大,猜测是后台处理太慢,导致客户端主动断开了链接。

最后查看db服务器,发现cpu使用率和内存使用率都很高,进而查看『show processlist』,发现mysql处理一条更新花费了很多时间,因为前两天升级了web的内存和cpu,增大了kvm的内存。应该是tomcat集群处理速度提高,导致db压力负载过大,sql处理的太慢,客户端等待时间太长,用户主动断开连接。

解决:

升级db服务器的cpu,从8核升级到16核,果然,web不在超时,nginx不再报499错误。