zoukankan      html  css  js  c++  java
  • [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性能测试命令)

  • 相关阅读:
    【转】 cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
    HDU How many prime numbers
    《大学ACM的总结 》(转载)
    POJ 最小公倍数
    HDU 开门人和关门人
    HDU shǎ崽 OrOrOrOrz
    HDU Saving HDU 2111
    HDU 1106 排序
    strtok函数()
    HDU 2187汶川地震
  • 原文地址:https://www.cnblogs.com/timlinux/p/9319762.html
Copyright © 2011-2022 走看看