【tcp】一台服务器能支撑多少个TCP连接?
如果连接不同的服务器端的时候,即使只有一个 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
-
net.core.rmem_default=8388608: 这个参数设置了接收缓冲区的默认大小,单位是字节。这个值是8MB,即接收缓冲区的默认大小为8MB。
-
net.core.rmem_max=16777216: 这个参数设置了接收缓冲区的最大值,单位是字节。这个值是16MB,即接收缓冲区的最大值为16MB。
-
net.core.wmem_default=8388608: 这个参数设置了发送缓冲区的默认大小,单位是字节。这个值也是8MB,即发送缓冲区的默认大小为8MB。
-
net.core.wmem_max=16777216: 这个参数设置了发送缓冲区的最大值,单位是字节。这个值也是16MB,即发送缓冲区的最大值为16MB。
-
net.ipv4.tcp_mem=94500000 915000000 927000000: 这个参数设置了TCP套接字的内存使用情况。前面的值是TCP内存的最小值,中间的值是TCP内存的默认值,后面的值是TCP内存的最大值。这个配置表示TCP套接字使用的内存大小范围是94500000字节到927000000字节,其中默认值是915000000字节。
-
net.ipv4.tcp_rmem=4096 87380 4194304: 这个参数设置了TCP套接字的接收缓冲区大小。前面的值是接收缓冲区的最小值,中间的值是接收缓冲区的默认值,后面的值是接收缓冲区的最大值。这个配置表示TCP套接字的接收缓冲区大小范围是4096字节到4194304字节,其中默认值是87380字节。
-
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