项目地址:https://github.com/MuggleWei/cc_log_benchmark
当前已经有许多开源的 C/C++ 日志库, 本项目对一些知名或以低延时为目标的日志库做一个 Benchmark, 力求发现当面对如 MMORPG Server 或是金融交易系统这类低延时的场景下, 哪些日志库是较好的选择.
提醒: 有一些图表之外需要注意的内容, 感兴趣的读者可在最后看到
此库对几个 C/C++ 日志库做 benchmark, 被测的库如下所示(按字母顺序排序)
使用 google benchmark 进行测试, 测试分为两部分场景
测试日期: 2023-10-14
被测库版本, 详见: CMakeLists.txt
单次写入数据:
struct LogMsg {
uint64_t u64;
uint32_t u32;
int64_t i64;
int32_t i32;
char s[128];
};
日志输出格式:
${Level}|${datetime}|${filename}.${line_no}|${func_name}|${thread_id} - u64: msg.u64, i64: msg.i64, u32: msg.u32, i32: msg.i32, s: msg.s
类型: 笔记本
机器: 20R10002CD ThinkPad X1 Carbon 7th
系统: Arch Linux x86_64
Kernel: 6.5.6-arch2-1
CPU: Intel i7-10710U (12) @ 4.700GHz
GPU: Intel Comet Lake UHD Graphics
Memory: 15659MiB
gcc: (GCC) 13.2.1 20230801
ldd: (GNU libc) 2.38
由于我本地机器的测试中遇到一些问题, 导致 fmtlog, quill 和 reckless 没有做到测试场景完全的覆盖
#define FMTLOG_BLOCK 1
时, 测试进程会被卡死而无法继续, 所以 fmtlog 只测试了缓冲区满选择丢弃日志的模式UNBOUNDED
时, 在 场景 1 中, 会导致内存使用一直增长而失败, 所以在测试 quill_unbounded 的时候, 跳过 场景 1 的测试由于个人水平所限, 若有错误和纰漏, 亦或是考虑欠妥之处, 还请不吝指正!
通过上述图表不难看出
那么上面提到的这四个日志库为什么更快?他们有什么优劣势,以及使用中有什么要注意的坑呢?
以上 4 个日志库均为异步日志库, 设计上也都是多缓冲区队列写, 消费者负责轮询的模式, 整体思路相似, 代码细节各有各的趣味. 但作为用户来说, 有一点要特别注意
特别注意!!!
特别注意!!!
特别注意!!!
既然都使用了缓冲区, 那么就一定要考虑缓冲区被写满的情况, 此时有三种不同的应对方式
haclog 与 Nanolog 选择了方案 1, fmtlog 可选方案 1/2, quill 可选方案 2/3
而由于 额外说明 中提到的情况, 导致 fmtlog 只可选择方案 2, quill 在 场景 1 中仅讨论 bounded 模式
优点
缺点
#define FMTLOG_BLOCK 1
情况时, 无法完成 场景 1 的测试优点
缺点
优点
缺点
优点
缺点
haclog 使用纯 C 开发, 而 fmtlog, Nanolog 和 quill 采用 C++ 开发; 当就日志库这个场景来说, 理论上 C++ 实现速度上限会更高一点点, 表现为以下两个方面
tail
一类的工具无法使用可以看出, 当前这几个异步日志并没有一个能在全方位碾压其他日志库, 而是都在某一方面做了权衡取舍
1
liprais 2023-10-17 11:56:55 +08:00
你用了一个带睿频的 cpu 测试的么?
|
2
cnbatch 2023-10-17 12:08:43 +08:00
看完这个测试后,OP 的测试应该是测出了日志库的不可能三角?
高吞吐、不丢日志、可实时读换 |
5
kkocdko 2023-10-17 19:25:56 +08:00
一楼的意思是你应该把 boost=0 ,睿频会有很大的性能波动。benchmark 这种事情本身就是求稳定,才能对各个库都公平。
|
6
weidaizi OP @kkocdko 谢谢您的提醒!
我之前一直认为,设置了 `cpupower frequency-set -g performance`, 那么默认都应该是固定在最高频率上跑,频率应该是稳定的;您要表达的意思是,如果 turbo boost 开着,我这样设置之后频率依然是不稳定的吗? |
7
weidaizi OP |