muduo (http://code.google.com/p/muduo) 是一个基于 Reactor 模式的 C++ 网络库,我在编写它 的时候并没有以高并发高吞吐为主要目标,但出乎我的意料,ping pong 测试表明,muduo 吞吐量比 boost.asio 高 15% 以上。
测试对象
boost 1.40 中的 asio 1.4.3
asio 1.4.5 (http://think-async.com/Asio/Download)
muduo 0.1.1 (http://muduo.googlecode.com/files/muduo-0.1.1-alpha.tar.gz) SHA1 Checksum: a446ea8a22915f439063d2bc52eb2dc4b9caf92d
测试环境
硬件:DELL 490 工作站,双路 Intel quad core Xeon E5320 CPU,16G 内存
操作系统: Ubuntu Linux Server 10.04.1 LTS x86_64
编译器:g++ 4.4.3
测试方法
依据 asio 性能测试 http://think-async.com/Asio/LinuxPerformanceImprovements 的办法,用 ping pong 协议来测试吞吐量。
简单地说,ping pong 协议是客户端和服务器都实现 echo 协议。当 TCP 连接建立时,客户端向服 务器发送一些数据,服务器会 echo 回这些数据,然后客户端再 echo 回服务器。这些数据就会像乒乓 球一样在客户端和服务器之间来回传送,直到有一方断开连接为止。这是用来测试吞吐量的常用办法。
asio 的测试代码取自 http://asio.cvs.sourceforge.net/viewvc/asio/asio/src/tests/performance/ ,未作更改。
muduo 的测试代码在 0.1.1 软件包内,路径为 examples/pingpong/,代码如 http://gist.github.com/564985 所示。
muduo 和 asio 的优化编译参数均为 -O2 -finline-limit=1000
$ BUILD_TYPE=release ./build.sh # 编译 muduo 的优化版本
我主要做了两项测试:
单线程测试,测试并发连接数为 1/10/100/1000/10000 时的吞吐量。
多线程测试,并发连接数为 100 或 1000,服务器和客户端的线程数同时设为 1/2/3/4。(由于我 家里只有一台 8 核机器,而且服务器和客户端运行在同一台机器上,线程数大于 4 没有意义。)
所有测试中,ping pong 消息的大小均为 16k bytes。测试用的 shell 脚本可从 http://gist.github.com/564985 下载。
测试结果
单线程测试的结果,数字越大越好: