当前位置: 首页 > 科技观察

一台Linux服务器最多支持多少个TCP连接?_0

时间:2023-03-14 00:15:17 科技观察

图片来自Pexels让很多人困惑的并发问题很多同学看到这个问题第一反应是65535,原因是:“听说最多有65535个端口号,所以最大长连接数是65535”。是这样吗?有人说:“应该是受限于TCP连接中四元组的空间大小,200万亿以上!”如果你对这个问题理解不够透彻,那我今天就来说说。让我告诉你一个故事!聊一聊并发服务器端TCP连接四元组是源IP地址、源端口、目的IP地址和目的端口。如果有任何元素发生变化,则代表完全不同的连接。以我的Nginx为例,它的端口固定为80。另外我的IP也是固定的,所以目的IP地址和目的端口也是固定的。其余的源IP地址和源端口是可变的。所以理论上我的Nginx最多可以建立2的32次方(ip数)×2的16次方(端口号)的连接数。这是一个超过两百万亿的大数字!进程每打开一个文件(Linux下一切都是文件,包括Socket),都会消耗一定的内存资源。如果有恶意的人启动一个进程来无限期地创建和打开新文件,它会使服务器崩溃。因此,为了安全起见,Linux系统在多个地方限制了可以打开的文件描述符的数量,包括系统级、用户级和进程级。这三个限制的含义和修改方法如下:系统级别:当前系统最多可以打开的个数,可以通过fs.file-max参数修改。用户级别:指定用户可以开启的最大数量,修改/etc/security/limits.conf。进程级别:单个进程最多可以打开的个数,可以通过fs.nr_open参数修改。我的接收缓冲区的大小是可以配置的,可以通过sysctl命令查看:$sysctl-a|greprmemnet.ipv4.tcp_rmem=4096873808388608net.core.rmem_default=212992net.core.rmem_max=8388608这是tcp_rmem中第一个的值是分配给您的TCP连接的最小字节数。默认值为4K,最大值可达8MB。也就是说,当你有数据要发送的时候,我至少需要为对应的Socket分配4K的内存,甚至可能更大。TCP发送缓冲区的大小受参数net.ipv4.tcp_wmem的配置影响:$sysctl-a|grepwmemnet.ipv4.tcp_wmem=4096655368388608net.core.wmem_default=212992net.core.wmem_max=8388608在net.ipv4中。tcp_wmem一个值是发送缓冲区的最小大小,默认也是4K。当然,如果数据很大,实际分配的缓冲区会比默认值大。你准备在服务器端达到一百万个连接吗?还记得linux对文件对象的最大数量有限制,所以为了完成这个实验,必须在用户级、系统级、进程级提高上限。我们实验的目的是100W,这里设置为110W,这个很重要!因为做实验的时候要保证其他基本命令如ps、vi等可用。活跃连接数确实达到了100W:$ss-n|grepESTAB|wc-l1000024当前机器总内存3.9GB,其中内核Slab占用高达3.2GB。MemFree和Buffers加起来只剩100MB了:$cat/proc/meminfoMemTotal:3922956kBMemFree:96652kBMemAvailable:6448kBBuffers:44396kB...Slab:3241244KBkB可以通过slabtop命令查看dense,flip,sock_inode_cache,TCP四个kernel中的每一个对象有100万个:结语互联网后端的业务特点之一就是高并发,但是一台服务器最多能支持多少个TCP连接,这似乎让很多同学感到困惑。希望今天过后,你能把这个问题踩在脚下揉搓!作者:张燕飞编辑:陶佳龙来源:转载自公众号内功修炼(ID:kfngxl)