• Zer01ne
    2019-11-06
    老师,一般的netty服务端能支持多少长连接?

    作者回复: 不好意思回复迟了,最近一直忙录课,没来得及好好给您回复,我把你这个问题单独记录下来,以后做个netty 100问什么的到时候再集中发您,这里我先把我的理解总结下贴给您:
    这个问题其实不是 Netty 专属问题,类似问题:一个服务器或者客户端能创建多少连接,以 linux 为例:

    一个连接是由:客户端【IP + PORT】+ 服务器 【IP(固定的) + PORT(固定的)】 四个元素决定的,所以支持多少,要从两个角度分析:

    (1)对于单个客户端(IP地址固定)而言:
        理论值:单个客户端连接到一个服务器最多连接数取决于本地可用端口数(因为其他3个元素固定了): 65535(报文中端口占用字节数是16,所以最大端口数65535)- 1024(保留端口,不给用) 约 64K。
        实际值:取决于以下三个方面:
                1)TCP层:ip_local_port_range (参考/proc/sys/net/ipv4/ip_local_port_range),可调整,最大65535-1024
                2)系统限制:最大文件句柄数(参考/etc/security/limits.conf),可调整,最大21亿
                3)资源限制:内存等资源有限,例如连接本身占用资源,Netty本身的socket相关的对象也占用jvm,需要根据机器做测试。

    (2)对于服务器而言:
        理论值: 最大连接数 = 客户端数量(IP地址数量) * 单个客户端的最多连接数(约64K),不考虑资源限制,最多21亿,实际以资源限制为准, 100万连接就要占用3G以上了。
        实际值: 受限于三个方面:
                1)TCP层: IPv4使用32位(4字节)地址,因此地址空间中只有4,294,967,296(约43亿),所以乘以单个客户端最大64K, 数量惊人。
                1)系统限制:同上,最大21亿
                2)资源限制:同上

    总结:
    (1)对于客户端,6万多点,对于服务器,100万到1000万,再多,内存就要30G以上了,所以网上经常说百万连接。当然,如果你机器内存1G不到的话,那也搞不了了。
    (2)单纯看连接多少意义不是很大,因为连接是为了做事情,光能连上很多,但是占用资源过大导致基本已经不能动弹的话,意义就不大了,不过这个问题本身有趣。

    扩展:
    (1)查看ip_local_port_range方法:
        [root@netty ~]# cat /proc/sys/net/ipv4/ip_local_port_range
        16384    61000

    (2)服务器支持1200万连接的案例:
        https://mrotaru.wordpress.com/2013/06/20/12-million-concurrent-connections-with-migratorydata-websocket-server/
     (3) 最大文件句柄数的最大值受另外一个参数控制:
            [root@netty ~]# cat /proc/sys/fs/nr_open
                1048576
        设置超过的话:
            [root@netty ~]# ulimit -Hn 9000000
        - bash: ulimit: open files: cannot modify limit: Operation not permitted
        所以如果想改的更大,这需要修改这个参数(默认百万:1048576(1024 * 1024)):
            sysctl -w fs.nr_open=100000000
        那这参数最大值,可以到多少呢?2147483584 (即7FFFFFC0,也就是在MAXINT(2147483647)基础上按64字节对齐)
    (4)linux系统下,一个socket连接一般占用3K,所以100万连接至少需要3G,而1000万就要30G了,所以可以看下(2)引用连接文章里的内存大小,很大。

    格式有点乱,先将就看看,等课程结束,我排版好,做个小册子发你们。

    
     11
  • 吃饭饭
    2019-10-14
    Tomcat 和 Jetty 是 web 容器,虽然 netty 也能实现,但是并不完善;Netty 的主要应用是针对传输层的,我感觉 这里拿Tomcat 和 Jetty 比较 Netty 并不合适吧

    作者回复: 严格来说,确实不是一个层次的东西,侧重点也不同,但是看很多人经常把这二个混淆,而且确实,表面看他们也经常呈现出类似的效果,比如netty + http codec 约等于 tomcat+servlet实现web服务器, 考虑到这点,所以内容编排上放一起做了一个区分和比较;
    netty核心确实主要是提供传输层的支撑,但是它也提供了很多应用层协议的编解码支持。

    
     2
  • helloworld
    2019-10-10
    只听说过Mina,Tomcat,Jetty和Netty,Java领域高性能网络通讯框架看来非Netty不可了

    作者回复: 真的是这样,选择要“跟风”且果断

    
     1
  • 布小丫学编程
    2019-11-04
    Netty是基于Socket抽象层(传输层)通信的,而Tomcat是基于HTTP协议(应用层)通信的,它们是不是不可以类比呢?

    作者回复: 是不同层次的东西,但是经常搞混淆,所以我就把这个放进来了比较了下,有点类似雷锋和雷峰塔的比较了(不过有点夸张了,虽然不同层次,但是能实现类似的东西,所以才放一起做了比较。)

     1
    
  • 大牙
    2019-11-01
    “关键问题是 Netty就从类没有输过”。老师一本正经的幽默还真的很幽默
    
    
我们在线,来聊聊吧