Use async logger
示例构成
:example
: 典型的异步日志初始化样例,同时进行简单的性能演示
性能演示
单线程低频
- qps: 10000
- concurrency: 1
- file: /dev/null
AMD EPYC 7W83 64-Core Processor |
latency |
cpu |
spdlog |
[1419,1516,2070,5969] |
0.105 |
brpc |
[1437,1555,2071,6130] |
0.124 |
babylon |
[982,1002,1428,4017] |
0.065 |
单线程吞吐
- concurrency: 1
- file: /dev/null
AMD EPYC 7W83 64-Core Processor |
max qps |
latency |
cpu |
spdlog |
2.07M |
[458,597,1074,1327] |
1.99 |
brpc |
0.53M |
[349,363,435,1614] |
1.21 |
babylon |
1.58M |
[560,575,892,1401] |
1.07 |
spdlog和brpc都将全部或部分header格式化拆解到了异步线程执行,『单线程』极限吞吐场景可以通过分拆负载到消费线程提升综合吞吐,其中
- brpc分拆更极限,可以取得最低的提交延迟,但是相对地消费线程负载过重,极限吞吐量相对较低
- spdlog分拆相对均衡,可以更充分利用消费者提升单线程整体吞吐
- babylon的格式化放在了生产端,但是整体使用了性能更好的实现,吞吐相比spdlog有小幅降低,但是单位日志的cpu开销显著节省
多线程低频
- qps: 70000
- concurrency: 7
- file: /dev/null
AMD EPYC 7W83 64-Core Processor |
latency |
cpu |
spdlog |
[1944,2290,4380,9876] |
0.732 |
brpc |
[1706,1941,3582,7986] |
0.818 |
babylon |
[1718,1791,2075,8011] |
0.538 |
多线程吞吐
- concurrency: 7
- file: /dev/null
AMD EPYC 7W83 64-Core Processor |
max qps |
latency |
cpu |
spdlog |
1.41M |
[958,1206,4481,9771] |
1.92 |
spdlog* |
0.41M |
[23405,36043,111814,469699] |
2.63 |
brpc |
0.56M |
[311,329,436,820] |
1.16 |
brpc* |
0.67M |
[15066,21831,44584,71316] |
5.56 |
babylon |
5.58M |
[1225,1268,1508,8881] |
7.28 |
* 生产端最大速率运行
spdlog和brpc都将全部或部分header格式化拆解到了异步线程执行,『多线程』极限吞吐相应受限
- spdlog多线程吞吐低于单线程,主要由于前端竞争提升后反而限制了整体吞吐
- brpc方案会更快达到消费者瓶颈,打满会降级到前端直接打印文件,但因为会显著增大竞争,对吞吐的提升有限
- babylon消费端开销很低,即使生产端最大速率运行也可以支持不会产生退化,吞吐能力更高,单位日志cpu消耗也能够保持较低水平