为什么Linux+MONO性能这么差?

showjim 2016-06-19 07:01:52
花了两天时间折腾了一下MONO,性能测试结果让人诅丧。
测试机是4核(i5-4570),测试项目是一个WEB服务网络通讯综合性能测试,先贴测试结果。

这是win7物理机的测试结果,可以看到TPS稳定在22K/s以上。

这是win7物理机下的MONO测试结果,很不错和.NET差不多;测到这里还高兴了一下:MONO性能没有别人说的那么差啊。。。

可是接下来在Unbuntu上的测试

这是4核win2008虚拟机的测试结果,相对于物理机有20%的性能损耗,这个倒是正常的。

这是4核Unbuntu虚拟机的测试结果,TPS竟然只剩下30%,有人能告诉我为什么吗?

这是2核win2008虚拟机的测试结果,看起来没有什么太大的意外。

这是2核Unbuntu虚拟机的测试结果,竟然和4核的测试结果接近,有人能告诉我为什么吗?

因为没有在Unbuntu物理机上测试,所以CPU虚拟机可能是一个问题。另外难道和IOCP有关?

测试中启动5个进程,1个客户端进程,1个HTTP服务进程,3个TCP负载均衡节点进程。
测试内容为计算两个整数的和或者异或值,并在客户端验证计算结果。
测试流程为客户端进程启动 CPU数量*256 个HTTP客户端(由于4核MONO在测试环境中启动1024客户端会造成拒绝连接问题,所以只启动3*256个客户端),采用异步IO短连接模式对HTTP服务发起请求,随机访问HTTP服务端的8个调用接口,HTTP服务端把请求转发到3个TCP计算节点并在获取计算返回值以后返回给HTTP客户端。
HTTP服务器端支持 AJAX、WebView、WebCall、搜索引擎View 共4种访问模式,每种访问模式都同时支持同步与异步两种访问模式,所以有8个调用接口。

最后祭出测试项目fastCSharp中的demo.loadBalancingTcpCommandWeb,希望有大神能够指点一二。
...全文
1350 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
跃2.0 2019-10-21
  • 打赏
  • 举报
回复
看不懂,我就想知道怎么抓包分析网站
showjim 2016-06-29
  • 打赏
  • 举报
回复
引用 41 楼 bigbaldy 的回复:
所以说啊,建议你还是都用真实机去测,虚拟机不同系统的实现本身也不同,实现的程度优化的程度也不一样,这样测试的结果尤其是性能没有什么太大的意义
是的,不过我暂时没有把MONO用于生产环境的需求,只是想把fastCSharp移植到Linux下做与DEMO相关的基本功能测试,性能测试只是附带的。 而且IO性能这种测试结果本身受多方面影响,比如64并发可能比1024并发测试结果高1倍;工具、参数、硬件环境,每一个的变动都可能造成比较大的差距。
bigbaldy 2016-06-29
  • 打赏
  • 举报
回复
引用 39 楼 sbwwkmyd 的回复:
终于找到一个大问题,把虚拟机的CPU设置由 4处理器*1核 改成 1处理器*4核,测试性能增加了1倍多,但是windows虚拟机基本没有影响。 下面贴出最新的测试结果,windows采用1024并发,Ubuntu因为不想修改文件句柄数量采用512客户端并发,ONLYWEB表示不测试负载均衡,HELLO表示静态文件测试(否则为动态请求测试),KEEP表示长连接测试。 i5-4570 3.20GHz 物理机/1024 WMware/1024 WMware+Ubuntu/512 ONLYWEB,HELLO,KEEP 14W 11.5W 7.8/8.6W ONLYWEB,KEEP 12W 9W 6.7/7.1W KEEP 7.8W 4.5W 3.2W/3.7W ONLYWEB,HELLO 3W 2.3W 1.6W/2.2W ONLYWEB 2.9W 2.2W 1.5W/1.6W 2.4W 1.8W 1.5W/1.8W 从VMware的测试结果中看到,Linux+MONO与windows+.NET性能差距大概只有20%-30%。
所以说啊,建议你还是都用真实机去测,虚拟机不同系统的实现本身也不同,实现的程度优化的程度也不一样,这样测试的结果尤其是性能没有什么太大的意义
showjim 2016-06-29
  • 打赏
  • 举报
回复
貌似排榜有问题 i5-4570 3.20GHz 物理机/1024 WMware/1024 WMware+Ubuntu/512 ONLYWEB,HELLO,KEEP 14W 11.5W 7.8/8.6W ONLYWEB,KEEP 12W 9W 6.7/7.1W KEEP 7.8W 4.5W 3.2W/3.7W ONLYWEB,HELLO 3W 2.3W 1.6W/2.2W ONLYWEB 2.9W 2.2W 1.5W/1.6W 2.4W 1.8W 1.5W/1.8W
showjim 2016-06-29
  • 打赏
  • 举报
回复
终于找到一个大问题,把虚拟机的CPU设置由 4处理器*1核 改成 1处理器*4核,测试性能增加了1倍多,但是windows虚拟机基本没有影响。 下面贴出最新的测试结果,windows采用1024并发,Ubuntu因为不想修改文件句柄数量采用512客户端并发,ONLYWEB表示不测试负载均衡,HELLO表示静态文件测试(否则为动态请求测试),KEEP表示长连接测试。 i5-4570 3.20GHz 物理机/1024 WMware/1024 WMware+Ubuntu/512 ONLYWEB,HELLO,KEEP 14W 11.5W 7.8/8.6W ONLYWEB,KEEP 12W 9W 6.7/7.1W KEEP 7.8W 4.5W 3.2W/3.7W ONLYWEB,HELLO 3W 2.3W 1.6W/2.2W ONLYWEB 2.9W 2.2W 1.5W/1.6W 2.4W 1.8W 1.5W/1.8W 从VMware的测试结果中看到,Linux+MONO与windows+.NET性能差距大概只有20%-30%。
tanta 2016-06-28
  • 打赏
  • 举报
回复
虚拟机肯定是有损失。mono性能也是个问题。
showjim 2016-06-24
  • 打赏
  • 举报
回复
引用 36 楼 gentle_wolf 的回复:
按你自己的测试用例测试一下asp.net core不就可以了? Mono + ASP.net 跟 .NetFramework + ASP.net。差别很大,根本就是两拨人开发的。 ASP.net core就不一样了。 .net core 跟asp.net core是一拨人开发的。 所以还是别纠结MONO + asp。net的方案了。
我不是ASP.NET,有8年时间没有接触,已经很陌生了。 这个测试是个综合性测试,包括httpServer+webServer(各种形式的动态请求解析)+Query解析+JSON序列化+二进制序列化+TCP负载均衡,我觉得以我现在对于ASP.NET的熟悉程度,要在ASP.NET Core中实现这个完整的测试可能要花不少时间。 如果是简单的长连接测试,我也给出了fastCSharp服务端在2核下的测试数据。当然我没有测试ASP.NET Core(毕竟测试机也可能存在较大差距),我希望你能给我一个可以在win7+vs2013环境下直接能跑的测试包,如果要我自己折腾这个估计得要过段时间了。我现在这折腾MONO的问题,毕竟已经开始了,不过等我有这个空闲时间的时候会尝试做ASP.NET Core测试的,到时候再贴测试结果。
月影 2016-06-23
  • 打赏
  • 举报
回复
引用 29 楼 sbwwkmyd 的回复:
[quote=引用 26 楼 gentle_wolf 的回复:]我还没有在任何关于性能的文章中看到header解析成为性能瓶颈的。 就算解析header会影响性能,任何web框架都有这个问题,也不可能解决这个问题。所以纠结header解析造成的性能影响根本是毫无意义的。
我并不是说Header解析成为性能瓶颈,我只是强调这样的测试数据没有现实意义。
引用 27 楼 gentle_wolf 的回复:
哈,你看得确实比我仔细, 而我只是领会精神而已。 看看这篇文章,使用asp.net core支撑高性能游戏服务器: http://web.ageofascent.com/asp-net-core-exeeds-1-15-million-requests-12-6-gbps/ 我觉得你遇到的性能问题不至于用asp.net core解决不了吧?
我并没有说ASP.NET core性能差,我只是觉得这种测试环境产生的测试数据仅仅是个噱头,不现实。 我觉得任何web服务器在windows下使用IOCP+缓存池的模式(不在应用层new对象),精简定制化的长连接测试应该都可以达到这个量级(而且游戏更可能采用websocket除了握手都不存在Header解析一说)。[/quote] 老的asp.net 就达不到这个要求。现在的论题是什么? We are building Age Of Ascent – an ultra-MMO; a new scale of game. Born in the cloud, it enables tens of thousands of pilots to be in the same battle; and millions of players to be in the same single-sharded universe – which can be accessed anywhere at any time, on any device. Our communication mechanism between these micro-services is entirely ASP.NET Core based on David Zhao’s excellent Service Fabric ASP.NET Core Hosting example. This means our entire system’s responsiveness and performance hinges on the performance of ASP.NET Core. This is why it is important; and why we strive for performance. The more we can do; the richer an experience we can create for our players – at a lower cost. .NET Core and ASP.NET Core are really shaping up to be the frameworks that we not only want, but also need.
showjim 2016-06-23
  • 打赏
  • 举报
回复
引用 25 楼 puler 的回复:
VM的性能,个人认为主要瓶颈在硬盘 我用虚拟机来运行偏重CPU计算的项目,效率在实际物理主机中运行的效果是基本一致的 你可以测试一下,感觉应该问题在物理读写硬盘上
我做序列化这种CPU计算型的测试,确实没问题。
引用 31 楼 xuzuning 的回复:
比较性能应该在对等的环境中进行 虚拟机中可使用的资源明显要少的多,出现悲观的结果是很正常的
有虚拟机与虚拟机的对比(当然没有物理机与物理机的对比),现在的测试结果相差50%。
xuzuning 2016-06-23
  • 打赏
  • 举报
回复
比较性能应该在对等的环境中进行 虚拟机中可使用的资源明显要少的多,出现悲观的结果是很正常的
showjim 2016-06-23
  • 打赏
  • 举报
回复
引用 25 楼 puler 的回复:
VM的性能,个人认为主要瓶颈在硬盘 我用虚拟机来运行偏重CPU计算的项目,效率在实际物理主机中运行的效果是基本一致的 你可以测试一下,感觉应该问题在物理读写硬盘上
网络通讯测试应该与硬盘IO没有关系,也不是CPU计算类型的(主要的瓶颈可能在于Socket实现机制与内存速率)。
引用 28 楼 gentle_wolf 的回复:
asp.net core只提供了两个server,一个weblistener ,基于http.sys;一个kestrel,基于libuv。前者只能用于windows,后者可以跨平台。基本上你想用现成的,你应该没有什么别的选择。 当然了,你可以写封装自己的server。反正我是不会, 就算是会,我也不想去做。
自己封装的定制化(适合自己的需求)与可控性更高,如果你要说开源项目也可以改,那样的话到最后很可能比自己封装的代价还要大。 当然对于没有定制需求的开发者来说,当然是直接使用现成的更好。
showjim 2016-06-23
  • 打赏
  • 举报
回复
引用 26 楼 gentle_wolf 的回复:
我还没有在任何关于性能的文章中看到header解析成为性能瓶颈的。 就算解析header会影响性能,任何web框架都有这个问题,也不可能解决这个问题。所以纠结header解析造成的性能影响根本是毫无意义的。
我并不是说Header解析成为性能瓶颈,我只是强调这样的测试数据没有现实意义。
引用 27 楼 gentle_wolf 的回复:
哈,你看得确实比我仔细, 而我只是领会精神而已。 看看这篇文章,使用asp.net core支撑高性能游戏服务器: http://web.ageofascent.com/asp-net-core-exeeds-1-15-million-requests-12-6-gbps/ 我觉得你遇到的性能问题不至于用asp.net core解决不了吧?
我并没有说ASP.NET core性能差,我只是觉得这种测试环境产生的测试数据仅仅是个噱头,不现实。 我觉得任何web服务器在windows下使用IOCP+缓存池的模式(不在应用层new对象),精简定制化的长连接测试应该都可以达到这个量级(而且游戏更可能采用websocket除了握手都不存在Header解析一说)。
月影 2016-06-23
  • 打赏
  • 举报
回复
引用 21 楼 sbwwkmyd 的回复:
引用 15 楼 gentle_wolf 的回复:
什么是RIO?你想要什么样的性能呢?
我认为RIO是这个项目中提到唯一有看头的东西,你竟然视而不见。。。
asp.net core只提供了两个server,一个weblistener ,基于http.sys;一个kestrel,基于libuv。前者只能用于windows,后者可以跨平台。基本上你想用现成的,你应该没有什么别的选择。 当然了,你可以写封装自己的server。反正我是不会, 就算是会,我也不想去做。
月影 2016-06-23
  • 打赏
  • 举报
回复
引用 21 楼 sbwwkmyd 的回复:
引用 15 楼 gentle_wolf 的回复:
什么是RIO?你想要什么样的性能呢?
我认为RIO是这个项目中提到唯一有看头的东西,你竟然视而不见。。。
哈,你看得确实比我仔细, 而我只是领会精神而已。 看看这篇文章,使用asp.net core支撑高性能游戏服务器: http://web.ageofascent.com/asp-net-core-exeeds-1-15-million-requests-12-6-gbps/ 我觉得你遇到的性能问题不至于用asp.net core解决不了吧?
月影 2016-06-23
  • 打赏
  • 举报
回复
引用 23 楼 sbwwkmyd 的回复:
引用 19 楼 gentle_wolf 的回复:
3. http的header就是一堆key value,难道这会造成性能瓶颈?
在我给出的测试数据中,简单的动态请求15W+/s相对于静态文件请求26W+/s,至少有40%的差距,而这个差距仅仅就是Header解析+动态Response。而且这两个过程是没有new任何对象的,如果要生成一堆string这个开销是不容忽视的。
我还没有在任何关于性能的文章中看到header解析成为性能瓶颈的。 就算解析header会影响性能,任何web框架都有这个问题,也不可能解决这个问题。所以纠结header解析造成的性能影响根本是毫无意义的。
月影 2016-06-23
  • 打赏
  • 举报
回复
引用 35 楼 sbwwkmyd 的回复:
引用 33 楼 gentle_wolf 的回复:
现在的论题是什么?
我现在可不想花时间在HTTP在长连接处理大批量请求的问题上,因为我的TCP服务能更好的解决这个问题,而不是HTTP。
按你自己的测试用例测试一下asp.net core不就可以了? Mono + ASP.net 跟 .NetFramework + ASP.net。差别很大,根本就是两拨人开发的。 ASP.net core就不一样了。 .net core 跟asp.net core是一拨人开发的。 所以还是别纠结MONO + asp。net的方案了。
showjim 2016-06-23
  • 打赏
  • 举报
回复
引用 33 楼 gentle_wolf 的回复:
现在的论题是什么?
我现在可不想花时间在HTTP在长连接处理大批量请求的问题上,因为我的TCP服务能更好的解决这个问题,而不是HTTP。
showjim 2016-06-23
  • 打赏
  • 举报
回复
引用 33 楼 gentle_wolf 的回复:
老的asp.net 就达不到这个要求。现在的论题是什么? We are building Age Of Ascent – an ultra-MMO; a new scale of game. Born in the cloud, it enables tens of thousands of pilots to be in the same battle; and millions of players to be in the same single-sharded universe – which can be accessed anywhere at any time, on any device. Our communication mechanism between these micro-services is entirely ASP.NET Core based on David Zhao’s excellent Service Fabric ASP.NET Core Hosting example. This means our entire system’s responsiveness and performance hinges on the performance of ASP.NET Core. This is why it is important; and why we strive for performance. The more we can do; the richer an experience we can create for our players – at a lower cost. .NET Core and ASP.NET Core are really shaping up to be the frameworks that we not only want, but also need.
也是,某些设计上本身不支持精简定制化的web服务器不好做,但是也不能排除Hook定制的可能性。 论题?我现在的问题是想找出我的测试程序为什么在linux上与windows相差50%的原因,以及是否能够在C#层面解决。
showjim 2016-06-22
  • 打赏
  • 举报
回复
引用 9 楼 gentle_wolf 的回复:
引用 8 楼 sbwwkmyd 的回复:
[quote=引用 7 楼 gentle_wolf 的回复:] [quote=引用 6 楼 sbwwkmyd 的回复:] [quote=引用 5 楼 gentle_wolf 的回复:] 直接.net core吧。一秒90万请求。
你是单纯的TCP单个长连接测试吧,原生windows+.NET也远远达不到这个量。
哈,.net core 在windows 平台上一秒110万请求。[/quote] 跪求简单测试项目,这个量级根据我个人的经验使用原生.NET仅仅Accept都困难。[/quote] https://github.com/aspnet/benchmarks[/quote]看了一下,测试机是6核12线程服务器,测试的基本就是TCP长连接的纯收发操作,所谓的ASP.NET Core也都是套个HTTP壳的TCP长连接批量处理。 唯一有看头的就是RIO了。
puler 2016-06-22
  • 打赏
  • 举报
回复
VM的性能,个人认为主要瓶颈在硬盘 我用虚拟机来运行偏重CPU计算的项目,效率在实际物理主机中运行的效果是基本一致的 你可以测试一下,感觉应该问题在物理读写硬盘上
加载更多回复(23)

110,477

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧