我们的DSP系统目前基本非凌晨时段的QPS都在10W以上,我们使用Golang来处理这些HTTP请求,Web服务器的前端用Nginx来做负载均衡,通过Nginx的proxy_pass来与Golang交互。

由于nginx代理使用了短链接的方式和后端交互的原因,使得系统TIME_WAIT的tcp连接很多:

shell> netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
TIME_WAIT
CLOSE_WAIT
FIN_WAIT2
ESTABLISHED
SYN_RECV 

ss 比 netstat 要快,所以也可以用下面的命令来查看:

shell> ss -ant | awk 'NR>1 {++s[$1]} END {for(k in s) print k,s[k]}'

这会占用系统过多的端口,还浪费了系统资源,所以我们必须想办法减少TIME_WAIT。

TIME_WAIT导致占用过多端口的一个影响是会占用我们需要使用到的端口,例如我们有个服务监听的端口为8012,重启的时候经常会提示端口被占用。
通过查看/proc/sys/net/ipv4/ip_local_port_range可以知道设置的Linux内核自动分配端口的端口范围:

shell> cat /proc/sys/net/ipv4/ip_local_port_range
 

对于这个设置系统就会从1025~65535这个范围内随机分配端口来用于连接,而我们服务的8012端口刚好在这个范围之内,所以如果8012刚好被系统分配出去使用了,则启动我们服务的时候,就会提示端口被占用。

所以我们需要设置/proc/sys/net/ipv4/ip_local_reserved_ports来告诉系统给我们预留哪些端口,不可以用于自动分配。

shell> vim /etc/sysctl.conf
net.ipv4.ip_local_reserved_ports = ,-

shell> sysctl -p

关于预留端口的更具体信息可以参考:

上面我们解决了端口占用问题,但是我们还是需要解决TIME_WAIT过多的问题。
Nginx 1.1以上版本的upstream已经支持keep-alive的,所以我们可以开启Nginx proxy的keep-alive来减少tcp连接:

upstream http_backend {
    server ;

    keepalive ;
}

server {
    ...

    location /http/ {
        proxy_pass http://http_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        ...
    }
}

可以参加Nginx的官方文档: http://nginx.org/cn/docs/http/ngx_http_upstream_module.html#keepalive

开了keep-alive之后,TIME_WAIT明显减少:

shell> netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'
TIME_WAIT
CLOSE_WAIT
FIN_WAIT1
FIN_WAIT2
ESTABLISHED
SYN_RECV 

另外不少文章提到可以修改系统的/etc/sysctl.conf配置来减少TIME_WAIT的tcp连接:

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

参见: http://blog.s135.com/post/271/

不过开启tcp_tw_recycle可能会带来一些不稳定的网络问题,请参考:

关于sysctl相关配置的说明,请参考:
https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

参考文章:

Nginx做前端Proxy时TIME_WAIT过多的问题的更多相关文章

  1. 【Nginx】使用Nginx做反向代理时,关于被代理服务器相应的超时设置

    > 参考的优秀文章 Module ngx_http_proxy_module > 设置等待被代理服务器的最大响应时间 使用Nginx做反向代理时,因被代理服务器因业务确实复杂,需时较久,往 ...

  2. Nginx做NodeJS应用负载均衡配置实例

    这篇文章主要介绍了Nginx做NodeJS应用负载均衡配置实例,本文直接给出配置实例,需要的朋友可以参考下. 负载均衡可以把用户的请求分摊到多个服务器上进行处理,从而实现了对海量用户的访问支持.负载均 ...

  3. Nginx下TIME_WAIT过多的调优

    查看Nginx并发状态 #netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 1259SYN_ ...

  4. nginx做负载均衡器以及proxy缓存配置 - SegmentFault

    nginx做负载均衡器以及proxy缓存配置 - SegmentFault nginx做负载均衡器以及proxy缓存配置

  5. 在做APP前端开发时应注意的一些问题

    在做APP前端开发时应注意的一些问题 在整个app开发流程中,app前端开发是一个必不可少的环节,也是一个在app开发过程中重量级的角色.说到这,那么在app应用的前端开发中,又要注意什么问题呢?一. ...

  6. 使用nginx做负载均衡的session共享问题

    查了一些资料,看了一些别人写的文档,总结如下,实现nginx session的共享PHP服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不 ...

  7. nginx做负载均衡配置文件

    nginx做负载均衡是在反向代理的基础上做的,代码如下: ## Basic reverse proxy server ## ## Apache backend for www.baidu.com ## ...

  8. zabbix-agent TIME_WAIT 过多

    一.系统环境 操作系统: Centos 6.4 64bit zabbix-agent 版本: Zabbix agent v2.2.7 (revision 50148) (24 October 2014 ...

  9. Keepalived+Nginx提供前端负载均衡+主从双机热备+自动切换

    原文链接:http://unun.in/linux/156.html 方案: 采用两台Nginx服务器作为前端,提供静态web内容,分发web请求,一主一从,Keepalived实现状态监测,保证 N ...

随机推荐

  1. XAF学习笔记之-多表头设计

    空闲之余,看了下全英文的DEV 的XAF帮助文档,一半的英文我认识他,一半的英文他认识我,反正拆开成26个字母我全认识 不那么啰嗦了,先看效果 如何做:分以下几步 第一步:打开这个文件,这个文件就是X ...

  2. oracl 创建用户

    -- Create the user create user ADMIN  default tablespace SYSTEM  temporary tablespace TEMP  profile ...

  3. CSS3滚动条-webkit-scrollbar

    webkit现在支持拥有overflow属性的区域,列表框,下拉菜单,textarea的滚动条自定义样式. 如果你想跳过介绍,直接看demo的话,请点击demo 滚动条是一个伪元素,可以自定义样式.这 ...

  4. Requirejs之AMD规范

    一.什么是AMD规范 AMD是Asynchronous Module Definition-----异步模块定义 AMD规范定义了2个函数define()与require() 下面我们来看一下定义方法 ...

  5. leetcode-Spiral Matrix II 螺旋矩阵2之python大法好,四行就搞定,你敢信?

    Spiral Matrix II 螺旋矩阵 Given an integer n, generate a square matrix filled with elements from 1 to n2 ...

  6. pdmreader支持读取xml格式的pdm文件,无法读取二进制格式的pdm文件。

    您的Pdm数据字典文件可能不被PDMReader读取,可能是因为pdm文件版本的问题.但 您可以通过PowerDesigner12(下载PowerDesigner12)进行转换 后进行读取. 您要做的 ...

  7. JAVA swing中JPanel如何实现分组框的效果以及设置边框颜色 分类: Java Game 2014-08-16 12:21 198人阅读 评论(0) 收藏

    代码如下: import java.awt.FlowLayout; import java.awt.Frame; import java.awt.GridLayout; import javax.sw ...

  8. spring开发相关网址

    jar包下载地址:http://repo.springsource.org/libs-release-local/org/springframework/spring/

  9. c#与vb.net在App_Code里面编译要通过,需要以下web.config的配置

    web.config的配置: <system.web> <codeSubDirectories> <add directoryName="VB"/&g ...

  10. 利用css中的border生成三角,兼容包括IE6的主流浏览器

    1.生成四个不同颜色方向的梯形 #ladder{ width:20px; height:20px; border:10px solid; border-color:#ff3300 #0000ff #3 ...