• [TimLinux] TCP全连接队列满


    0. TCP三次握手

    该图来自:TCP SOCKET中backlog参数的用途是什么?

     

    syns queue: 半连接队列

    accept queue: 全连接队列

    控制参数存放在文件:/proc/sys/net/ipv4/tcp_abort_on_overflow中,0:表示如果三次握手第三步的时候全连接队列满了,那么server扔掉client发过来的ack(在server端因为全连接队列满了,认为连接还没有建立起来),1:表示第三步的时候如果全连接队列满了,server发送一个reset包给client,表示废掉这个握手过程和这个连接(client端会抛出异常:connection reset by peer的错误)

    如果全连接队列满了并且tcp_abort_on_overflow=0的话,server过一段时间再次发送syn+ack给client(也就是重试),重试的次数在net.ipv4.tcp_synack_retries参数中配置:sysctl -a 可以查看当前的配置。

    1. 查看全连接队列

    $ netstat -s | egrep 'listen|LISTEN'

    667399 times the listen queue of a socket overflowed ==> 全连接队列满了 66739 次

    $ ss -lnt   ==> 50: 表示监听的端口上全连接队列最大为50,第一列Recv-Q表示当前使用了多少

    State      Recv-Q      Send-Q     local Address:Port          Peer Address:Port

    LISTEN   0                50             :3306                             *:*

    全连接队列的最大值 = min(backlog, somaxconn)

    backlog: 是在socket创建的时候传入的,somaxconn:是一个os级别的系统参数(cat /proc/sys/net/core/somaxconn)

    2. 查看半连接队列

    半连接队列的大小取决于:max(64, /proc/sys/net/ivp4/tcp_max_syn_backlog),不同的OS会有差异

    $ netstat -tn 

    Active  Internet connections (w/o servers)

    Proto  Recv-Q  Send-Q  Local Address  Foreign Address State

    tcp0  0       server:8182 client-1:15260  SYNC_RECV

    tcp0  28    server:22        client-1:51708  ESTABLISHED

    tcp0  0     server:2376  client-1:60269  ESTABLISHED

    这个命令显示的Recv-Q、Send-Q与全连接、半连接没有关系!

    $ ab -n 10000 -c 300 http://172.16.218.128/3.php (ab: apache benchmark性能测试命令)

  • 相关阅读:
    [Groovy] List里的Inject方法
    [Groovy]你意想不到的用法
    buildr学习笔记(1): buildr的安装
    [Groovy]如何在Groovy里得到命令行的返回值
    underscore.js
    [Groovy] *符号在Groovy里的一种特殊用法
    [Groovy]如何定义和使用一个Java里的Enum类型
    [Ruby]$: 是什么意思?
    Optional Parameter/Default Values
    如何在Rake 的Task里加入多个输入参数
  • 原文地址:https://www.cnblogs.com/timlinux/p/9319762.html
Copyright © 2020-2023  润新知