[实践OK]nginx 服务器established不断增大的调整,修改为发送完后就立即关闭连接设置后uptime负载增大,Windows下的Established的bat自动脚本备案。

jackxiang 2015-3-1 21:59 | |
背景:502 Bad Gateway nginx问题,再次排查~~~keepalive_timeout 1800; 是不是太大了,浏览器访问没有关闭会一直连接状态,这块是否有必要不keepalive呢?http1.1中默认的keep-alive为connection(使用持久化连接),在http1.0中则默认为close,在大并发量的情况下可能需要将客户端的连接close掉,以保障服务器的正常运转。(因为每一台服务器它所能建立的最大连接数是有上限的,lnux下ulimit n xxx),nginx不像apache,直接有指令keep-alive off/on;它使用的是keepalive_timeout [time],默认的时长为75,可以在http、server、location使用此指令。keepalive_timeout  0; 来自:http://www.cnblogs.com/meteoric_cry/archive/2011/06/07/2074150.html
问题:established 很多的问题,发现我的web机器上面的ESTABLISHED链接数暴多,机器环境是nginx+mysql+fastcgi的
我打开一个页面发现有10来个ESTABLISHED状态链接,页面加载完了状态还在,大慨要过1分钟才
完成这个状态,我把打开的页面关闭掉后ESTABLISHED的链接还要过20秒才释放,
nginx的  keepalive_timeout 30
内核的一些参数都改的比较小
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 800

实践得出如下参数:


新的发现,及解释:
一)但uptime变大了,以前3,现在变8:
uptime
16:02:20 up 46 days, 21 min,  1 user,  load average: 11.99, 8.60, 6.66
二)timewait变大:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'  
TIME_WAIT 428
FIN_WAIT1 6
ESTABLISHED 16
FIN_WAIT2 8
SYN_RECV 2

因没有复用socket里的ulimit句柄,导致系统负载变大,再就是出现了性能上的降低表现在TIME_WAIT数量变多~
linux下默认是不产生core文件的,要用ulimit -c unlimited放开,这儿的socket句柄不释放也是通过: ulimint -a  里的 open files  (-n) 65535 实现的,
所以使用下面的命令:   ulimit -n 65535   并不能有效的解决这个问题。直接这么修改open files 不能得到保持。下面给出的方法最简单和最直接:   修改/etc/security/limits.conf 添加如下一行:   * - nofile 65535   修改/etc/pam.d/login添加如下一行   session required /lib/security/pam_limits.so   最重要的,修改完这些后,要重新登录下才行,不然该session的句柄数不会生效。

ulimit 功能简述
假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。
摘自:http://www.cnblogs.com/wangkangluo1/archive/2012/06/06/2537677.html

自己博客参看,Linux查看文件句柄占用多的进程 ,查看Linux某进程的句柄数,并通过ulimit -n 单个进程打开的最大文件句柄数量限制解决accept4() failed (24: Too many open files):http://jackxiang.com/post/6570/
————————————————————————————————————————————————————————————————————————————
请问下各位让ESTABLISHED 能快速完成释放还有哪些地方要注意的,不然的话造成大量的ESTABLISHED链接


HTTP/1.1 是允许 keepalive 的,这样可以降低服务器的负载
你要是仅仅想减少 ESTABLISHED,大可以在 nginx 上禁止 keepalive
这样虽然可以实现你的需求,但却与你所希望的结果大相径庭


对 我需要的是减低机器的负载,keepalive肯定也是要开的,可能是内核某些参数设置过大了,导致ESTABLISHED状态保持时间太长,
动不动就是好几百上千的ESTABLISHED 机器负责有点高

不是多不多的问题,是我把页面关了这个状态要过30秒才回收,这时间太久了,正常的话应该是页面刷新完了这个状态就完成了
或者说页面关闭了这个状态就完成了,而不是要过很成时间才完成这个状态

是通过 netstat 看的吗?
如果是,顺便也看一下 Recv-Q 和 Send-Q 那两列,看是 0 还是什么


显示Recv-Q 和 Send-Q 那两列,都是0
netstat -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 jackxiang.com:8012           *:*                         LISTEN      
tcp        0      0 jackxiang.com:9004           *:*                         LISTEN      
tcp        0      0 jackxiang.com:9005           *:*                         LISTEN      
tcp        0      0 jackxiang.com:8013           *:*                         LISTEN      
tcp        0      0 *:5901                      *:*                         LISTEN      
tcp        0      0 jackxiang.com:8015           *:*                         LISTEN      
tcp        0      0 *:sunrpc                    *:*                         LISTEN      
tcp        0      0 *:http                      *:*                         LISTEN      
tcp        0      0 jackxiang.com:x11            *:*                         LISTEN      
tcp        0      0 jackxiang.com:cddbp-alt      *:*                         LISTEN      
tcp        0      0 jackxiang.com:8017           *:*                         LISTEN      
tcp        0      0 *:6001                      *:*                         LISTEN      
tcp        0      0 *:ssh                       *:*                         LISTEN      
tcp        0      0 jackxiang.com:socks          *:*                         LISTEN      
tcp        0      0 localhost:smtp              *:*                         LISTEN      
tcp        0      0 *:https                     *:*                         LISTEN      
tcp        0      0 *:34139                     *:*                         LISTEN      
tcp        0      0 jackxiang.com:irdmi          *:*                         LISTEN      
tcp        0      0 jackxiang.com:mcreport       *:*                         LISTEN      
tcp        0      0 jackxiang.com:8006           *:*                         LISTEN      
tcp        0      0 jackxiang.com:cslistener     *:*                         LISTEN      
tcp        0      0 jackxiang.com:8009           *:*                         LISTEN      
tcp        0      0 jackxiang.com:etlservicemgr  *:*                         LISTEN      
tcp        0      0 jackxiang.com:8010           *:*                         LISTEN      
tcp        0      0 *:sunrpc                    *:*                         LISTEN      
tcp        0      0 *:webcache                  *:*                         LISTEN      
tcp        0      0 *:6001                      *:*                         LISTEN      
tcp        0      0 *:ssh                       *:*                         LISTEN      
tcp        0      0 *:60763                     *:*                         LISTEN    


我做了一个实验,如果是 keepalive 的情况,默认浏览器不关闭,连接就不断开
即使你不再有任何页面的访问操作,连接也一直保持,直到浏览器关闭为止

因此,初步判断,你的 ESTABLISHED 过多的原因是大多数人不关闭浏览器造成的,你自己也可以试验一下
如果想缩短这个,可以修改 webserver 的配置

因为现在的浏览器都是支持keepalive并遵守服务器配置,我试验了也是这样的
要把整个浏览器关了才会没有ESTABLISHED ,楼上的请问下在nginx上怎么主动断开,可以试验下看性能和速度方面会不会有影响

以上讨论来自:
http://bbs.chinaunix.net/thread-1945952-2-1.html
————————————————————————————————————————————————————————————————

导致服务器load过高
send_timeout

syntax: send_timeout the time

default: send_timeout 60

context: http, server, location

Directive assigns response timeout to client. Timeout is established not on entire transfer of answer, but only between two operations of reading, if after this time client will take nothing, then nginx is shutting down the connection.



应该是tcp连接没有释放造成的,我最近也碰到这个问题


其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。

具体如下:

状态:描述
  CLOSED:无连接是活动的或正在进行
  LISTEN:服务器在等待进入呼叫
  SYN_RECV:一个连接请求已经到达,等待确认
  SYN_SENT:应用已经开始,打开一个连接
  ESTABLISHED:正常数据传输状态
  FIN_WAIT1:应用说它已经完成
  FIN_WAIT2:另一边已同意释放
  ITMED_WAIT:等待所有分组死掉
  CLOSING:两边同时尝试关闭
  TIME_WAIT:另一边已初始化一个释放
  LAST_ACK:等待所有分组死掉

Tcp图解:
点击在新窗口中浏览此图片

获取Windows下的Established的bat自动脚本备案,指定进程的网络连接状态为established的连接数:


文库:http://wenku.baidu.com/link?url=NJKFU95Elz0RjW6MV99qhoVdcSz7OLxvOoPhdnoOMGb_mKMUVysGxc8GhqSXG7pwuyY5fuNQEW2iyQGzT1DzraPI6kv3l4RzVvszkn3SUl3

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/7825/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2015-3-2 16:38
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]