目的
- 一台Linux服务器可并发支撑的TCP连接数和什么有关;
- 支撑高并发TCP连接数要如何配置;
TCP连接构成限制
TCP连接四元组是 源IP地址、源端口、目的IP地址 和 目的端口。任意一个元素发生了改变,那么就代表的是一条完全不同的连接了。
拿Nginx举例,它的端口是固定使用80,Nginx所属主机IP也是固定的,这样目的IP地址、目的端口都是固定的,剩下源IP地址、源端口是可变的。所以理论上Nginx上最多可以建立 2^32 (ip数) * 2^16 (port数) 个连接,差不多两百多万亿个连接。
系统资源限制
系统文件描述符限制
建立并维持一个TCP连接需要消耗系统资源。
Linux中一切皆文件(包括socket),每建立一个TCP连接,都会创建一个文件。Linux系统出于安全考虑,在多个位置都限制了可打开的文件描述符的数量,包括系统级、用户级、进程级。
- 系统级:当前系统可打开的最大数量,通过fs.file-max参数可修改
- 用户级:指定用户可打开的最大数量,修改/etc/security/limits.conf
- 进程级:单个进程可打开的最大数量,通过fs.nr_open参数可修改
系统内存限制
-
Linux需要把文件描述符维护,socket相关信息维护在内存中,一个空TCP连接(只维持,不接收发送数据)需要约3.3KB内存,算下来维持100w个空TCP连接需要内存不到4G;
-
TCP接收数据,需要在内存中在开辟接收缓存区,接收缓存区配置:
$ sysctl -a | grep rmem net.ipv4.tcp_rmem = 4096 87380 8388608 #每个TCP接收缓存区内存,最小4K,默认85.3K,最大8M net.core.rmem_default = 212992 #每个TCP接收缓存区默认内存208K,覆盖tcp_rmem第二个值 net.core.rmem_max = 8388608 #每个TCP接收缓存区最大内存8M,覆盖tcp_rmem第三个值
-
TCP发送数据,需要在内存中在开辟发送缓存区,发送缓存区配置:
$ sysctl -a | grep wmem net.ipv4.tcp_wmem = 4096 65536 8388608 #每个TCP发送缓存区内存,最小4K,默认64K,最大8M net.core.wmem_default = 212992 #每个TCP发送缓存区默认内存208K,覆盖tcp_wmem第二个值 net.core.wmem_max = 8388608 #每个TCP发送缓存区最大内存8M,覆盖tcp_wmem第三个值
-
TCP接收、发送数据、业务逻辑处理等还会消耗内存资源。
CPU限制
TCP接收、发送数据、业务逻辑处理等还会消耗CPU资源。
参考: