美文网首页
【tcp】一台服务器能支撑多少个TCP连接?

【tcp】一台服务器能支撑多少个TCP连接?

作者: Bogon | 来源:发表于2023-05-31 00:07 被阅读0次

    如果连接不同的服务器端的时候,即使只有一个 ip,同一个端口号也是可以用于连接不同的服务端的。 这个说法有误!

    # echo  > /dev/tcp/www.example.com/8090
    
    # ss  -tan | grep TIME-WAIT
    TIME-WAIT  0      0      172.22.54.177:58044              60.29.63.124:8090
    
    
    # curl  -sSI  --local-port   58044   https://www.baidu.com
    curl: (45) bind failed with errno 98: Address already in use
    
    

    Linux内核跟缓冲区大小有关参数

    # cat /etc/sysctl.conf | grep mem
    
    net.core.rmem_default=8388608
    net.core.rmem_max=16777216
    
    net.core.wmem_default=8388608
    net.core.wmem_max=16777216
    
    ##net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力.
    ##net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.
    ##net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket.
    net.ipv4.tcp_mem=94500000 915000000 927000000
    
    net.ipv4.tcp_rmem=4096 87380 4194304
    net.ipv4.tcp_wmem=4096 16384 4194304
    
    1. net.core.rmem_default=8388608: 这个参数设置了接收缓冲区的默认大小,单位是字节。这个值是8MB,即接收缓冲区的默认大小为8MB。

    2. net.core.rmem_max=16777216: 这个参数设置了接收缓冲区的最大值,单位是字节。这个值是16MB,即接收缓冲区的最大值为16MB。

    3. net.core.wmem_default=8388608: 这个参数设置了发送缓冲区的默认大小,单位是字节。这个值也是8MB,即发送缓冲区的默认大小为8MB。

    4. net.core.wmem_max=16777216: 这个参数设置了发送缓冲区的最大值,单位是字节。这个值也是16MB,即发送缓冲区的最大值为16MB。

    5. net.ipv4.tcp_mem=94500000 915000000 927000000: 这个参数设置了TCP套接字的内存使用情况。前面的值是TCP内存的最小值,中间的值是TCP内存的默认值,后面的值是TCP内存的最大值。这个配置表示TCP套接字使用的内存大小范围是94500000字节到927000000字节,其中默认值是915000000字节。

    6. net.ipv4.tcp_rmem=4096 87380 4194304: 这个参数设置了TCP套接字的接收缓冲区大小。前面的值是接收缓冲区的最小值,中间的值是接收缓冲区的默认值,后面的值是接收缓冲区的最大值。这个配置表示TCP套接字的接收缓冲区大小范围是4096字节到4194304字节,其中默认值是87380字节。

    7. net.ipv4.tcp_wmem=4096 16384 4194304: 这个参数设置了TCP套接字的发送缓冲区大小。前面的值是发送缓冲区的最小值,中间的值是发送缓冲区的默认值,后面的值是发送缓冲区的最大值。这个配置表示TCP套接字的发送缓冲区大小范围是4096字节到4194304字节,其中默认值是16384字节。

    net.core.rmem_default 和 net.ipv4.tcp_rmem 区别是什么?

    net.core.rmem_default和net.ipv4.tcp_rmem都是Linux内核中用于设置TCP套接字接收缓冲区大小的参数,但是它们的作用范围和含义略有不同。

    net.core.rmem_default是一个全局参数,它设置了系统中所有TCP套接字接收缓冲区的默认大小。换句话说,当一个TCP套接字被创建时,如果没有显式地设置接收缓冲区大小,那么就会使用这个全局默认值。

    而net.ipv4.tcp_rmem是一个针对IPv4协议的参数,它可以用来设置TCP套接字接收缓冲区的最小值、默认值和最大值。这三个值的含义分别是:

    • 最小值:当TCP套接字接收缓冲区的大小低于这个值时,TCP接收窗口将不再缩小。
    • 默认值:当TCP套接字被创建时,如果没有显式地设置接收缓冲区大小,那么就会使用这个默认值。
    • 最大值:TCP套接字接收缓冲区的大小不会超过这个值。

    因此,net.core.rmem_default是一个全局的默认值,而net.ipv4.tcp_rmem则可以用来设置TCP套接字接收缓冲区的三个关键大小参数。

    net.ipv4.tcp_mem 跟 net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem 关系是什么?

    net.ipv4.tcp_mem、net.ipv4.tcp_rmem和net.ipv4.tcp_wmem都是Linux内核中用于控制TCP套接字内存使用的参数,它们之间存在一定的关系。

    • net.ipv4.tcp_mem:这个参数用于设置TCP套接字内存的三个关键参数,即最小值、默认值和最大值。这三个值分别对应net.ipv4.tcp_rmem、net.ipv4.tcp_wmem和net.core.optmem_max三个参数的值。因此,可以说net.ipv4.tcp_mem是一个综合性的参数,它可以同时控制TCP套接字的接收缓冲区、发送缓冲区和其他内存使用情况。

    • net.ipv4.tcp_rmem和net.ipv4.tcp_wmem:这两个参数用于分别设置TCP套接字的接收缓冲区和发送缓冲区的三个关键参数,即最小值、默认值和最大值。它们的值分别对应TCP套接字接收缓冲区的最小值、默认值和最大值,以及TCP套接字发送缓冲区的最小值、默认值和最大值。

    因此,net.ipv4.tcp_mem、net.ipv4.tcp_rmem和net.ipv4.tcp_wmem都是用于控制TCP套接字内存使用的参数,它们之间存在一定的关系,但是作用范围和含义略有不同。

    11d402da4f9d2a297054a4943eace2ba_1200.png

    参考

    一台服务器能支撑多少个TCP连接?
    https://blog.51cto.com/lizexiong/5559589

    一台服务器最大能支持多少条TCP连接?
    https://blog.csdn.net/weixin_38889300/article/details/128796055

    Linux文件描述符
    https://www.jianshu.com/p/fc108297f335

    彻底搞明白了 TCP 的这些内存开销
    https://cloud.tencent.com/developer/article/1964464

    Linux 网络性能的 15 个优化建议
    https://cloud.tencent.com/developer/article/2186199

    如何处理 Too many open files 错误
    https://cloud.tencent.com/developer/article/1964466

    网络相关的技术问题答疑
    https://cloud.tencent.com/developer/article/2187986

    开发内功修炼
    https://cloud.tencent.com/developer/column/94759

    相关文章

      网友评论

          本文标题:【tcp】一台服务器能支撑多少个TCP连接?

          本文链接:https://www.haomeiwen.com/subject/rqpeedtx.html