读书频道 > 系统 > linux > Linux多线程服务端编程:使用muduo C++网络库
6.5.1 muduo与Boost.Asio、libevent2的吞吐量对比
2013-01-24 11:44:43     我来说两句 
收藏    我要投稿   
本书主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。这是在Linux下以native语言编写用户态高性能...  立即去当当网订购

我在编写muduo的时候并没有以高并发、高吞吐为主要目标。但出乎我的意料,ping pong测试表明,muduo的吞吐量比Boost.Asio高15%以上;比libevent2 高18%以上,个别情况甚至达到70%.

测试对象

•boost 1.40中的asio 1.4.3

•asio 1.4.5(http://think-async.com/Asio/Download)

•libevent 2.0.6-rc (http://monkey.org/~provos/libevent-2.0.6-rc.tar.gz)

•muduo 0.1.1

测试代码

•asio的测试代码取自http://asio.cvs.sourceforge.net/viewvc/asio/asio/src/tests/performance/,未做更改。

•我自己编写了libevent2 的ping pong测试代码,路径是recipes/pingpong/libevent/。由于这个测试代码没有使用多线程,所以只对比muduo和libevent2 在单线程下的性能。

•muduo的测试代码位于examples/pingpong/,代码如gist所示。

muduo和asio的优化编译参数均为-O2 -finline-limit=1000。

$ BUILD_TYPE=release ./build.sh # 编译muduo 的优化版本

测试环境

硬件:DELL 490工作站,双路Intel 四核Xeon E5320 CPU,共8核,主频1.86GHz,内存16GiB。

软件:操作系统为Ubuntu Linux Server 10.04.1 LTS x86_64,编译器是g++ 4.4.3。

测试方法

依据asio性能测试的办法,用ping pong协议来测试muduo、asio、libevent2在单机上的吞吐量。

简单地说,ping pong协议是客户端和服务器都实现echo协议。当TCP连接建立时,客户端向服务器发送一些数据,服务器会echo回这些数据,然后客户端再echo回服务器。这些数据就会像乒乓球一样在客户端和服务器之间来回传送,直到有一方断开连接为止。这是用来测试吞吐量的常用办法。注意数据是无格式的,双方都是收到多少数据就反射回去多少数据,并不拆包,这与后面的ZeroMQ延迟测试不同。

我主要做了两项测试:

•单线程测试。客户端与服务器运行在同一台机器,均为单线程,测试并发连接数为1/10/100/1000/10 000时的吞吐量。

•多线程测试。并发连接数为100或1000,服务器和客户端的线程数同时设为1/2/3/4。(由于我家里只有一台8核机器,而且服务器和客户端运行在同一台机器上,线程数大于4没有意义。)

在所有测试中,ping pong消息的大小均为16KiB。测试用的shell脚本可从http://gist.github.com/564985下载

在同一台机器测试吞吐量的原因如下:

现在的CPU很快,即便是单线程单TCP连接也能把千兆以太网的带宽跑满。如果用两台机器,所有的吞吐量测试结果都将是110MiB/s,失去了对比的意义。(用Python也能跑出同样的吞吐量,或许可以对比哪个库占的CPU少。)

在同一台机器上测试,可以在CPU资源相同的情况下,单纯对比网络库的效率。也就是说在单线程下,服务端和客户端各占满1个CPU,比较哪个库的吞吐量高。

测试结果

单线程测试的结果(见图6-3),数字越大越好。


 

以上结果让人大跌眼镜,muduo居然比libevent2 快70%!跟踪libevent2 的源代码发现,它每次最多从socket读取4096字节的数据(证据在buffer.c的evbuffer_read()函数),怪不得吞吐量比muduo小很多。因为在这一测试中,muduo每次读取16 384字节,系统调用的性价比较高。

为了公平起见,我再测了一次,这回两个库都发送4096字节的消息(见图6-4)。


 

测试结果表明muduo的吞吐量平均比libevent2 高18%以上。

多线程测试的结果(见图6-5),数字越大越好。


 

测试结果表明muduo的吞吐量平均比asio高15%以上。

讨论

muduo出乎意料地比asio性能优越,我想主要得益于其简单的设计和简洁的代码。asio在多线程测试中表现不佳,我猜测其主要原因是测试代码只使用了一个io_service,如果改用“io_serviceper CPU”的话,其性能应该有所提高。我对asio的了解程度仅限于能读懂其代码,希望能有asio高手编写“io_serviceperCPU”的ping pong测试,以便与muduo做一个公平的比较。

由于libevent2 每次最多从网络读取4096字节,这大大限制了它的吞吐量。ping pong测试很容易实现,欢迎其他网络库(ACE、POCO、libevent 等)也能加入到对比中来,期待这些库的高手出马。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:6.5 性能评测
下一篇:6.5.2 击鼓传花:对比muduo与libevent2的事件处理效率
相关文章
图文推荐
3.3.6 GNOME的软件管
3.3.5 GNOME的文件管
3.3.4 GNOME的窗口管
3.3.3 收藏夹和快捷
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站