3 CHN 13 性能测试
ProTankerAlfa edited this page 2024-05-20 01:29:57 -03:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

English | 简体中文

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

测试环境

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

测试方案和结果

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

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

作为对比我选取了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配置不当未能发挥它的最大吞吐量如果哪位高手做了更好的测试欢迎指正。

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

测试截图

14 Coz 分析