一台Linux服务器可并发支撑多少TCP连接

文章目录

  • 目的
  • TCP连接构成限制
  • 系统资源限制
    • 系统文件描述符限制
    • 系统内存限制
    • CPU限制

目的

  1. 一台Linux服务器可并发支撑的TCP连接数和什么有关;
  2. 支撑高并发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参数可修改

系统内存限制

  1. Linux需要把文件描述符维护,socket相关信息维护在内存中,一个空TCP连接(只维持,不接收发送数据)需要约3.3KB内存,算下来维持100w个空TCP连接需要内存不到4G;

  2. 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第三个值
    
  3. 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第三个值
    
  4. TCP接收、发送数据、业务逻辑处理等还会消耗内存资源。

CPU限制

TCP接收、发送数据、业务逻辑处理等还会消耗CPU资源。


参考:

漫画 | 一台Linux服务器最多能支撑多少个TCP连接?

你可能感兴趣的:(linux,服务器,tcp/ip)