1.笔者本人现在在一家创业公司担当整个平台架构的角色,而这家公司是做一移动互联网相关的一些应用产品,由其现在正在和中国最大的互联网公司之一进行合作,负责该互联网公司的手机终端的长连接推送服务,所以有一些总结特在此和大家分享一下。

2.下面这篇文章是笔者在几个月前做的一篇长连接的总结,所以可能写的不是非常严谨,特给javaer们进行一些参考即可,有如下几个数据和大家一起分享下:

1) 单JVM实现了50W以上长连接,每秒消息处理“Hello Word”和心跳包6W次

2)该长连接,不仅实现了手机终端的摸拟,而且该框架也是一个成熟的RPC框架,已经在笔者所在的公司使用。比阿里巴巴开源版本出来的"dubbo"性能要高,而且更节省带宽,大家可以测试比较一下。

3)因为netty支持的长连接,每条连接占有用内存是5K,笔者经过包装之后每条连接占用5.3K, 每条长连接系统要占用8K;所以大家可以计算一下每条长连接一共要消耗的系统内存量。

4)通过“3)”我们可以计算,50W长连接需要多少内存量(JVM):500000*5.3K=2650000K=2.53G,50W长连接需要多少内存量(OS):500000*8K=3.8G

也就是说,50W长连接的话,大约需要总占用系统10G的内存空间(当然这是保守值,也希望大家多测试测试给出更多的一些数据)

3.好了,说了这么多,看看笔者的一些测试数据吧(笔者只是把几个月前的测试邮件内容发出,因为某些原因笔者不能发出现在公司正在使用的完全代码实现)

1)如果要支持这么多的长连接,一定要修改一下系统的一些内核参数,如下:

C代码  
  1. <span>vi /etc/sysctl.conf
  2. net.ipv4.tcp_max_syn_backlog = 65536
  3. net.core.netdev_max_backlog =  32768
  4. net.core.somaxconn = 32768
  5. net.core.wmem_default = 8388608
  6. net.core.rmem_default = 8388608
  7. net.core.rmem_max = 16777216
  8. net.core.wmem_max = 16777216
  9. net.ipv4.tcp_timestamps = 0
  10. net.ipv4.tcp_synack_retries = 2
  11. net.ipv4.tcp_syn_retries = 2
  12. net.ipv4.tcp_tw_recycle = 1
  13. #net.ipv4.tcp_tw_len = 1
  14. net.ipv4.tcp_tw_reuse = 1
  15. net.ipv4.tcp_mem = 94500000 915000000 927000000
  16. net.ipv4.tcp_max_orphans = 3276800
  17. #net.ipv4.tcp_fin_timeout = 30
  18. #net.ipv4.tcp_keepalive_time = 120
  19. net.ipv4.ip_local_port_range = 1024  65535
  20. /sbin/sysctl -p
  21. 最后个命令是让配置生效的。
  22. vi /etc/security/limits.conf
  23. 添加
  24. *                -       nofile          1006154</span>

注:a.因为移动终端经常会因为网络问题断开,所以要修改内核参数支持连接断开后快速回收

b.OS虽然默认TCP的缓冲内存已经足够大,但是因为系统要支持很多的长连接,所以缓冲内存还需要调整,要不然会发生丢包情况(这个也是笔者当时和58同城的资深VP聊天的时候了解并学习到的)

c.文件句柄数要加大,因为OS默认支持的长连接数量比较小

2)下面是测试的邮件正文

写道

1. 有消息收发之间的间隔,比如说。Client --> Server端发消息。
如果Server端默认1分钟没有收到消息(包括心跳),则断开连接,可配间隔时间。
同理,如果Client端没有Server推过来的消息(包括心跳),则断开连接,可配间隔时间。

当然,如果没有消息,心跳包也是可以Client <--> Server互发的。如果没有消息,心跳就会互发,为了保证长连接不断。如果要是在接收方没有消息过来,则认为连接断了。之前设计这个的时候,就是考虑到了手机端的长连接的各种应用场景。

2. 每个登录用户没有用户session,不过有这个接口,可以每个连接可以添加一个attchment,可以跟据连接绑定信息。
测试的时候没有给attchment加信息。
其实真的不是为了代替他的方案,当时设计的时候就是为了RPC和手机服务端长连接设计的。
用户session信息比较占用内存,我是建议用户session信息放在堆外,这样不影响JVM。

3. 现在内存表现是用的CMS回收策略,所以没有出现full gc回收停顿的情况。但是因为netty的长连接本身就占了5K,而且我们这边又加了一些扩展信息,所以现在一个连接占了5.3K。

4. 为什么说现在超过50W了,是因为现在内存上限设成6G了,然后又进行了50W以上的长连接和每秒60000以上的消息发送(Hello Word)。
年轻代和老年代回收的时间都在0.4秒左右,所以对应用没有影响才敢说50W长连接了。
(注:年轻代回收,其实整个应用会停的,老年代的 full gc也是整个应用会停的;不过gc.log我看了,在0.4秒左右,所以没有影响应用)
(其实理论上还可以加内存,不过没有经过压力测试也没有时间弄了,没有测试机测试一回太累了,不过至少保证50W长连接没有啥问题)
(我估计也差不多了是上限了,应用内存回收已经占了0.4秒了,再加大如果回收时间占有的太长也不好)

5. 之前为什么说加到6G测试后,不行。是因为我发现jvm的年轻代不能开太大,好像年轻代开的太大会影响整个应用的停顿时间。所以这次是把年轻代保持不变,heap推放大到6G,所就是说多出来的2G空间给老年代了。而长连接正好在老年代保存,所以新加的2G给长连接正好把长连接推到了50W长连接。而且还有1G以上的空闲空间,而且老年代的full gc也控制在了0.4秒,我感觉比例正好。

下面是测试数据:

1.  同时在线人数 : 508691

2. JVM 参数配置:

3.  资源使用情况:

5.  每秒消息数:60000msg/s

6. gc.log 信息如下:

ParNew :是新生代的回收时间,会让整个应用停止,real 是真实的应用停止时间:0.4x

GC[YG occupancy] 这一段是老年代full gc :会让整个应用停止,real 是真实时间,0.42

因为gc 新年代和老年代收回不频繁,所以对应用没有影响。内存我也其实也不想再加了,在60000 个消息并发和50W 心跳包的情况下能做到这个效果,我感觉不错了。

刚才问了手机QQ 的长连接,这前他们是15~20W 长连接一台,现在新的架构也就能做35~40W ,我感觉现在应该行了。

该长连接测试用例,笔者是用summercool-hsf开源框架(笔者的另一个开源的RPC框架)的基础上实现的。笔者正在用grizzly实现另一个手机终端长连接版本,因为grizzly更加节省内存,能支持更多的长连接数量,虽然性能可能不会达到netty,但是对不是高压力该问,但是对长连接数量有非常高要求的应用,grizzly还是非常适合的。笔者因为时间的关系,不再列出grizzly的详细测试数据,后面的章节会继续给出,请大家关注。

summercool-hsf框架地址(已经在某些公司的大型应用成熟使用1年时间):http://code.google.com/p/summercool-hsf/

原文

http://dragonsoar.iteye.com/blog/1567771

移动互联网长连接方案实例相关推荐

  1. 物联网小课堂之NB-IoT黑科技——长连接方案x2

    各位技术大人们,我唐三鸽回来了! But鸽不鸽的都不怪我,隔壁老田非要逼我闭关修炼,所以... 其实是我连续出差一个月了啊,我的内心是崩溃的...算了,我毕竟是佛系工程师,不吐槽了,还是正事要紧. 进 ...

  2. (java)socket全双工长连接通信实例

    (借鉴备忘)直接上代码: client: import java.io.InputStreamReader; import java.io.OutputStreamWriter; import jav ...

  3. 知乎千万级高性能长连接网关是如何搭建的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:https://www.xttblog.com/?p=487 ...

  4. 知乎千万级高性能长连接网关揭秘

    https://zhuanlan.zhihu.com/p/66807833 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你们在直播弹幕里不约而同的 666,它 ...

  5. 图文:知乎千万级高性能长连接网关是如何搭建的?

    实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你们在直播弹幕里不约而同的 666,它们的背后都离不开长连接技术的加持. 每个互联网公司里几乎都有一套长连接系统, ...

  6. plsql保持长连接_知乎千万级高性能长连接网关是如何搭建的

    作者:@faceair @安江泽原文:https://zhuanlan.zhihu.com/p/66807833 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如 ...

  7. 图文:千万级高性能长连接网关是如何搭建的?

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...

  8. 知乎技术分享:知乎千万级并发的高性能长连接网关技术实践

    本文来自知乎官方技术团队的"知乎技术专栏",感谢原作者faceair的无私分享. 1.引言 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你 ...

  9. 案例精选 | 知乎千万级高性能长连接网关揭秘

    实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如你们在直播弹幕里不约而同的 666,它们的背后都离不开长连接技术的加持. 每个互联网公司里几乎都有一套长连接系统, ...

最新文章

  1. 干货 | 谷歌BERT模型fine-tune终极实践教程
  2. 磁盘管理命令:du df
  3. 成功解决TypeError: fit_transform() takes 2 positional arguments but 3 were given
  4. Java实现二维码技术探讨。
  5. 10 个非常有用的 AngularJS 框架
  6. 20.IDA-修改二进制文件、显示修改点
  7. 物联网技术概论的课程编号_选课推荐 | 第5期:物联网技术概论
  8. gdal java api_Java使用GDAL库
  9. c语言CRC16校验(8005)
  10. 简述springmvc过程_Springmvc执行流程
  11. 键盘选中一行或多行的快捷键
  12. H2单元测试数据库使用调研
  13. windows多线程编程1
  14. 阿里云国际站:阿里云服务器遇到了CC攻击怎么处理防护措施?
  15. 如何安装R以及RStudio?打开RStudio页面告诉你没安装R或者出现页面空白问题
  16. fadeIn fadeOut
  17. 如何在pdf文件上进行电子签名
  18. 基于Python监测键盘输入并发出声音的坤音键盘
  19. 高通平台QCRILD
  20. Led护眼灯真的有效果吗?2022双十一最值得入手护眼台灯推荐

热门文章

  1. python3.6安装pygame-python3.6 安装pygame
  2. python程序员工作怎样-12个Python程序员面试必备问题与答案(小结)
  3. python有必要学吗-Python这么火,要不要学?听听华为工程师怎么说...
  4. python用中文怎么说-python如何设置中文界面
  5. python在excel中的应用-python中的excel操作
  6. python序列类型-python序列类型包括哪三种
  7. 怎么把python结果全部显示-python 显示数组全部元素的方法
  8. 济南python工资一般多少钱-济南学Python的机构排名
  9. python对笔记本电脑的要求-学Python买什么笔记本电脑?
  10. python中文意思k-【Python】 汉字转化汉语拼音pinyin