zoukankan      html  css  js  c++  java
  • 【转】打开linux-tcp端口快速回收

     

    原文:http://www.zhaoxiaodan.com/lnmp/%E6%89%93%E5%BC%80linux-tcp%E7%AB%AF%E5%8F%A3%E5%BF%AB%E9%80%9F%E5%9B%9E%E6%94%B6.html

    -------------------------------------------------------------------------------------------------------

    打开linux-tcp端口快速回收

    事件:

    之前看到一些文章说关于流量升高导致TIME_WAIT增加,MySQL连接大量失败的问题, 当时并不是很理解究竟怎么回事

    今天在对阿里云服务器上的tengine 做 1000个并发的webbench 测试时,ssh 会被踢掉,

    怀疑网络链接的问题 ,用netstat 查看 ,看到有很多很多 TIME_WAIT 状态的 tcp 链接:

    …
    tcp 0 0 42.121.16.232:www 42.121.16.220:44091 TIME_WAIT
    tcp 0 0 42.121.16.232:www 42.121.16.220:42309 TIME_WAIT
    tcp 0 0 42.121.16.232:www 42.121.16.220:43896 TIME_WAIT
    tcp 0 0 42.121.16.232:www 42.121.16.220:44150 TIME_WAIT
    tcp 0 0 localhost:9000 localhost:34634 TIME_WAIT
    tcp 0 0 42.121.16.232:www 42.121.16.220:44493 TIME_WAIT
    tcp 0 0 localhost:9000 localhost:35354 TIME_WAIT
    tcp 0 0 42.121.16.232:www 42.121.16.220:42770 TIME_WAIT
    tcp 0 0 localhost:9000 localhost:34995 TIME_WAIT
    tcp 0 0 localhost:9000 localhost:35038 TIME_WAIT
    tcp 0 0 localhost:9000 localhost:34108 TIME_WAIT
    tcp 0 0 42.121.16.232:www 42.121.16.220:41764 TIME_WAIT
    tcp 0 0 42.121.16.232:www 42.121.16.220:42337 TIME_WAIT
    tcp 0 0 42.121.16.232:www 42.121.16.220:44179 TIME_WAIT
    …
    

    nginx将php解析通过TCP转发给php-fpm,需要占用一个TCP,php-fpm中的mysql连接, 又需要占用一个TCP

    (但是检查发现, 其实没有 php-fpm -> mysql 的链接, 因为mysql使用的不是TCP而是UNIX SOCKET, 具体看 这里 )

    再看:

    ~# netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
    SYN_RECV 186
    TIME_WAIT 30245
    ESTABLISHED 211
    FIN_WAIT1 333
    

    TIME_WAIT 居然有3W多个 ,随着时间推移还会极速增加中

    怪不得了, 端口也就65536个, 用完了自然就没了!!

    而且,

    解决办法:打开LINUX TCP 端口快速回收

    修改 /etc/sysctl.conf, 添加两条数据

    #打开重用
    net.ipv4.tcp_tw_reuse = 1
    #打开快速回收
    net.ipv4.tcp_tw_recycle = 1
    

    保存后执行 sysctl -p 生效

    注:

    如果nginx,php-fpm,mysql都在同一台机器, 推荐php-fpm和mysql都使用UNIX SOKCET. 方法看 这里

    TIME_WAIT产生原因:

    1、nginx现有的负载均衡模块实现php fastcgi负载均衡,nginx使用了短连接方式,所以会造成大量处于TIME_WAIT状态的连接。

    2、TCP/IP设计者本来是这么设计的, 主要有两个原因

    (1) 防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)

    (2) 可靠的关闭TCP连接, 在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

    为什么短连接TCP在高并发大流量会扛不住?

    一般LNMP服务器架构, 都是nginx接受http请求, 然后将php文件的解析转发给php-fpm, 这个过程nginx需要使用新的TCP端口与php-fpm的9000端口去建立TCP链接, 那么, 一个php请求就需要一个新的端口

    若2MSL时间为1分钟以上,同时,不同用户http两次请求间隔很短。那么反代的端口,5秒用1W个,10秒2W,15秒3W,20秒4W,25秒5W,30秒6W!!!而linux最大端口就是65535个, 前面已经用掉的端口还没被回收掉。那么将会有很多的用户请求被nginx接收之后,因没有端口资源而无法与php-fpm创建tcp连接… 所以服务器会’挂掉’

  • 相关阅读:
    [20190507]sga_target=0注意修改_kghdsidx_count设置.txt
    进程与线程的区别和联系
    html option选中 回显 取值
    application.properties详解 --springBoot配置文件
    Address already in use: JVM_Bind:8080错误的解决办法
    垃圾回收监视和分析
    垃圾回收器种类
    Java垃圾回收是如何工作的?
    Java垃圾回收简介
    关于堆栈的详细讲解
  • 原文地址:https://www.cnblogs.com/oxspirt/p/9529842.html
Copyright © 2011-2022 走看看