TCP连接个数受端口号、文件描述符、线程资源、内存资源、CPU资源的限制。
端口号:
系统用一个四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}
在local ip, local port固定、不考虑ip地址分类的情况下,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。
实际可用端口范围可以如下查看:
[root]# cat /proc/sys/net/ipv4/ip_local_port_range
1024 65000
文件描述符:
每建立一个TCP连接,操作系统分配一个文件描述符,linux 对可打开的文件描述符的数量分别作了三个方面的限制:
系统级:当前系统可打开的最大数量,通过 cat /proc/sys/fs/file-max
查看
用户级:指定用户可打开的最大数量,通过 cat /etc/security/limits.conf
查看
进程级:单个进程可打开的最大数量,通过 cat /proc/sys/fs/nr_open
查看
file-max
表示系统级别的能够打开的文件句柄的数量。是对整个系统的限制,并不是针对用户的。
ulimit -n
控制进程级别能够打开的文件句柄的数量。提供对shell及其启动的进程的可用文件句柄的控制。这是进程级别的。
对于服务器来说,file-max
和ulimit
都需要设置,否则会出现文件描述符耗尽的问题。
线程资源:
按照每个连接,启动一个线程的方式,TCP连接个数受线程个数限制,可以用IO复用方式,一个线程管理多个TCP连接。
内存资源:
每个TCP连接本身,以及这个连接所用到的缓冲区,都是需要占用一定内存。
CPU资源:
这个很好理解。
网友评论