每秒处理 500W 条消息,人、机为之颤抖 - 开源中国社区
Float_left Icon_close
每秒处理 500W 条消息,人、机为之颤抖
三刀蜀黍 2017年11月28日

每秒处理 500W 条消息,人、机为之颤抖

三刀蜀黍 三刀蜀黍 发布于2017年11月28日 收藏 180

阿里云高性能云服务器,2折起! >>> >>>  

上个周末发布了smart-socket v1.2.0版本,本以为v1.2.0会拖到年底再发布。但是一次无意的测试结果,让我迫不及待的想尽快将smart-socket再次推荐给大家。正如标题所示,500W/秒是本次测试的战绩,截图如下,真实有效:

发表本文是为了描述一下本次的测试步骤,感兴趣的朋友都可以去尝试一下。

有一点要事先说明一下,不推荐使用Mac操作系统进行压测,可能会出现死机的情况。不过在Linux、Windows或者Mac下创建的虚拟机环境中都可以稳定运行,具体测试步骤:

  1. 登录码云下载工程https://gitee.com/smartboot/smart-socket并导入IDE

  2. 先后启动P2PServer、P2PMultiClient

  3. 运行至少两分钟,观察P2PServer控制台统计数据,第二分钟开始的数据为有效测试数据。


数据分析:
数据指标分为:流入流量、流出流量、处理失败消息数、已处理消息量、已处理消息总量。
要评估smart-socket真正的处理能力,个人觉得应该将流入流量与流出流量、请求消息数与响应消息数分别累加统计。这并不是为了让smart-socket有一个漂亮的数据报告,因为无论是何种类型的流量和消息数,都是经由smart-socket处理的。一分钟内,它不仅完成了近10G流量的读入,还输出了近10G的流量。

按照该思路smart-socket本次的性能表现应为:

  • 处理流量总数近20G,

  • 消息总数超6亿,

  • 平均处理消息数约1000W/秒。

smart-socket已经达到性能极限了吗?当然不是,它还有改进的空间,我知道!作为一款只有区区700多行代码的通信框架,smart-socket极简、易用、高性能的特性,相信可以作为您学习、工作非常不错的一个选择。

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:每秒处理 500W 条消息,人、机为之颤抖
分享
评论(76)
精彩评论
51

引用来自“talent-tan”的评论

说实话,你这个性能数据出来后,我有种如释重负的感觉,当年我说tio每秒可以发500万条聊天消息时,一大群人说我是在造假,更有甚者专门开讨论区说数据在造假(当然所有的指责依据都是他的“经验”,因为他根本不屑去测试)!
我真不知道你有什么如释重负的,就那一个问题你根本不敢回答,这种没有业务,网卡都不走的你就如释重负的?这都看不懂还是怎么的?最近你发布里给的测试也连接数都不敢测个100万连接,却天天喊着不仅仅百万连接?难不成你又是凭经验的?一个两个在首页各种浮夸字眼,不是这种颤抖就是打爆,一个比一个夸张,一点做技术的沉稳都没有,确实也是管理者的纵容才搞得乌烟瘴气的。
42
做技术的他妈的玩什么uc,一帮傻逼样的标题
19
我看了下测试的内容, 10个客户端连1个服务器, 客户端死循环地发33字节长的数据, 服务器收到后回给客户端.
测试结果基本上压到极好的结果, 原因一是本机对本机的数据传输开销比真正的网络栈少很多; 原因二是只在很少的连接上持续压数据,这对任何网络接口(BIO,NIO,AIO)都是开销非常小的行为.
建议分两台物理机测试客户端和服务器, 连接数上到1W再测结果, 会更有意义.
14
说实话,你这个性能数据出来后,我有种如释重负的感觉,当年我说tio每秒可以发500万条聊天消息时,一大群人说我是在造假,更有甚者专门开讨论区说数据在造假(当然所有的指责依据都是他的“经验”,因为他根本不屑去测试)!
9
既然占到头条位置了, 我想客观地说明一下:
这个测试几乎只是在测试CPU和内存的性能, 跟网卡和系统网络协议栈没什么关系, Win10的任务管理器也能看出, 压测的时候网卡毫无压力. 单机内的网络不管用什么框架都没什么性能问题, 关键是物理机之间的大规模连接的网络交互才真正考验网络框架.
另外, 自从Java7面世带来了AIO, JDK已经做了很好的封装, 使上层编写网络应用非常便捷, 所以像几百行写个网络框架得以轻易实现. 所以即使测试得到好成绩, 也应该主要归功于Java本身, 要低调不要居功自傲, 并把主要精力放在上层实际应用提供更便捷更高性能的中间件.
最新评论
0
厉害,赞作者一个,那些酸的人,理论家,别在这BB,你们自己搞一个去,能达到这个量级再来
mark~~~~~~~~~~~~~~~~~~~
0
擦,标题党啊
0
......测试结果应该贴硬件配置 资源的吧。。。。
5
看到这种刺眼、浮夸的标题,本不想点进来,就是想看看评论,高手其实在评论里
2
新闻标题不要这么耸人听闻好咩?
0

引用来自“Tuco”的评论

我做的应用,非常简单的实时流媒体流转发,UDP层面的,无条件转发,c++实现,极限能跑到并发8000路,每一路每秒50个包,centos,超线程后24核的服务器,到这个数字的时候,CPU已经快没了,再往上上,就会有明显的丢包。而且,这个需要支持多通道的网卡,也就是网卡支持将计算任务分发到多个CPU核上。测试的时候,用了双网卡绑定,8通道,两块可以用16个CPU核。如果不支持多通道的网卡,并没有做双网卡符合分担,远远上不了这个数字。我的数字是每秒8000*50=40万个包。比不了,比不了。。。

引用来自“哈库纳”的评论

你的单个数据包大,自然比不了了。

引用来自“Tuco”的评论

是大一点,但是这不是关键。性能消耗发生在小包密集的读取发送上。至于读一次,是100个字节还是10个字节,区别并不大
小包密集发送是很考验 cpu 的。
2

引用来自“talent-tan”的评论

说实话,你这个性能数据出来后,我有种如释重负的感觉,当年我说tio每秒可以发500万条聊天消息时,一大群人说我是在造假,更有甚者专门开讨论区说数据在造假(当然所有的指责依据都是他的“经验”,因为他根本不屑去测试)!

引用来自“tmj”的评论

我真不知道你有什么如释重负的,就那一个问题你根本不敢回答,这种没有业务,网卡都不走的你就如释重负的?这都看不懂还是怎么的?最近你发布里给的测试也连接数都不敢测个100万连接,却天天喊着不仅仅百万连接?难不成你又是凭经验的?一个两个在首页各种浮夸字眼,不是这种颤抖就是打爆,一个比一个夸张,一点做技术的沉稳都没有,确实也是管理者的纵容才搞得乌烟瘴气的。
顶你。
0

引用来自“Tuco”的评论

我做的应用,非常简单的实时流媒体流转发,UDP层面的,无条件转发,c++实现,极限能跑到并发8000路,每一路每秒50个包,centos,超线程后24核的服务器,到这个数字的时候,CPU已经快没了,再往上上,就会有明显的丢包。而且,这个需要支持多通道的网卡,也就是网卡支持将计算任务分发到多个CPU核上。测试的时候,用了双网卡绑定,8通道,两块可以用16个CPU核。如果不支持多通道的网卡,并没有做双网卡符合分担,远远上不了这个数字。我的数字是每秒8000*50=40万个包。比不了,比不了。。。

引用来自“dwing0”的评论

你这个才是真正的网络通信, 而且是具体业务的, 这个结果已经不错了, 不能跟loopback的网络相提并论的.
不过UDP比TCP协议栈简单一些, 开销也小, 就是流量过大容易丢包.
udp应该要性能更高一些
0

引用来自“Tuco”的评论

我做的应用,非常简单的实时流媒体流转发,UDP层面的,无条件转发,c++实现,极限能跑到并发8000路,每一路每秒50个包,centos,超线程后24核的服务器,到这个数字的时候,CPU已经快没了,再往上上,就会有明显的丢包。而且,这个需要支持多通道的网卡,也就是网卡支持将计算任务分发到多个CPU核上。测试的时候,用了双网卡绑定,8通道,两块可以用16个CPU核。如果不支持多通道的网卡,并没有做双网卡符合分担,远远上不了这个数字。我的数字是每秒8000*50=40万个包。比不了,比不了。。。

引用来自“哈库纳”的评论

你的单个数据包大,自然比不了了。
是大一点,但是这不是关键。性能消耗发生在小包密集的读取发送上。至于读一次,是100个字节还是10个字节,区别并不大
0

引用来自“talent-tan”的评论

说实话,你这个性能数据出来后,我有种如释重负的感觉,当年我说tio每秒可以发500万条聊天消息时,一大群人说我是在造假,更有甚者专门开讨论区说数据在造假(当然所有的指责依据都是他的“经验”,因为他根本不屑去测试)!

引用来自“tmj”的评论

我真不知道你有什么如释重负的,就那一个问题你根本不敢回答,这种没有业务,网卡都不走的你就如释重负的?这都看不懂还是怎么的?最近你发布里给的测试也连接数都不敢测个100万连接,却天天喊着不仅仅百万连接?难不成你又是凭经验的?一个两个在首页各种浮夸字眼,不是这种颤抖就是打爆,一个比一个夸张,一点做技术的沉稳都没有,确实也是管理者的纵容才搞得乌烟瘴气的。

引用来自“哈库纳”的评论

实话实说,无论是 t-io 也好还是 smart-socket。 以千兆网卡跑满来算,1000W QPS 下每个数据包也就 10B+。 最新的 t-io 压测据说跑到了 230W,实际上数据包 是 45B+。

我们一起来算个公式: 千兆网卡理论传输速速是 125MB。
t-io: 125MB / 230W 约等于 56B。
smart-socket:125MB / 1000W 约等于 13B。

t-io ,压测单个数据包 45byte(博文中有明确显示), smart-socket 好像没有放出压测单个消息数据包大小,但是估计应该不会超过 13byte。

请问,用缩小被除数的方式来展示威力有意义么?

我的 rsf,在几年前,在百兆网卡上 208B 的单数据包也已经跑出 4.3W 的QPS。 百兆网卡也都打满了。不是说 rsf跑不出更多 QPS ,换到千兆绝对能跑到 30W~40W。或者做服务器做个双千兆沉余。 还会在翻到 80W QPS。 当然 每个数据包都是 200 byte,如果我缩小数据包一倍体积。那 qps 也会翻倍。

因此我觉得大家在这里比 qps 没啥意义,牛又能牛到哪去? 如果我消息的数据包大小是 1 byte。 qps 我能跑到 1.3E。

试问有意义么?

引用来自“三刀蜀黍”的评论

看到你写那么多也是够用心的,有一点你忽略的,减少消息大小对于这个数据的提升是有限的,因为CPU会提早达到极限。比如:消息大小10,CPU能处理100个消息,当你把消息调整为1的时候,CPU可能处理的还是100个消息,因为在消息大于10之前,CPU已经处理不过来了。
我接受一切有根据的质疑,大家一起探讨探讨

引用来自“哈库纳”的评论

我没有质疑你们,如果单机千兆网卡 1byte 消息处理量能 提升到 1.3E + 。我会很有兴趣来看这里面的优化细节,甚至我觉得有必要开一个专题来专门讲解优化。

至于其它的,只要不是程序太丑陋,拼的就是谁能把硬件性能发挥到极致了。

引用来自“三刀蜀黍”的评论

我赞同你的观点,性能测试拼的就是两点:1、机器性能,2:对机器的利用率 。
我关注的一直是后者,只不过这次难得找到一台还不错的机器用来测试。在我的git仓库里还保留着普通PC机的测试报告,那份测试报告应该更亲民一些
建一个淘宝需要100个人花10天,1000个人只要1天。
0

引用来自“Tuco”的评论

我做的应用,非常简单的实时流媒体流转发,UDP层面的,无条件转发,c++实现,极限能跑到并发8000路,每一路每秒50个包,centos,超线程后24核的服务器,到这个数字的时候,CPU已经快没了,再往上上,就会有明显的丢包。而且,这个需要支持多通道的网卡,也就是网卡支持将计算任务分发到多个CPU核上。测试的时候,用了双网卡绑定,8通道,两块可以用16个CPU核。如果不支持多通道的网卡,并没有做双网卡符合分担,远远上不了这个数字。我的数字是每秒8000*50=40万个包。比不了,比不了。。。
你的单个数据包大,自然比不了了。
0

引用来自“Tuco”的评论

我做的应用,非常简单的实时流媒体流转发,UDP层面的,无条件转发,c++实现,极限能跑到并发8000路,每一路每秒50个包,centos,超线程后24核的服务器,到这个数字的时候,CPU已经快没了,再往上上,就会有明显的丢包。而且,这个需要支持多通道的网卡,也就是网卡支持将计算任务分发到多个CPU核上。测试的时候,用了双网卡绑定,8通道,两块可以用16个CPU核。如果不支持多通道的网卡,并没有做双网卡符合分担,远远上不了这个数字。我的数字是每秒8000*50=40万个包。比不了,比不了。。。
你这个才是真正的网络通信, 而且是具体业务的, 这个结果已经不错了, 不能跟loopback的网络相提并论的.
不过UDP比TCP协议栈简单一些, 开销也小, 就是流量过大容易丢包.
2

引用来自“OSC_VmaBwm”的评论

做技术的他妈的玩什么uc,一帮傻逼样的标题
必须给你点赞
2
算了,就不长篇大论了。个人感觉无论smart-socket还是t-io,都是比较好的开源产品,也为各类场景提供了良好的技术支撑,还是先顶一下。

我想说几句,且只代表个人想法。如果紧凭一个框架,而不谈操作系统优化、硬件优化、跨域网络环境和复杂业务的情况下,就谈每秒百万千万条数据量,那BAT、IOE等这些大公司平时都在忙什么?为什么还要自己优化操作系统、定制硬件(包括重新设计网卡芯片总线等),开发自己的专用通信组件?

所以,我还是建议一下相关的开源作者,发文章还是谦虚一点的好,产品可能在实验室环境能达到一个效果,但是生产环境下还是未知数,最好是在标题和内容里加上实验环境测试数据。
0
先经过实际业务印证,再把牛逼吹上天也不迟吧
0
不行了,我做不住了,得出个cio
2
我做的应用,非常简单的实时流媒体流转发,UDP层面的,无条件转发,c++实现,极限能跑到并发8000路,每一路每秒50个包,centos,超线程后24核的服务器,到这个数字的时候,CPU已经快没了,再往上上,就会有明显的丢包。而且,这个需要支持多通道的网卡,也就是网卡支持将计算任务分发到多个CPU核上。测试的时候,用了双网卡绑定,8通道,两块可以用16个CPU核。如果不支持多通道的网卡,并没有做双网卡符合分担,远远上不了这个数字。我的数字是每秒8000*50=40万个包。比不了,比不了。。。
4
吐了,看到这样的标题就反胃了,你们去做销售吧,求你们了
2
java都开始这么注重性能了,C++廉颇老矣
顶部