【tcp】单台服务器并发tcp连接数到底可以有多少?

author author     2023-04-18     780

关键词:

参考技术A 长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。

长连接,是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。

聊天室或即时消息推送系统等,因为很多消息需要到产生时才推送给客户端,所以当没有消息产生时,就需要hold住客户端的连接,这样,当有大量的客户端时,要hold住大量的长连接。

在性能测试过程中,经常会接触到连接数相关的问题,有一个问题曾经困扰我好长时间,那就是一台服务器最多能支持多少链接数呢?

有的朋友可能会说是65535,因为操作系统有65535个端口,那么这个答案准确吗?

首先先了解下如何标识一个链接(记住下面的概念,文章后面要用到),操作系统是通过一个四元组来标识一个TCP链接:

本地ip,本地port,远程ip,远程port

这四个要素唯一确定一个TCP链接,任意一个要素不相同,就认为是一个不同的链接。

在Linux系统中,一切皆文件,每一个TCP链接都要占用一个文件句柄,系统允许创建的链接数取决于句柄数的上限。超过这个值再创建链接就会报这样的错误:“Can't open so many files"。

通过命令ulimit -n可以查看当前系统允许打开文件数量的上限,在Linux中这个值默认是1024,也就是说默认情况下,只能创建1024个链接。同时这个值也是可以修改的,通过修改/etc/security/limits.conf文件,可以把这个值改大,一般服务器都会改的很大,比如我们的服务器上一般设置为1000000。

那这么说是不是就意味着只要我改的很大,链接数可以无限大了?

其实也并不是这样,创建链接的时候,一般分为两个端, 即链接的发起端和链接接收端。

比如我们现在使用Jmeter进行压测,被测系统部署在Tomcat服务器10.0.0.3上,使用的是8080端口。

如果我们用5个并发来进行压测的话,创建的链接如下图所示:

对于Jmeter来说,它是链接发起端,Jmeter创建了5个链接去连接服务端的8080端口,每个新建链接会占用了一个端口号,如图中的10001-10005。在操作系统中,端口号的范围是0-65535,其中0-1024是预留端口号,不可使用,其他的端口都是可以使用的。也就是说, 在链接发起端,受端口号的限制理论上最多可以创建64000左右链接。

那么有没有办法超过这个限制呢,答案是肯定的!

通过TCP标识的四元组可以看到,对于链接发起端,影响链接数的是本地ip和port,端口号受限于65535,已经没办法增加了。那我们可以增加本地ip来达到这个目的。一般情况下,服务器的一个网卡上只绑定了一个ip,对外通信都使用这个ip进行。其实网卡是支持一个绑定多个IP的,当然必须确保ip是有效的且未使用的。

# ifconfig eth0:1 10.0.0.5

以上命令可以在eth0网卡上增加一个ip 10.0.0.5,服务器网卡每增加一个ip,就可以允许在这个ip上再创建65535左右的链接数。

曾经做过一个邮件网关的链接数测试,目的是为了测试网关服务器可以接收并且保持多少TCP长连接。正常情况下,受限于单台机器65535端口号的影响,客户端想创建25万TCP长连接,至少需要4台机器。通过对客户端网卡绑定多IP的方法,成功在一台机器上创建了25万个链接。

当然,这种手段只是一种非常规的操作,只是为了进行某种特殊场景的测试。正常情况下不推荐网卡绑定多个IP。

对于Tomcat服务器来讲,它是链接接收端,它是不是也受限于65535呢?

并不是,从上面图中可以看到,Jmeter发起的所有链接都创建在Tomcat服务器的8080端口,也就是说对于链接接收端,所有的链接占用的是同一个端口。

根据TCP标识四元组可以分析出, 一个链接接收端,最大的TCP链接数=所有有效ip排列组合的数量*端口数量64000 ,这个计算结果应该是一个天文数字。 因此链接接收端支持的链接数理论上可以认为是无限大的。

上面介绍的一些数据都是理论上单台机器可以支持的TCP链接数, 实际情况下,每创建一个链接需要消耗一定的内存,大概是4-10kb,所以链接数也受限于机器的总内存。

链接发起端,活力全开才64000左右链接,内存最多才占用640M,一般客户端都能 满足,内存限制主要还是考虑服务器端。

虽然现在的集群,分布式技术可以为我们将并发负载分担在多台服务器上,那我们只需要扩展出数十台电脑就可以解决问题,但是我们更希望能更大的挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展,这样可以有效的节省服务器相关的开支(硬件资源、机房、运维人力、电力其实也是一笔不小的开支)。

首先需要考虑文件句柄的限制。在Linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can't open so many files”。这时你需要明白操作系统对可以打开的最大文件数的限制。

我们可以通过ulimit -n命令、/etc/security/limits.conf 文件 以及 /etc/sysctl.conf 文件等来修改文件句柄数。

其次要考虑的是端口范围的限制,操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。

由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接。我想有这种错误思路朋友不在少数吧?

面试官也比较喜欢在这里引导挖坑,类似的问题还有:一个UDP连接可以复用已经被TCP连接占用的端口嘛?

如何标识一个TCP连接?

系统使用一个4四元组来唯一标识一个TCP连接:

本地端口号 local port、本地IP地址 local ip、远端端口号 remote port、远端IP地址 remote ip。

server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。

上面给出的结论都是理论上的单机TCP并发连接数,实际上单机并发连接数肯定要受硬件资源(内存)、网络资源(带宽)的限制。

单台服务器最大支持多少连接数

https://blog.csdn.net/alpha_love/article/details/108351457

单机服务器支持千万级并发长连接的压力测试

https://blog.csdn.net/lijinqi1987/article/details/74545851

https://blog.csdn.net/wangshuminjava/article/details/80619190

HTTP长连接200万尝试及调优

https://www.cnblogs.com/zlingh/p/4814836.html

一次百万长连接压测 Nginx 内存溢出问题

https://blog.csdn.net/yangbaggio/article/details/107007627

大并发下TCP内存消耗优化小记(86万并发业务正常服务)

https://blog.51cto.com/benpaozhe/1752675

TCP长连接与短连接的区别

https://www.cnblogs.com/liuyong/archive/2011/07/01/2095487.html

Linux系统设置–ulimit

https://blog.haohtml.com/archives/9883

HTTP的长连接和短连接

https://www.cnblogs.com/cswuyg/p/3653263.html

网络连接中的长连接和短链接是什么意思?

https://www.zhihu.com/question/22677800

性能优化篇-使用长连接提升服务性能

https://zhuanlan.zhihu.com/p/118946284

22并发tcp连接数与文件描述符

...log.csdn.net/wangshuminjava/article/details/80988517 【Linux】单台服务器上并发TCP连接数https://blog.csdn.net/tsh123321/article/details/88990825 TCP连接数和文件描述符耗尽分析 1 每一个TCP连接都要占用一个文件描述符,一旦文件描述符使... 查看详情

一台服务器​最大并发tcp连接数多少?65535?

Hollis的新书限时折扣中,一本深入讲解Java基础的干货笔记!首先,问题中描述的65535个连接指的是客户端连接数的限制。在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三次握手后建... 查看详情

单台服务器最大tcp连接

如果对服务器进行压力测试,常常出现这种情况tcp连接数过多netstat  -an  windows查看tcp连接数 那么怎么增加单台服务器的最大连接数呢?    最简单的办法,增加内存,socket连接大概10多kb一个详情... 查看详情

修改tcp/ip并发连接数

...修改修改TCP/IP并发连接数?1、可使用以下命令,查看当前服务器启动的httpd进程数,亦即当前服务器提供httpd服务的并发请求数。2、获取服务器实时的httpd服务并发请求数,可以与配置文件/etc/httpd/conf/httpd.conf中的MaxRequestWorkers数... 查看详情

查看linux中的tcp连接数

...统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整。4341netstat-an会打印系统当前网络链接状态,而grep-i"80"是用来提取与80端口有关的连接的,w... 查看详情

服务器最大tcp连接数及调优汇总(代码片段)

启动线程数:启动线程数=【任务执行时间/(任务执行时间-IO等待时间)】*CPU内核数最佳启动线程数和CPU内核数量成正比,和IO阻塞时间成反比。如果任务都是CPU计算型任务,那么线程数最多不超过CPU内核数,因为启动再多线程... 查看详情

如何查询tcp/ip并发连接数

RT..查看Tcp/ip并发连接数通过命令netstat可以查看本机的网络连接情况开始-运行--cmd输入netstat-nao|more 每一列分别表示:TCP/IP协议类型,本机连接的端口,外网IP和端口,端口状态,进程号----3.如果要可视化界面查看,可以使用第... 查看详情

求java网络高手,tcp最大连接问题

System32下有个TCPIP.sys文件,是管理TCP最大连接数的系统配置文件,网上也有工具可以进行修改这个最大连接数。我的疑问是,这个最大连接数到底是限制了谁的数目?通过软件查看这个最大连接数,我的系统默认是10.进入到cmd下... 查看详情

tcp的连接数量

...连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少?如何标识一个TCP连接在确定最大连接数之前,先来看看系统如何标识一个tcp连接。系统用一个4四元组来唯一标识一个TCP连接:{localip,localport,remoteip,r... 查看详情

[转帖]windows下单机最大tcp连接数(代码片段)

...限制到TCP连接的最大连接数。最大动态端口数TCP客户端和服务器连接时,客户端必须分配一个动态端口,默认情况下这个动态端口的分配范围为1024-5000,也就是说默认情况下,客户端最多可以同时发起3977个Socket连接。我们可以... 查看详情

计算出有多少客户端可以连接到我正在使用的一些 tcp 服务器代码

】计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码【英文标题】:WorkingouthowmanyclientscanconnecttosometcpservercodeIamusing【发布时间】:2018-10-1108:51:01【问题描述】:更新似乎tcp服务器最多可以处理512个文件描述符。由... 查看详情

linux下解决高并发socket最大连接数限制,tcp默认1024个连接(代码片段)

 linux作为服务器系统,当socket运行高并发TCP程序时,通常会出现连接建立到一定个数后不能再建立连接的情况  本人在工作时,测试高并发tcp程序(GPS服务器端程序),多次测试,发现每次连接建立到1000左右时,再也不能建... 查看详情

怎样修改windows服务器中最大的tcp连接数?

...的线程数超过10个,就会屏蔽掉部分线程。2、TCP客户端和服务器连接时,客户端必须分配一个动态端口,默认情况下这个动态端口的分配范围为1024-5000,也就是说默认情况下,客户端最多可以同时发起3977个Socket连接。 查看详情

一个tcp连接可以发送多少个http请求?

一、现代浏览器与服务器建立了一个TCP连接后是否会在一个HTTP请求完成后断开?什么情况下会断开?默认情况下建立TCP连接不会端口,只有再请求报头中声明Connection:close才会再请求完成后关闭连接 二、一个TCP连接可以对应... 查看详情

linux配置支持高并发tcp连接(socket最大连接数)

Linux配置支持高并发TCP连接(socket最大连接数)Linux配置支持高并发TCP连接(socket最大连接数)及优化内核参数  2011-08-0915:20:58|  分类:LNMP&&LAMP|  标签:内核调优  文件系统调优  高并发调优&n... 查看详情

linux系统支持的最大tcp连接是多少?

1.首先,客户端和服务器建立的每个TCP连接都会占用服务器内存,所以最大TCP连接数和内存成正比。简单估算为最大内存除以单TCP连接占用的最小内存2.Linux操作系统中,一切都是文件。所以每个TCP连接,都会打开一个文件。为此... 查看详情

怎么查看tomcat或apache的当前的并发数和连接数

...-r][interval]  参数  -a  显示所有连接和侦听端口。服务器连接通常不显示。  -e  显示以太网统计。该参数可以与-s选项结合使用。  -n  以数字格式显示地址和端口号(而不是尝试查找名称)。  -s  显示每... 查看详情

markdownlinux下查看http并发和tcp连接数(代码片段)

查看详情