目的
通过测试数值来比较两个库的优劣
场景
Login 接口(带业务)
参数: 线程250, 时间20分钟, 队列长度:5w, 队列读取间隔: 1s, 不做合并写
数据:
0000001c00000003088080b807120464646464120012054465627567
log4net:
serilog:
相同参数:队列积压:4k-5k区间, cpu: 300%, mem: 4% 都是差不多的。
差异参数:偏差值: serilog(8.64) < log4net(13.28), 吞吐量serilog也优秀5%左右。
hearbeat 接口
参数: 线程3000, 时间20分钟, 队列长度:5w, 队列读取间隔: 1s, 不做合并写
数据:
000000130000000108ffffff07120130120131
log4net:
serilog:
相同参数:cpu: 300%; mem: 4%;都是差不多的。
差异参数:队列积压:serilog(25-30k), log4net(40k+);;吞吐量:serilog(2.6w), log4net(1.5w);偏差值:serilog(33.42), log4net(17.78)
观察
在低压力(上千并发)情况下: log4net和serilog的差距不是很明显。
在高压力(上万并发)情况下:这里log4net由于写的并发不高,导致它的吞吐也是一个慢慢爬坡的过程,并且队列积压严重(超过80%);相反serilog对于写的优秀支持,它可以很快的到达吞吐并发,队列积压只有log4net的一半左右。
延申
再日志放大10倍的压力下,serilog的效率和log4net差不多,都降到了1万每秒,并且有10%的错误率。原因是这个时候,大家都已经把队列撑爆了,这个时候的瓶颈就是队列了。那么通过调整参数得出下表
serilog | tps | 错误率 | 队列积压 (5w) | 预估能力 |
---|---|---|---|---|
10条 | 1.1w/s | 10% | 5w | - |
3条 | 2.1w/s | 0.6% | 5w | - |
2条 | 2.5w/s | 0.01% | 4.1w | 5w/s |
1条 | 2.5w/s | 0% | 2.5w | 2.3w/s |
从这里看出,再队列预设5w长度情况下,serilog可以到达5w/s(但并不是它的峰值)。这么看来后续需要加长队列继续测试:
10w队列
serilog | tps | 错误率 | 队列积压 | 预估能力 |
---|---|---|---|---|
10条 | 1.3w/s | 10% | 10w | - |
20w队列
serilog | tps | 错误率 | 队列积压 | 预估能力 |
---|---|---|---|---|
10条 | 1.6w/s | 1% | 16w | 15w/s |
100w队列
serilog | tps | 错误率 | 队列积压 | 预估能力 |
---|---|---|---|---|
10条 | 1.8w/s | 0.03% | 2w | 18w/s |
所以可以预估在内存充足的情况下serilog的写入能力为15w-18w之间
网上另一位测试者的结果也侧面证明了我的结果