关于goneaway及499
关于上面现象的分析如下
问题描述:
接口偶发性出现接口耗时过长的情况
根源:
“sockets的快速回收”机制被启动
简单代码+数据分析:
1. 经简单分析,耗时主要出现在连接数据库的方法:mysql_connect
2. 耗时基本为3s(3.001s,2.999s,3.000s)
进一步分析:
由于耗时出现在php的mysql_connect函数上,从代码上基本上可以确认非业务逻辑问题;
可能情况:
1、Mysql_connect具体实现问题
经查看具体代码,未发现有异常。
2、网络抖动
经抓包确认且不大可能为稳定为3秒,非此问题;
3、DNS解析
经分析直接绑定HOST与DNS解析对比,确认非此问题;
4、LVS抖动
根据出现时间,与LVS监控对比,确认非此问题
5、mysql服务器配置或者mysql配置存在问题
待分析
……
最终确认:
Mysql服务器配置问题,启动了“sockets的快速回收”机制
根据运维和DBA对app机器即(Client端)到mysql服务(Server端)的tcp日志抓包中出现了passive connection rejected because of time stamp,且抓到了syn数据包,这个即标识tcp请求一次握手成功
为说明此问题,需要补充以下知识点:
(1) 公司的机器部署架构

大部分公司用LVS做负载均衡,通常是前面一台LVS,后面多台后端服务器,它便转发给后端服务器
(2) TCP协议中的三次握手

(3) “sockets的快速回收”机制
a) 目的:sockets快速回收
b) 行为解释:可以缓存每个连接最新的时间戳,后续请求中如果时间戳小于缓存的时间戳,即视为无效,相应的数据包会被丢弃。
c) 涉及参数:tcp_timestamps和tcp_tw_recycle
i. tcp_timestamps默认为1,tcp_tw_recycle默认为0
ii. 当tcp_timestamps与tcp_tw_recycle同时为1时,表示此机制开启
结论分析:
在有LVS做负载均衡的情况下,,对于后端服务器来说,请求的源地址就是LVS的地址((nat模式才会修改源地址,我们用的都是dr模式)),加上端口会复用,
所以从后端服务器的角度看,原本不同客户端的请 求经过LVS的转发,就可能会被认为是同一个连接,于是后面的数据包就被丢弃了。
具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK
后续思考:
1、
既然必须同时激活tcp_timestamps和tcp_tw_recycle才会触发这种现象,那只要禁止 tcp_timestamps,同时激活tcp_tw_recycle,
就可以既避免丢包问题,又降低TIME_WAIT连接数量。如果服务器并不 依赖于RFC1323,那么这种方法应该也是可行的,不过最好多做测试,以防有其他的副作用。
2、为什么是3s?
建立连接时SYN超时,如果server端接到了clien发的SYN后回了SYN-ACK后client掉线了,
server端没有收到client回来的ACK,那么,这个连接处于一个中间状态,即没成功,也没失败。
于是,server端如果在一定时间内没有收到的TCP会重发SYN-ACK。在Linux下,默认重试次数为5次,
重试的间隔时间从1s开始每次都翻售,5次的重试时间间隔为1s, 2s, 4s, 8s, 16s,总共31s,
第5次发出后还要等32s都知道第5次也超时了,所以,总共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 2^6 -1 = 63s,
TCP才会把断开这个连接。但跟运维沟通之后我们的重试机制时间间隔为3s。
3、安全起见,通常要禁止tcp_tw_recycle,至于TIME_WAIT连接过多的问题,可以通过激活tcp_tw_reuse来缓解
以上分析如有纰漏,麻烦指正,谢谢!
关于goneaway及499的更多相关文章
- nginx 499 状态码优化
在grafana界面中发现不少499的状态码,在网上了解到出现499的原因大体都是说服务端处理时间过长,客户端主动关闭了连接. 既然原因可能是服务端处理时间太长了,看一下upstream_resp ...
- Nginx状态码499
1.问题描述 140.207.202.187 - - [18/May/2016:10:30:58 +0800] "POST/v3/violations HTTP/1.1" 499 ...
- Nginx_HTTP 499 状态码 nginx下 499错误
日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499.发送字节数是0. 老是有用户反映网站系统时好时坏,因为线上的产 ...
- Nginx 499错误的原因及解决方法
今天进行系统维护,发现了大量的499错误, 499错误 ngx_string(ngx_http_error_495_page), /* 495, https certificate error */n ...
- NginX issues HTTP 499 error after 60 seconds despite config. (PHP and AWS)
FROM: http://stackoverflow.com/questions/15613452/nginx-issues-http-499-error-after-60-seconds-despi ...
- Nginx的 HTTP 499 状态码处理
1.前言 今天在处理一个客户问题,遇到Nginx access log中出现大量的499状态码.实际场景是:客户的域名通过cname解析到我们的Nginx反向代理集群上来,客户的Web服务是由一个负载 ...
- nginx 499状态码
Web服务器在用着nginx,在日志中偶尔会看到有499这个错误. rfc2616中,400-500间的错误码仅定义到了417,所以499应该是nginx自己定义的.后来想到读读nginx代码,疑问立 ...
- HTTP请求的502、504、499错误
1.名词解释 502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应(伪响应). 504 Gateway Time-out:作为网关或者代理工作的服务 ...
- Codeforces Round #499 (Div. 2)
Codeforces Round #499 (Div. 2) https://codeforces.com/contest/1011 A #include <bits/stdc++.h> ...
随机推荐
- Java集合类--->入门下篇
HashSet集合 在上篇大概了解了什么是集合类,知道它可以存储任意类型的对象,并且比数组灵活,集合类的长度可以变化.这里将接着介绍一下,Set接口的实现类之一,HashSet集合,Set集合:元素不 ...
- cookie的默认有效目录
php的setcookie是设置cookie操作的函数. 基本参数百度就有一堆答案.其中第四个参数是cookie的有效目录.这个参数是可选的,如果没有设置这个参数.默认 的有效范围是当前目录及其子目录 ...
- Centos7部署NFS
server1:192.168.1.189 ###客户端 server2:192.168.1.190 ##服务端 1.首先创建共享目录. mkdir -p /data/share 安装nfs ...
- phpcon china 2017听讲总结
1. <PHP in 2017>--Rasmus Lerdorf 2. <车轮的服务化service架构>--韩天峰 3. <企点微服务网关演进之路>--郑榕 4. ...
- mongodb与mysql的命令对比
mongodb与mysql命令对比 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(col ...
- Excel文本获取拼音
[说明] 版本:Excel 2010 文件后缀:.xls 有在.xlsb文件下使用未成功.建议使用.xls后缀. 1.调出“开发工具” 步骤:文件-->选项-->自定义功能区-->勾 ...
- 删除文件时提示 你需要来自system的权限才能对此文件夹进行更改
问题描述: 我的计算机是Win7 x64操作系统,在我的计算机的F盘中,不知道什么时候多了个“12e4k69m762nzcgt8zx”这样一个文件夹,应该是某个软件自己创建并留下的文件夹,想删除掉则提 ...
- cookie与web Storage
一.cookie 1. http头与cookie cookie是HTTP Cookie的简称.该标准要求: (1)服务器的HTTP响应头包含 Set-Cookie字段 响应头Eg: HTTP/1.1 ...
- easy_install下载地址及安装
下载地址 https://pypi.python.org/pypi/setuptools 解压 tar -xzvf xx.tar.gz 安装 cd 解压目录 sudo python setup.py ...
- VS Code:快捷方式
转于:vscode: Visual Studio Code 常用快捷键 博主:魚魚 更多操作参见官网:https://code.visualstudio.com/docs/getstarted/key ...