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

前言

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

那么到底一台服务器能够支持多少TCP并发连接呢?

内容

1. 文件句柄限制

在Linux服务器下每一个TCP连接都需要占用一个文件描述符(fd)。当fd用完了,新的连接到来会返回错误 —— “Socket/File:Can't open so many files”

进程限制

执行 ulimit -n 可以输出当前用户可以打开的最大文件数,如 65535 ,这表示该用户的程序最多支持的并发数

  • 临时修改 —— ulimit -n  修改后的句柄数。系统重启或用户退出后就会失效
  • 永久修改 —— 编辑 /etc/rc.local,在最后一行添加  ulimit -SHn 修改后的句柄数

全局限制

执行  cat /proc/sys/fs/file-nr 输出  2368   0   183943,分别表示

  • 已经分配的文件句柄数
  • 已经分配但没有使用的文件句柄数
  • 最大文件句柄数

我们可以把这个数值改大些,以root权限修改 /etc/sysctl.conf

  • fs.file-max = 1000000
  • net.ipv4.ip_conntrack_max = 1000000
  • net.ipv4.netfilter.ip_conntrack_max = 1000000

2. 端口号范围限制

操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接

相信有上述错误想法的朋友并不少把(本人之前也是这么认为的)

如何标识一个TCP连接

系统用一个四元组来唯一标识一个TCP连接:{ local ip,  local port, remote ip, remote port }

server最大TCP连接数

server通常固定在某个本地端口上监听,等待client的连接请求。于是,我们假定local port 是固定的,并且local ip也是固定的

那么最大连接数等于客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方

由于这里只用到了一个端口,因此,最后还要乘以可用的端口数目

小结

上面所述都是理论状态,实际上单机并发连接数肯定要受到硬件资源(内存)、网络资源(带宽)的限制

参考

ulimit 用法介绍

TCP和UDP端口能够复用吗?

评论或私信站长


  1. #该文章暂时没有评论