1.3.2 使用JMH进行Sentinel压测

如果要测试Sentinel对应用性能的影响,则需要测试两组数据并进行对比。这两组数据分别是不使用Sentinel的情况下方法的吞吐量及使用Sentinel的情况下方法的吞吐量。

Sentinel提供的基准测试类的部分源码如下。

该基准测试类通过@State注解来指定每个线程使用不同的numbers字段的实例,所以@Setup注解的方法也会执行8次,并分别在每个线程开始执行基准测试方法之前执行,用于完成初始化工作,与JUnit中的@Before注解功能相似。

分别对doSomething方法和doSomethingWithEntry方法进行基准测试,其中doSomething方法用于模拟业务方法,doSomethingWithEntry方法用于模拟使用Sentinel保护业务方法。将基准测试模式配置为吞吐量模式,使用@Warmup注解指定预热次数为10次,使用@OutputTimeUnit注解指定输出单位为秒,使用@Fork注解指定进程数为1个,使用@Threads注解指定线程数为8个。

使用doSomething方法进行吞吐量测试的结果如下。

由结果可知,最小OPS为295 869.456,平均OPS为300 948.682,最大OPS为316 089.624。

使用doSomethingWithEntry方法进行吞吐量测试的结果如下。

由结果可知,最小OPS为280 835.799,平均OPS为309 934.827,最大OPS为337 712.803。

其中,OPS表示每秒执行的操作次数或每秒执行的方法次数。

从本次测试结果可以看出,doSomething方法的平均吞吐量与doSomethingWithEntry方法的平均吞吐量相差约为3%,也就是说,在超过28万OPS(QPS)的情况下,Sentinel对应用性能的影响不到3%。在实际项目场景中,一个服务节点所有接口总的QPS也很难达到25万这个值,而QPS越低,Sentinel对应用性能的影响也越低。

但这毕竟是在没有配置任何限流规则、只有一个资源且调用链路的深度为1的情况下进行的测试,因此这个结果只能算一个理想的参考值,在实际项目场景中还是以项目实际的使用测试结果为准。