• 高性能网络编程 - 关于单台服务器并发TCP连接数理论值的讨论


    在这里插入图片描述


    概述

    单台服务器可以支持的并发TCP连接数取决于多个因素,包括硬件性能、操作系统限制、网络带宽和应用程序设计。以下是一些影响并发TCP连接数的因素:

    1. 服务器硬件性能:服务器的CPU、内存和网络适配器性能会直接影响其能够处理的并发连接数。更强大的硬件通常可以支持更多的连接。

    2. 操作系统限制:操作系统有最大文件描述符限制,这将限制服务器可以打开的TCP连接数。您可以通过调整操作系统的文件描述符限制来增加最大连接数。

    3. 网络带宽:服务器的网络带宽也是一个限制因素。如果服务器的带宽受限,它可能无法支持大量的并发连接,因为数据传输可能成为瓶颈。

    4. 应用程序设计:应用程序的设计和性能优化对并发连接数有很大影响。如果应用程序能够高效地处理连接,那么它可以支持更多的并发连接。使用异步编程模型、连接池和负载均衡等技术可以提高性能。

    5. TCP/IP堆栈优化:服务器的TCP/IP堆栈配置也可以影响并发连接数。调整TCP连接超时、缓冲区大小和其他参数可以改善性能。

    6. 负载均衡:通过使用负载均衡技术,可以将请求分发到多个服务器,从而提高整体并发连接数。

    7. 用户需求和应用场景:最终,支持的并发连接数将取决于您的应用程序和用户需求。某些应用可能需要处理大量的短期连接,而其他应用可能需要支持较少但更长时间的连接。

    总之,没有一个固定的数字可以适用于所有情况,因为每个服务器和应用程序都是独特的。在设计和配置服务器时,需要考虑上述因素,并进行性能测试以确定服务器可以支持的最大并发连接数。


    操作系统的限制因素

    文件句柄限制

    在Linux下编写网络服务器程序时,每个TCP连接需要占用一个文件描述符。当文件描述符用尽时,新连接会返回错误消息"Socket/File: Can’t open so many files"。

    这里就是操作系统对能够打开的最大文件数的限制。

    1. 进程限制

    使用命令ulimit -n可以查看当前进程的文件句柄限制,默认为1024。这意味着一个进程最多可以同时打开1024个文件,也就是可以处理的并发TCP连接数也有限制。你可以临时修改此限制,例如使用ulimit -n 1000000,但这种修改只在当前登录会话中有效,重启系统或退出登录后会失效。

    若要永久修改限制,你可以编辑/etc/security/limits.conf文件,将以下内容添加进去:

    soft nofile 1000000
    hard nofile 1000000
    
    • 1
    • 2

    或者你可以编辑/etc/rc.local,在文件末尾添加以下内容:

    ulimit -SHn 1000000
    
    • 1

    2. 全局限制

    使用cat /proc/sys/fs/file-nr命令可以查看全局文件句柄限制,输出的三个值分别表示已经分配的文件句柄数、已经分配但未使用的文件句柄数以及最大文件句柄数。

    在Kernel 2.6版本中,第二项的值通常为0,这并不是错误,它表示已经分配的文件描述符都已经被使用了。

    若要增加全局文件句柄限制,你需要以root权限编辑/etc/sysctl.conf文件,并添加以下配置:

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

    端口号范围限制

    在操作系统中,端口号分为两个范围:1024以下是系统保留的端口,而1024到65535是用户可用的端口。每个TCP连接都使用一个端口号来标识,因此在用户可用的端口范围内,最多可以有65535-1024=64511个并发连接。

    标识一个TCP连接需要一个四元组:{本地IP地址,本地端口,远程IP地址,远程端口}。虽然服务端通常监听一个本地端口,但它可以与多个客户端建立连接,因此本地端口是唯一的,而远程IP地址和端口会随着不同客户端的连接而变化。因此,端口号65535并不是并发连接数的限制。

    最大TCP连接数由客户端的IP地址数和端口号数决定。对于IPv4,不考虑IP地址分类等因素,最大TCP连接数约为232(IP地址数)乘以216(端口号数),即大约2^48。这意味着在一个单一的服务器端,最大TCP连接数可以达到非常大的数目。

    IP地址在计算机里是用四个字节存储的,每个字节是8位二进制位,四个数总共32位 .

    按照TCP/IP(Transport Control Protocol/Internet Protocol,传输控制协议/Internet协议)协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节

    TCP和UDP端口号是16位的,可以表示2的16次方(约65,536)个不同端口号。这个16位范围是从0到65535

    IPv4地址是32位的,可以表示大约42亿个不同的IP地址。这是因为IPv4地址采用点分十进制表示法,将32位二进制数分成4个8位组,每个组用十进制表示,每个组的范围是0到255。这给了我们2的32次方种不同的IP地址组合。

    TCP和UDP端口号是16位的,可以表示2的16次方(约65,536)个不同端口号。这个16位范围是从0到65535。

    因此,最大TCP连接数的计算是基于以下理论依据:

    • 服务器可以与不同的客户端建立连接。
    • 每个连接由客户端的IP地址和端口号以及服务器的IP地址和端口号唯一标识。
    • 对于IPv4,有2的32次方(约42亿)种不同的可能客户端IP地址,以及2的16次方(约65,536)种不同的可能端口号组合。

    因此,将这两个因素相乘,得出最大TCP连接数的估算,即2的32次方(IP地址数)乘以2的16次方(端口号数),约为2的48次方。这是一个理论上的估算,假设没有其他限制,例如操作系统或硬件的限制。实际上,实际的最大连接数可能会受到服务器硬件、操作系统、资源等各种因素的影响。

    在这里插入图片描述

  • 相关阅读:
    Triton部署Torch和Onnx模型
    鸡卵清白蛋白修饰黄素单核苷酸(FMN-OVA),Flavin Mononucleotide-Ovalbumin的保存条件
    电源线虚接,导致信号线发烫
    Linux代码调试----gdb使用介绍
    1211、PXC集群、mysql存储引擎
    matplotlib中图表常用设置(五)
    测试之路-我曾经跨过无数Bug,也怼过各种开发
    mysql---squid代理服务器
    异地恋挺痛苦的
    向爬虫而生---Redis 探究篇5<Redis集群刨根问底(1)>
  • 原文地址:https://blog.csdn.net/yangshangwei/article/details/134218723