在过去,我们曾困扰于解决网络编程中的C10K问题,但如今从硬件和操作系统的支持看,单台服务器支持上万并发连接已不再是一项艰巨挑战。假设单台服务器最多只能支持万级并发连接,对大多数应用来说已经足够,然而对于一些拥有庞大用户基数的互联网公司,其面临的并发连接数可能达到百万、千万,甚至腾讯的上亿(见注:QQ默认采用UDP协议)。尽管现今的集群和分布式技术能够将并发负载分担在多台服务器上,我们只需扩展数十台电脑便可解决问题,但更希望能充分发挥单台服务器资源的潜力,首先实施垂直扩展,再考虑水平扩展,这种方式有助于有效节省服务器相关的费用(硬件资源、机房、运维和电力开支也并不小)。那么到底一台服务器究竟能支持多少TCP并发连接呢?
作为视频推荐工程师必须掌握的技能之一——处理百万并发高并发TCP长连接LinuxC++后台服务器开发架构师的免费学习地址,以下是一些必要常识:
常识一: 在Linux下编写网络服务器程序的朋友们应该知道,每个TCP连接都需要占用一个文件描述符。一旦这些文件描述符用完,新的连接会返回错误消息“socket/File: Cantopensomanyfiles”。这时,你需要了解操作系统对最大打开文件数的限制。
常识二: 端口号范围受限吗?在操作系统中,端口号1024以下为系统保留,而1024至65535是供用户使用的范围。由于每个TCP连接都要占用一个端口号,所以我们最多能有60000多个并发连接。我想有很多人会有这种错误的观念吧?(我过去也曾如此认为)
让我们来分析一下。总结上述结论,这些仅仅是理论上的单机TCP并发连接数。实际上,单机并发连接数受制于硬件资源(内存)和网络资源(带宽)的限制,至少就我们的需求而言,现在已能实现数十万级的并发连接。那你的情况呢?
【文章福利】: 我整理了一些我认为不错的学习书籍和视频资料,并分享在群文件中,有需要的可以自行下载哦!点击链接加入(自取)。
虽然现在的集群,分布式技术可以为我们将并发负载分担在多台服务器上,那我们只需要扩展出数十台电脑就可以解决问题,但是我们更希望能更大的挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展,这样可以有效的节省服务器相关的开支(硬件资源、机房、运维人力、电力其实也是一笔不小的开支)。
那么到底一台服务器能够支持多少TCP并发连接呢?这就是本文要讨论的问题。
在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是
这时你需要明白操作系统对可以打开的最大文件数的限制。
1进程限制
执行 ulimit -n 输出 1024,说明对于一个进程而言最多只能打开1024个文件,所以你要采用此默认配置最多也就可以并发上千个TCP连接。临时修改:ulimit -n ,但是这种临时修改只对当前登录用户目前的使用环境有效,系统重启或用户退出后就会失效。
重启后失效的修改(不过我在CentOS 6.5下测试,重启后未发现失效),编辑 /etc/security/ 文件, 修改后内容为:
永久修改:编辑/etc/,在其后添加如下内容:
2全局限制
执行cat /proc/sys/fs/file-nr输出9344 0 ,分别为:
但在kernel 2.6版本中第二项的值总为0,这并不是一个错误,它实际上意味着已经分配的文件描述符无一浪费的都已经被使用了 。
我们可以把这个数值改大些,用 root 权限修改 /etc/ 文件:
操作系统上端口号1024以下是系统保留的,
从1024-是用户使用的。由于每个TCP连接都要占一个端口号,所以我们最多可以有多个并发连接。我想有这种错误思路朋友不在少数吧?(其中我过去就一直这么认为)
我们来分析一下吧。
如何标识一个TCP连接:
系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}。好吧,我们拿出《UNIX网络编程:卷一》第四章中对accept的讲解来看看概念性的东西,第二个参数cliaddr代表了客户端的ip地址和端口号。而我们作为服务端实际只使用了bind时这一个端口,说明端口号并不是并发量的限制。
server最大tcp连接数:
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并发连接数,实际上单机并发连接数肯定要受硬件资源(内存)、网络资源(带宽)的限制, 至少对我们的需求现在可以做到数十万级的并发 了,你的呢?
长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。 长连接,是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接。 聊天室或即时消息推送系统等,因为很多消息需要到产生时才推送给客户端,所以当没有消息产生时,就需要hold住客户端的连接,这样,当有大量的客户端时,要hold住大量的长连接。 在性能测试过程中,经常会接触到连接数相关的问题,有一个问题曾经困扰我好长时间,那就是一台服务器最多能支持多少链接数呢? 有的朋友可能会说是,因为操作系统有个端口,那么这个答案准确吗? 首先先了解下如何标识一个链接(记住下面的概念,文章后面要用到),操作系统是通过一个四元组来标识一个TCP链接:{本地ip,本地port,远程ip,远程port} 这四个要素唯一确定一个TCP链接,任意一个要素不相同,就认为是一个不同的链接。 在Linux系统中,一切皆文件,每一个TCP链接都要占用一个文件句柄,系统允许创建的链接数取决于句柄数的上限。 超过这个值再创建链接就会报这样的错误:“Cant open so many files。 通过命令ulimit -n可以查看当前系统允许打开文件数量的上限,在Linux中这个值默认是1024,也就是说默认情况下,只能创建1024个链接。 同时这个值也是可以修改的,通过修改/etc/security/文件,可以把这个值改大,一般服务器都会改的很大,比如我们的服务器上一般设置为。 那这么说是不是就意味着只要我改的很大,链接数可以无限大了? 其实也并不是这样,创建链接的时候,一般分为两个端, 即链接的发起端和链接接收端。 比如我们现在使用Jmeter进行压测,被测系统部署在Tomcat服务器10.0.0.3上,使用的是8080端口。 如果我们用5个并发来进行压测的话,创建的链接如下图所示:对于Jmeter来说,它是链接发起端,Jmeter创建了5个链接去连接服务端的8080端口,每个新建链接会占用了一个端口号,如图中的-。 在操作系统中,端口号的范围是0-,其中0-1024是预留端口号,不可使用,其他的端口都是可以使用的。 也就是说, 在链接发起端,受端口号的限制理论上最多可以创建左右链接。 那么有没有办法超过这个限制呢,答案是肯定的! 通过TCP标识的四元组可以看到,对于链接发起端,影响链接数的是本地ip和port,端口号受限于,已经没办法增加了。 那我们可以增加本地ip来达到这个目的。 一般情况下,服务器的一个网卡上只绑定了一个ip,对外通信都使用这个ip进行。 其实网卡是支持一个绑定多个IP的,当然必须确保ip是有效的且未使用的。 # ifconfig eth0:1 10.0.0.5 以上命令可以在eth0网卡上增加一个ip 10.0.0.5,服务器网卡每增加一个ip,就可以允许在这个ip上再创建左右的链接数。 曾经做过一个邮件网关的链接数测试,目的是为了测试网关服务器可以接收并且保持多少TCP长连接。 正常情况下,受限于单台机器端口号的影响,客户端想创建25万TCP长连接,至少需要4台机器。 通过对客户端网卡绑定多IP的方法,成功在一台机器上创建了25万个链接。 当然,这种手段只是一种非常规的操作,只是为了进行某种特殊场景的测试。 正常情况下不推荐网卡绑定多个IP。 对于Tomcat服务器来讲,它是链接接收端,它是不是也受限于呢? 并不是,从上面图中可以看到,Jmeter发起的所有链接都创建在Tomcat服务器的8080端口,也就是说对于链接接收端,所有的链接占用的是同一个端口。 根据TCP标识四元组可以分析出, 一个链接接收端,最大的TCP链接数=所有有效ip排列组合的数量*端口数量 ,这个计算结果应该是一个天文数字。 因此链接接收端支持的链接数理论上可以认为是无限大的。 上面介绍的一些数据都是理论上单台机器可以支持的TCP链接数, 实际情况下,每创建一个链接需要消耗一定的内存,大概是4-10kb,所以链接数也受限于机器的总内存。 链接发起端,活力全开才左右链接,内存最多才占用640M,一般客户端都能 满足,内存限制主要还是考虑服务器端。 虽然现在的集群,分布式技术可以为我们将并发负载分担在多台服务器上,那我们只需要扩展出数十台电脑就可以解决问题,但是我们更希望能更大的挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展,这样可以有效的节省服务器相关的开支(硬件资源、机房、运维人力、电力其实也是一笔不小的开支)。 首先需要考虑文件句柄的限制。 在Linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Cant open so many files”。 这时你需要明白操作系统对可以打开的最大文件数的限制。 我们可以通过ulimit -n命令、/etc/security/ 文件 以及 /etc/ 文件等来修改文件句柄数。 其次要考虑的是端口范围的限制,操作系统上端口号1024以下是系统保留的,从1024-是用户使用的。 由于每个TCP连接都要占一个端口号,所以我们最多可以有多个并发连接。 我想有这种错误思路朋友不在少数吧?面试官也比较喜欢在这里引导挖坑,类似的问题还有:一个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并发连接数,实际上单机并发连接数肯定要受硬件资源(内存)、网络资源(带宽)的限制。 单台服务器最大支持多少连接数单机服务器支持千万级并发长连接的压力测试长连接200万尝试及调优一次百万长连接压测 Nginx 内存溢出问题大并发下TCP内存消耗优化小记(86万并发业务正常服务)长连接与短连接的区别系统设置–ulimit的长连接和短连接网络连接中的长连接和短链接是什么意思?性能优化篇-使用长连接提升服务性能
感觉你似乎在问并发连接的问题,众所周知,为了防范蠕虫病毒的传播和攻击,Windows XP SP2将并发线程最多限制为10个。 SP2利用Messages动态链接库,来实时监控每个进程的并发线程数目,一旦它发现某进程的线程数超过10个,就会屏蔽掉部分线程。 通过修改,可以把并发连接调到几百以上甚至更大,这个数字理论上是没有上限的。 而作为服务器,从操作系统级,也会对并发连接数有个限制,因为每个连接要耗CPU和内存的,否则也会瘫痪。 而不同的系统,不同的服务器,可以支持的数量当然不同了,所以你这个问题没有实际意义,也没有准确答案。 我实际测试,一台DELL四路四核,32G内存的服务器,并发500左右完全没有问题,再大也没有条件测试,而如果一台普通的低端服务器,不可能达到同一数量级对吧?
标签: 服务器、 网络服务器、 C、 C、本文地址: https://yihaiquanyi.com/article/eab35892d5983801e949.html
上一篇:探寻苏州的优秀服务器公司名单探寻苏州的优...