课件和 Demo 地址
https://gitee.com/geektime-geekbang/geek_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)引用连接文章里的内存大小,很大。 格式有点乱,先将就看看,等课程结束,我排版好,做个小册子发你们。
作者回复: 严格来说,确实不是一个层次的东西,侧重点也不同,但是看很多人经常把这二个混淆,而且确实,表面看他们也经常呈现出类似的效果,比如netty + http codec 约等于 tomcat+servlet实现web服务器, 考虑到这点,所以内容编排上放一起做了一个区分和比较; netty核心确实主要是提供传输层的支撑,但是它也提供了很多应用层协议的编解码支持。
作者回复: 真的是这样,选择要“跟风”且果断
作者回复: 说实话,不知道,但是其实不用看的,肯定netty居多,我不信有人会自己实现一套,如果有,也是历史产品。
作者回复: 是不同层次的东西,但是经常搞混淆,所以我就把这个放进来了比较了下,有点类似雷锋和雷峰塔的比较了(不过有点夸张了,虽然不同层次,但是能实现类似的东西,所以才放一起做了比较。)