作者回复: 不好意思回复迟了,最近一直忙录课,没来得及好好给您回复,我把你这个问题单独记录下来,以后做个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核心确实主要是提供传输层的支撑,但是它也提供了很多应用层协议的编解码支持。
作者回复: 真的是这样,选择要“跟风”且果断
作者回复: 是不同层次的东西,但是经常搞混淆,所以我就把这个放进来了比较了下,有点类似雷锋和雷峰塔的比较了(不过有点夸张了,虽然不同层次,但是能实现类似的东西,所以才放一起做了比较。)