当前位置: 首页 > 知识库问答 >
问题:

quarkus http调用负载测试结果1000个请求——16秒对65秒

谭骏
2023-03-14

测试1:

@Path("/performance")
public class PerformanceTestResource {

    @Timeout(20000)
    @GET
    @Path("/resource")
    @Produces(MediaType.APPLICATION_JSON)
    public Response performanceResource() {

        final String name = Thread.currentThread().getName();
        System.out.println(name);

        Single<Data> dataSingle = null;

                try {
                    dataSingle = Single.fromCallable(() -> {
                        final String name2 = Thread.currentThread().getName();
                        System.out.println(name2);
                        Thread.sleep(1000);
                        return new Data();
                    }).subscribeOn(Schedulers.io());

                } catch (Exception ex) {
                    int a = 1;
                }

        return Response.ok().entity(dataSingle.blockingGet()).build();
    }

}

测试本身也可以看到call定期定义

@QuarkusTest
public class PerformanceTestResourceTest {

        @Tag("load-test")
        @Test
        public void loadTest() throws InterruptedException {

            int CALL_N_TIMES = 1000;
            final long CALL_NIT_EVERY_MILLISECONDS = 10;

            final LoadTestMetricsData loadTestMetricsData = LoadTestUtils.callPeriodically(
                                                                                    this::callHttpEndpoint,
                                                                                    CALL_N_TIMES,
                                                                                    CALL_NIT_EVERY_MILLISECONDS
                                                                            );

            assertThat(loadTestMetricsData.responseList.size(), CoreMatchers.is(equalTo(Long.valueOf(CALL_N_TIMES).intValue())));

            long executionTime = loadTestMetricsData.duration.getSeconds();

            System.out.println("executionTime: " + executionTime + " seconds");

            assertThat(executionTime , allOf(greaterThanOrEqualTo(1L),lessThan(20L)));
        }

测试1的结果:

执行时间:16秒

测试2:相同,但没有@Timeout注释:

执行时间:65秒

问:为什么?我认为即使16秒也很慢。问:如何让它更快:说1000个电话要2秒。

我意识到我使用<代码>。资源中的blockingGet(),但我仍然希望重用阻塞线程。

P、 我尝试了更多的“反应式”返回<code>Single

更新:反应式/RX 爪哇 2 路

@path("/performance")
public class PerformanceTestResource {

//@Timeout(20000)
@GET
@Path("/resource")
@Produces(MediaType.APPLICATION_JSON)
public Single<Data> performanceResource() {

    final String name = Thread.currentThread().getName();

    System.out.println(name);
    System.out.println("name: " + name);

    return Single.fromCallable(() -> {

        final String name2 = Thread.currentThread().getName();
        System.out.println("name2: " + name2);

        Thread.sleep(1000);
        return new Data();
    });
}
}`

砰.xml

io . small rye small rye-context-propagation-propagators-rx Java 2 org . JBoss . rest easy rest easy-rx Java 2

然后,当运行相同的测试时:

执行时间:64秒

输出将类似于:

name: vert.x-worker-thread-5 vert.x-worker-thread-9 name: vert.x-worker-thread-9 
name2: vert.x-worker-thread-9 
name2: vert.x-worker-thread-5

因此,我们阻止了工作线程,即在 REst/资源端使用。那是高速公路。然后:

如果我使用:Schedulers.io()在睡眠-1000-call的单独执行上下文中:

return Single.fromCallable(() -> { ... }).subscribeOn(Schedulers.io());

执行时间:16秒

输出将是这样的(见一个新成员:RxCachedThreadScheduler)

name: vert.x-worker-thread-5
name2: RxCachedThreadScheduler-1683
vert.x-worker-thread-0
name: vert.x-worker-thread-0
vert.x-worker-thread-9
name: vert.x-worker-thread-9
name2: RxCachedThreadScheduler-1658
vert.x-worker-thread-8

似乎无关紧要:无论我是否显式使用block ingGet(),我都得到相同的结果。

我想,如果我不阻止它,这将是大约2-3秒。

问:从现在开始,我有办法修正/调整这个问题吗?

我假设使用<code>调度程序。io()带来了<code>RxCachedThreadScheduler

问:或者无论如何:如何使应用程序像Quarkus一样具有响应性/反应性/性能。或者我错过了什么?

谢谢!

共有1个答案

相威
2023-03-14

好的。也许是我。在我的call periodicly();我传递CALL_NIT_EVERY_MILLISECONDS = 10毫秒。10 * 1000 = 10 000 -仅添加请求就需要10秒。

这个,我设置成0了

我得到了服务器1000模拟请求的6秒。

还是不是2-3秒。而是6秒。

如果我使用. getBlock并返回响应或返回,似乎没有区别。

--

但只是提一下,这个hello world应用程序需要1秒钟来处理1000个并行请求。而Quarkus一号是6秒。

public class Sample2 {

    static final AtomicInteger atomicInteger = new AtomicInteger(0);

    public static void main(String[] args) {

        long start = System.currentTimeMillis();

        final List<Single<Response>> listOfSingles = Collections.synchronizedList(new ArrayList<>());

        for (int i=0; i< 1000; i++) {

//            try {
//                Thread.sleep(10);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }

            final Single<Response> responseSingle = longCallFunction();

            listOfSingles.add(responseSingle);

        }

        Single<Response> last = Single.merge(listOfSingles).lastElement().toSingle();

        final Response response = last.blockingGet();

        long end = System.currentTimeMillis();

        System.out.println("Execution time: " + (end - start) / 1000);

        System.out.println(response);

    }

    static Single<Response> longCallFunction() {
        return Single.fromCallable( () -> { // 1 sec
            System.out.println(Thread.currentThread().getName());
            Thread.sleep(1000);
            int code = atomicInteger.incrementAndGet();
            //System.out.println(code);
            return new Response(code);
        }).subscribeOn(Schedulers.io());
    }

}
 类似资料:
  • 我已经使用JMeter为我的web应用程序创建了一个记录的测试计划。我的web应用程序基本上为新客户和现有客户创建一个财务计划。我记录了为一个新客户创建财务计划所需的所有步骤。我不确定如何验证Jmeter是否真的运行了记录的步骤。我正在使用图形结果,并在记录计划的末尾检查吞吐量。 我不确定如何验证Jmeter是否实际运行了所有线程用户和记录的步骤。如有任何建议,将不胜感激。谢谢!

  • 对于任何使用jmeter进行api功能测试的人来说,报告并不是很好。有人使用http://extentreports.com/这样的东西来显示他们的测试结果吗?对其他更好地显示测试结果的方法有什么想法吗?在尝试使用一个主要关注性能测试和测试结果的工具时,当我们测试REST API调用和测试结果时,这并不起作用。例如,能够捕获在测试运行期间创建的数据是很好的,但是jmeter中内置的报告都没有做到这

  • 我如何负载测试一个同时有300个用户使用jmeter的登录页面(而不是一个又一个用户。同时有300个用户登录)?线程组的设置应该是什么?

  • 我正在使用ITestListener,用于生成范围报告的范围管理器。它工作正常。我正在从另一个方法调用5@Test方法。报告(TestNG 请检查我的示例代码:建议任何其他方法来获得报告 我的TestNG XML文件: 我的驱动程序脚本:

  • 主要内容:1. 项目依赖文件配置,2. @Test(invocationCount =?),3. @Test(invocationCount = ? threadPoolSize = ?),4. 负载测试示例在本教程中,我们将演示如何使用属性和在网站上执行负载测试或压力测试。 使用的工具 : TestNG 6.8.7 Selenium 2.39.0 Maven 3 我们使用库自动化浏览器来访问网站。创建一个用于测试的Maven项目:TestngSelenium 。 1. 项目依赖文件配置 获取T