目的

通过测试数值来比较两个库的优劣

场景

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之间

网上另一位测试者的结果也侧面证明了我的结果