• 高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少


    常识一:文件句柄限制


    在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can't open so many files”

    这时你需要明白操作系统对可以打开的最大文件数的限制。

    1进程限制

    执行 ulimit -n 输出 1024,说明对于一个进程而言最多只能打开1024个文件,所以你要采用此默认配置最多也就可以并发上千个TCP连接。

    临时修改:ulimit -n 1000000,但是这种临时修改只对当前登录用户目前的使用环境有效,

    系统重启或用户退出后就会失效。

    重启后失效的修改(不过我在CentOS 6.5下测试,重启后未发现失效),编辑 /etc/security/limits.conf 文件, 修改后内容为:

    • soft nofile 1000000
    • hard nofile 1000000

    永久修改:编辑/etc/rc.local,在其后添加如下内容:

    • ulimit -SHn 1000000

    2全局限制

    执行 cat /proc/sys/fs/file-nr 输出 9344 0 592026,分别为:

    • 1. 已经分配的文件句柄数,
    • 2. 已经分配但没有使用的文件句柄数,
    • 3. 最大文件句柄数。

    但在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

    常识二:端口号范围限制?

    操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。

    • 由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接?
    • 我想有这种错误思路朋友不在少数吧?(其中我过去就一直这么认为)

    分析一下
    如何标识一个TCP连接:
    系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}

    好吧,我们拿出《UNIX网络编程:卷一》第四章中对accept的讲解来看看概念性的东西,

    第二个参数cliaddr代表了客户端的ip地址和端口号而我们作为服务端实际只使用了bind时这一个端口,

    说明端口号65535并不是并发量的限制

    server最大tcp连接数:(good!!!!!!!!)
    server通常固定在某个本地端口上监听,等待client的连接请求。

    不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的

    因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的

    因此最大tcp连接为客户端ip数×客户端port数对IPV4,不考虑ip地址分类等因素最大tcp连接数约为:2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。

     

    本文小结

    上面给出的结论都是理论上的单机TCP并发连接数,实际上单机并发连接数肯定要受硬件资源(内存)、网络资源(带宽)的限制,至少对我们的需求现在可以做到数十万级的并发了,你的呢?

  • 相关阅读:
    JavaCC 研究与应用( 8000字 心得 源程序)
    推荐UML插件Green UML、AmaterasUML
    Custom PMD Rules
    静态分析工具及使用总结(三)
    静态分析工具及使用总结(二)CheckStyle
    静态分析工具及使用总结(一)
    基于antlr的表达式解析器——函数类型验证
    基于antlr的表达式解析器——函数生成(通过freemarker)
    网络流--最大流--hlpp(预流推进)模板
    网络流--最大流--Dinic模板矩阵版(当前弧优化+非当前弧优化)
  • 原文地址:https://www.cnblogs.com/zhangkele/p/8955051.html
Copyright © 2020-2023  润新知