zoukankan      html  css  js  c++  java
  • 单机并发连接数研究

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

     
    client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享。tcp端口的数据类型是unsigned short,因此本地端口个数最大只有65536,端口0有特殊含义,不能使用,这样可用端口最多只有65535,所以在全部作为client端的情况下,最大tcp连接数为65535,这些连接可以连到不同的server ip。
     
    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次方。
     
    在unix/linux下限制连接数的主要因素是内存和允许的文件描述符个数(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符), 另外1024以下的端口通常为保留端口。对server端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万 是没问题的。
     
    注意事项:
    1.默认的CONNTRACK_MAX值不会低于128
    2.对于带有超过1G内存的系统,CONNTRACK_MAX的默认值会被限制在65536(但是可以手工设置成更大的值)
    3.默认HASHSIZE的值不会小于16
    4.对于带有超过1G内存的系统,HASHSIZE的默认值会被限制在8192(但是可以手工设置成更大的值)
     
    总结
    1.每个连接都要耗费一定的资源,比如CPU、MEM,所以,真实值往往很难达到理论值;
    2.根据协议的不同,能达到的最大连接数也不一样,比如HTTP/1.0连接的创建和关闭都非常快,而且浏览器对并发连接数有限制,所以,很难达到最大的理论值。HTTP/1.1支持流线技术,多个请求可以复用一个连接,这样就大大减少了并发连接数。FTP或者telnet连接都是长连接,很容易达到最大值。
    3.很多设备(比如NetScaler)在服务器端都支持连接池(连接复用),里面的连接都是长连接,一样实现了HTTP/1.1里面的流线技术,一个连接就可以处理多个客户端连接。这样除了减少连接资源,同时还减少了负载均衡器的其他资源开销,同时减低了内网的带宽。
    4.一些设备(比如NetScaler的TCP-OFFLOAD)支持TCP卸载,仅仅把已经建立的连接发到服务器端,而TCP的三次握手完全有负载均衡器接管,这样,服务器端的连接就成倍的减少。
     
    资料来源:
    1.http://wanshi.iteye.com/blog/1256282
    2.http://hi.baidu.com/hawk418/blog/item/8377b86e8fe7b3c081cb4a84.html

    3.http://itfun.blog.sohu.com/212057666.html

    单机千万并发连接实战

    http://www.2cto.com/kf/201508/437814.html

  • 相关阅读:
    跟我学Windows Azure 一 创建Windows Azure试用账号
    Dynamic编程
    多线程下的资源同步访问
    避免在同一机器上同时运行同一应用程序的多个实例
    依赖注入与Service Locator
    MVP演化论
    应用MVP模式对遗留代码进行重构
    对遗留代码的解依赖技术
    单元测试之测试方法
    单元测试之Mock
  • 原文地址:https://www.cnblogs.com/rexy/p/5544354.html
Copyright © 2011-2022 走看看