作为C++的Http应用框架,性能应该是关注的重点之一,本节介绍Drogon的简单测试和成绩;

测试环境

  • 系统是Linux CentOS 7.4;
  • 设备是Dell服务器,CPU是两颗Intel(R) Xeon(R) CPU E5-2670 @ 2.60GHz,16核32线程;
  • 内存64GB;
  • gcc版本7.3.0;

测试方案和结果

我们只是为了测试drogon框架的性能,因而要尽量简化controller的处理,我们只做了一个HttpSimpleController,注册到/benchmark路径上。controller对任何请求都返回<p>Hello, world!</p>。设置drogon线程数为16。handler函数的代码如下, 你可以在drogon/examples/benchmark目录找到这些源码:

  1. void BenchmarkCtrl::asyncHandleHttpRequest(const HttpRequestPtr &req, std::function<void (const HttpResponsePtr &)> &&callback)
  2. {
  3. //write your application logic here
  4. auto resp = HttpResponse::newHttpResponse();
  5. resp->setBody("<p>Hello, world!</p>");
  6. resp->setExpiredTime(0);
  7. callback(resp);
  8. }

作为对比,我选取了nginx来做对比测试,使用nginx+module源码编译的方式,写了一个hello_world_module,测试时nginx的worker_processes参数设为16。

测试工具是一个性能不错的HTTP压力测试工具httpress

我们调整httpress的参数,每组参数测试五次,记录每秒处理请求数的最大值和最小值。测试结果如下表:

命令行 说明 Drogon(千QPS) nginx(千QPS)
httpress -c 100 -n 1000000 -t 16 -k -q URL 100连接,100万请求,16线程,Keep-Alive 561/552 330/329
httpress -c 100 -n 1000000 -t 12 -q URL 100连接,100万请求,12线程,一次请求一次连接 140/135 31/49
httpress -c 1000 -n 1000000 -t 16 -k -q URL 1000连接,100万请求,16线程,Keep-Alive 573/565 333/327
httpress -c 1000 -n 1000000 -t 16 -q URL 1000连接,100万请求,16线程,一次请求一次连接 155/143 52/50
httpress -c 10000 -n 4000000 -t 16 -k -q URL 10000连接,400万请求,16线程,Keep-Alive 512/508 316/314
httpress -c 10000 -n 1000000 -t 16 -q URL 10000连接,100万请求,16线程,一次请求一次连接 143/141 43/40

可以看到,在客户端使用Keep-Alive选项,在一个连接可以发送多个请求的情况下,drogon每秒可以处理50多万次请求,这个成绩是相当不错的。每次请求都发起一次连接的情况下,CPU会消耗在TCP建立和断开等环节,吞吐量会下降至每秒14万次请求,这也是正常的。drogon对比nginx的成绩处于明显优势,也许是由于nginx配置不当未能发挥它的最大吞吐量,如果哪位高手做了更好的测试,欢迎指正。

下图是某一次测试的截图:

测试截图