单个服务器上可以有多少个并发TCP连接?问题,但我们希望挖掘出更多的单台服务器资源,先尝试纵向扩展,再横向扩展,这样可以有效节省服务器相关费用(硬件资源、机房、运维、电费其实是一个一笔钱。不小的开支)。那么一台服务器最多可以支持多少个并发TCP连接呢?文件句柄限制在linux下写web服务器程序的朋友一定知道,每个tcp连接占用一个文件描述符。一旦文件描述符用完,新连接到达时返回给我们的错误是“Socket/File:Can'topensomanyfiles”。这时候你需要明白,操作系统限制了最多可以打开的文件数。进程限制执行ulimit-n,输出为1024,说明一个进程最多只能打开1024个文件,所以最多可以使用这个默认配置。数千个并发TCP连接。临时修改:ulimit-n1000000,但该临时修改仅对当前登录用户当前使用环境有效,系统重启或用户注销后失效。重启后失败的修改(但我在CentOS6.5下测试,重启后没有发现失败):编辑/etc/security/limits.conf文件,修改内容为*softnofile1000000*hardnofile1000000永久修改:edit/etc/rc.local,在其后面添加如下内容ulimit-SHn1000000全局限制执行cat/proc/sys/fs/file-nr输出93440592026,分别为:1.已经分配的文件句柄数,2.Allocated但未使用的文件句柄数,3.最大文件句柄数。但是在2.6版本的内核中,第二项的值一直是0,这不是bug,实际上是分配的文件描述符都没有被使用。我们可以把这个值改大一点,用root权限修改/etc/sysctl.conf文件:fs.file-max=1000000net.ipv4.ip_conntrack_max=1000000net.ipv4.netfilter.ip_conntrack_max=1000000端口号范围限制?操作系统1024以下端口号为系统保留,1024~65535为用户使用。由于每个TCP连接占用一个端口号,我们最多可以有60,000个并发连接。我想有这种错误思想的朋友不在少数吧?(以前一直这么认为)下面分析一下如何识别一个TCP连接:系统用一个4元组来唯一标识一个TCP连接:{localip,localport,remoteip,remoteport}。好吧,我们把《UNIX网络编程:卷一》第四章accept的解释拿出来,看看概念上的东西。第二个参数cliaddr代表客户端的ip地址和端口号。作为服务器,我们其实只用到bind的端口,也就是说65535这个端口号并不是并发的限制。服务器最大tcp连接数:服务器通常监听本地某个端口,等待客户端的连接请求。不考虑地址复用(Unix的SO_REUSEADDR选项),即使服务器端有多个IP,本地监听端口是独占的,所以服务器端只有远程ip(即客户端ip)和远程端口-sidetcpconnection4元组(clientport)是可变的,所以最大tcp连接数是clientip数×clientports数。对于IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip个数)×2的16次方(端口数),即最大tcp连接数服务器端的连接数约为2的48次方。综上所述,上面给出的结论是单机TCP并发连接数的理论值。事实上,单机的并发连接数必然受到硬件资源(内存)和网络资源(带宽)的限制。10万级并发,你的呢?
