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

2023-05-31  本文已影响0人  Bogon

如果连接不同的服务器端的时候,即使只有一个 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套接字接收缓冲区的最小值、默认值和最大值。这三个值的含义分别是:

因此,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、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

上一篇下一篇

猜你喜欢

热点阅读