TCP最大连接数

tcp概述

服务器如何标识tcp连接

在 TCP 应用中,server 事先在某个固定端口监听,client 主动发起连接,经过三路握手后建立 TCP 连接。在确定最大连接数之前,先来看看系统如何标识一个 TCP 连接。

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

Client最大TCP连接数

Client 每次发起 TCP 连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他 TCP 连接共享。

TCP 端口的数据类型是 unsigned short,因此本地端口个数最大只有 65536,端口 0 有特殊含义,不能使用,这样可用端口最多只有 65535,所以在全部作为 client 端的情况下,最大 TCP 连接数为 65535,这些连接可以连到不同的 server ip。

Server最大TCP连接数

server 通常固定在某个本地端口上监听,等待 client 的连接请求。不考虑地址重用(unix 的 SO_REUSEADDR 选项)的情况下,即使 server 端有多个 ip,本地监听端口也是独占的,因此 server 端 TCP 连接四元组中只有 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 的连接数量。

文件限制

用户级别

  1. 查看 Linux 系统用户最大打开的文件限制:

    #ulimit -n 65535
  2. 修改打开文件限制

    vim /etc/security/limits.conf root soft nofile 102400 root hard nofile 102400

    其中 root 指定了要修改哪个用户的打开文件数限制。

    可用 ‘*’ 号表示修改所有用户的限制;soft 或 hard 指定要修改软限制还是硬限制;

    102400 则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。

  3. 修改/etc/pam.d/login

    session required /lib/security/pam_limits.so 这是告诉 Linux 在用户完成系统登录后,应该调用 pam_limits.so 模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制)。

    而 pam_limits.so 模块就会从 /etc/security/limits.conf 文件中读取配置来设置这些限制值。

Linux系统级别

查看 Linux 系统对同时打开文件数的硬限制:

# sysctl -a|grep file-max fs.file-max = 65535

这表明这台 Linux 系统最多允许同时打开(即包含所有用户打开文件数总和) 65535 个文件,是 Linux 系统级硬限制,所有用户级的打开文件数限制都不会超过这个数值。

通常这个系统级硬限制是 Linux 系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制。

修改 file-max 限制:

vim /etc/sysctl.conf fs.file-max = 1000000

立即生效:

# sysctl -p

网络端口限制修改

查看 Linux 系统最大追踪 TCP 连接数量:

# sysctl -a | grep ipv4.ip_conntrack_max net.ipv4.ip_conntrack_max = 20000

这表明系统将对最大跟踪的 TCP 连接数限制默认为 20000。

查看 Linux 系统端口范围:

# sysctl -a | grep ipv4.ip_local_port_range net.ipv4.ip_local_port_range = 1024 30000

注意:每个 TCP 客户端连接都要占用一个唯一的本地端口号(此端口号在系统的本地端口号范围限制中),如果现有的 TCP 客户端连接已将所有的本地端口号占满。将不能创建新的 TCP 连接。

vi /etc/sysctl.conf net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.ip_conntrack_max = 20000

如果按上述端口范围进行设置,则理论上单独一个进程最多可以同时建立 60000 多个 TCP 客户端连接。如果按上述参数进行设置,则理论上单独一个进程最多可以同时建立 20000 多个 TCP 客户端连接。

Linux下TCP最大连接数限制修改

  1. 修改

    打开文件 /etc/sysctl.conf,增加以下设置

    #该参数设置系统的TIME_WAIT的数量,如果超过默认值则会被立即清除 net.ipv4.tcp_max_tw_buckets = 20000 #定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数 net.core.somaxconn = 65535 #对于还未获得对方确认的连接请求,可保存在队列中的最大数目 net.ipv4.tcp_max_syn_backlog = 262144 #在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目 net.core.netdev_max_backlog = 30000 #能够更快地回收TIME-WAIT套接字。此选项会导致处于NAT网络的客户端超时,建议为0 net.ipv4.tcp_tw_recycle = 0 #系统所有进程一共可以打开的文件数量 fs.file-max = 6815744 #防火墙跟踪表的大小。注意:如果防火墙没开则会提示error: "net.netfilter.nf_conntrack_max" is an unknown key,忽略即可 net.netfilter.nf_conntrack_max = 2621440

    运行 sysctl -p 即可生效。

  2. 修改打开文件限制

  3. ulimit

ulimit -HSn 102400
这只是在当前终端有效,退出之后,open files 又变为默认值。
  1. 将 ulimit -HSn 102400 写到 /etc/profile 中,这样每次登录终端时,都会自动执行 /etc/profile。

  2. 令修改 open files 的数值永久生效,则必须修改配置文件:/etc/security/limits.conf. 在这个文件后加上:

    * soft nofile 1024000 * hard nofile 1024000 root soft nofile 1024000 root hard nofile 1024000

    这种方法需要重启机器才能生效。