高性能网络服务器选型比较(EPOLL/Libevent/JAVA mina2)--同感

news/2024/7/9 16:57:44 标签: 高性能服务器, TPS, libevent, epoll

转载自Gleasy团队博客

起因
网上很多关于高性服务器选型的观点,也有很多争议,比如C和JAVA的比较,EPOLL和Libevent的比较,争论不休。包括GLEASY自己提供的中间件,也经常受到不少批评和质疑,收到最多的就是关于使用语言的,GLEASY中间件多数使用JAVA语言,基于MINA2框架,而且我们内部经过大量的压力测试和验证也证明了是性能极高的。关于这一点,在本博客的其它文章中有大量介绍。
不过是否可以百尺杆头,更进一步呢?比如选用C语言和基于C语言的开发库,情况如何呢?
因此,Gleasy架构组做了一系列的实验,来验证当前一些主流的高性能网络服务器开发库的性能比较起来到底如何。

实验数据
实验1:EPOLL(leader-fllower,oneshot) C语言
实验2:Libevent N 1线程(N=CPU核数,one event-loop per thread) C语言
实验3:Mina2(JAVA语言)
实验结果在下面附件中:
Epoll与Mina与Libevent性能测试

结论
CPU占用对比图:

TPS对比图:
TPS%E5%AF%B9%E6%AF%94%E5%9B%BE.jpg" width="619" height="271" class="alignnone size-full wp-image-544" style="background:transparent; border:none; margin:0px; padding:0px; vertical-align:baseline; max-width:100%; height:auto" />

对两幅图的解释:
1. 从TPS(每秒处理的请求数据上来看),三者没有本质差异,基于JAVA语言的MINA2框架在TPS上绝对不输于C语言EPOLL和LIBEVENT。而且这三个家伙的性能表现都很牛很牛,从图上可以看出,当并发连接在1000左右时,TPS平均可达30万,高峰时可达50万。
2. EPOLL无论在TPS或者CPU占用率方面都占优势。这是预料之中,毕竟LIBEVENT也好,MINA2也好,在LINUX上面,最终使用也是EPOLL机制,所以只要不犯低级错误,原生的EPOLL在性能和CPU消耗方面必然会占优势。
3. LIBEVENT和MINA2都在EPOLL基础上做了大量的封装工作,比如LIBEVENT的buffer event,Mina2的codec,不可避免造成额外的CPU开销。其中基于java语言的mina2在CPU上开销明显大于C语言的其它方案。甚至有接近2倍的差异。
4. 我们在开发功能复杂的服务器应用之时,一些基本的工作必须要做,比如buffer,比如codec,这些工作我们自己做,或者交由libevent或者mina2来做,始终都要去做,是避免不了的,而且我们自己去实现,本身效率如何也未知。所以我们才会选择使用更上层的封闭,一方面减少工作量,另一方面,避免无关的错误发生。从这一点出发,在做技术选型之时,综合取舍,业务简单但对性能极端要求的场景,可以直接用C语言和EPOLL,业务复杂度高工程较大的需求,可以选用JAVA语言和MINA2。不要太纠结于选取的语言,该C时就C,该JAVA时就JAVA,没有谁比谁更优秀。还是那句千年不变的老话,永远没有最好的技术,只有用最适合的技术。别人说的永远只是别人的经验,自己动手尝试证明得到的才是最真实的!


http://www.niftyadmin.cn/n/1460912.html

相关文章

模拟10K问题

1、 几个指标 QPS(TPS):每秒钟request/事务 数量 并发数: 系统同时处理的request/事务数 响应时间: 一般取平均响应时间 2、 编写一个服务器测试服务器器支持的最大连接数 采用epoll实现支持1万个链接&#xf…

32bit与64bit程序移植

缘由 最近在移植32bit代码过程中,发现各种异常bug,排查和定位非常困难。很多都是编程习惯导致的。 132位与64位 (1)64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 (…

redis与DB数据同步问题

最近做的一个项目中很多地方用到了Redis,其中纠结了一下redis的数据持久化问题,毕竟是缓存,数据随时都有可能丢失,虽然概率不大,况且redis还会将数据持久到安装路径的一个文件中,但还是要保证缓存数据与持久…

pyspider爬虫核心逻辑架构

可能不完善,望指教。

逆向入门

前沿 从本篇起,逆向工厂带大家从程序起源讲起,领略计算机程序逆向技术,了解程序的运行机制,逆向通用技术手段和软件保护技术,更加深入地去探索逆向的魅力。 一、程序如何诞生? 1951年4月开始在英国牛津郡哈…

Linux 开发过程中I/O操作的效率测试

缘由: 在linux c/c应用开发中,难免会产生大量的I/O,然而在对程序性能要求较高时,避免I/O过高或效率过低,导致整体性能拖慢。因此,在程序架构设计上要非常关注I/O带来的性能瓶颈,下面做一些简单…

IDS之snort复习

最近在做流重组、规则引擎,不禁想起以前利用过的开源snort,现在复习之。转载:http://safe.it168.com/a2012/0731/1379/000001379177_all.shtml 我们都知道,企业的网络目前威胁主要来自两个位置:一个是内部&#xff0c…

redis + messagepack 消息队列

0x01缘由: 当需要在不同的服务之间传递状态信息或通知,以及订阅者和发布者的模式时,要使用消息队列。 典型的场景有: WEB和C后台/Python后台/Java后台传递一些消息时,如配置文件、指令等。 0x02开源程序版本&#xff1…