Sentinel [Benchmark] 1.8.5版本 benchmark性能损耗严重

3mpgtkmj  于 2022-10-19  发布在  其他
关注(0)|答案(4)|浏览(383)

测试场景:在4C8G机器下跑com.alibaba.csp.sentinel.benchmark.SentinelEntryBenchmark的testSingleThreadDirectly、testSingleThreadSingleEntry
对比1.8.5和1.7.0,发现1.8.5性能损耗较严重

组长度1.8.5 Baseline (QPS)1.8.5 With Sentinel (QPS)1.8.5 性能损耗1.7.0 Baseline (QPS)1.7.0 With Sentinel (QPS)1.7.0 性能损耗官方 Baseline (QPS)官方 With Sentinel (QPS)官方 性能损耗
length=25524112.631277096.82147.13%551245.089364269.6533.92%604589.916401687.76533.56%
length=50205371.625151465.38626.25%213939.277179810.66315.95%221307.617192407.83213.06%
length=10089676.05378605.02512.35%92361.78485894.0337.00%97673.22891535.1466.28%
length=20040003.39237519.7646.20%41446.58939917.1563.69%43742.9642711.1292.36%
length=50013942.42413677.9981.90%14563.86814378.4341.27%15332.92415171.0241.06%
length=10006392.3176282.311.72%6624.786588.8710.54%7012.8486984.0360.41%
rdlzhqv9

rdlzhqv91#

大概看了一下 1.8.5 的损耗更大是因为 com.alibaba.csp.sentinel.util.TimeUtil 获取时间戳导致的,这项改动是在 1.8.2 的时候改的,pr #1746 .
1.8.2之前单线程定时获取时间戳,逻辑简单损耗小。本地尝试退回低版本逻辑后,损耗与1.7.0相近都是30%左右.

baseline 
Iteration   1: 827715.314 ops/s
Iteration   2: 833483.394 ops/s
Iteration   3: 862953.880 ops/s
Iteration   4: 838244.698 ops/s
Iteration   5: 844601.165 ops/s
本地回退后
Iteration   1: 619276.191 ops/s
Iteration   2: 605762.269 ops/s
Iteration   3: 604013.370 ops/s
Iteration   4: 616744.857 ops/s
Iteration   5: 600452.212 ops/s
1.8.5
Iteration   1: 486989.339 ops/s
Iteration   2: 456925.205 ops/s
Iteration   3: 472775.531 ops/s
Iteration   4: 486847.351 ops/s
Iteration   5: 474700.233 ops/s
kyvafyod

kyvafyod2#

减少2次对volatile变量的读取,减少一次原子递增(去掉writes,只有记录日志的时候会用到),可以提高一些性能

测试结果
修改前:
Iteration 1: 389147.172 ops/ms
Iteration 2: 389936.648 ops/ms
Iteration 3: 389672.101 ops/ms
Iteration 4: 391088.041 ops/ms
Iteration 5: 390817.670 ops/ms
修改后:
Iteration 1: 473274.648 ops/ms
Iteration 2: 473249.861 ops/ms
Iteration 3: 473374.149 ops/ms
Iteration 4: 473110.630 ops/ms
Iteration 5: 471155.953 ops/ms

piwo6bdm

piwo6bdm4#

刚开始研究sentinel,关于这个类(TimeUtil)是不是可以进一步优化一下,看一下是否可行
1、调用量的统计是否可以使用Constants.ENTRY_NODE中的统计结果,这样获取时间戳的时候就不用单独统计了
2、获取时间戳的代码进一步优化,对volatile变量只做必要的读取。

相关问题