首页 > 解决方案 > 为什么我收到 Gatling 错误:“[gatling-http-1-14] WARN io.netty.channel.nio.NioEventLoop”并且 Gatling 在任何错误后都会杀死 VU

问题描述

我在尝试运行我已经完成的加特林模拟时遇到了几个问题。基本上,我有两个问题:

  1. 当 Gatling 模拟中的任何被测 API 返回 400 或任何其他错误代码(不是 check.status 的一部分)时,Gatling 会杀死虚拟用户,而不是重新启动场景并重新使用该虚拟用户,因此对于每个错误,我失去了一个虚拟用户,因为我的测试计划只有 16 个用户进行 30 分钟,我在最初的几分钟内完成了测试而没有完成任何事情每次我尝试运行测试时都会发生这种情况,而且很烦人我一直在关注所有文档,但我不知道代码有什么问题。用户和斜坡的模拟配置如下代码所示:
    val scnCreation = scenario("My Scenario").during(conf.getDuration("test.duration")) {
        exec(Pattern.methodToExecute)
    }

    setUp(scnCreation.inject(
        rampUsers(conf.getInt("test.vu")).during(conf.getDuration("test.ramp"))
    )
  1. 我在测试运行时收到此错误,但我的资源并没有不堪重负(CPU 约为 ~30%,内存约为 ~50%):

    [gatling-http-1-13] WARN io.netty.channel.nio.NioEventLoop - Selector.select() returned prematurely 512 times in a row;

关于如何增加 Gatling 引擎的“限制”以及如何修复 Gatling 在错误后杀死一个虚拟用户的不良行为的任何想法?

标签: performance-testinggatlingscala-gatling

解决方案


  1. 您关于错误时虚拟用户退出循环并终止的声明很可能是错误的,除非您已经通过某种退出条件以这种方式实现了测试(编辑:您这样做了)。

如果您不希望您的用户退出循环,请不要使用exitHereIfFailed. exitBlockOnFail用代替包装你的循环内容。看看文档。

然后,无论如何,加特林都不会“回收”虚拟用户。您正在使用rampUsers它定义一个开放的工作负载模型,您可以在其中定义用户的到达率。

  1. 这是一个 NIO/OS 错误。至少将您的 Java 升级到 Java 8 的最新版本,如果您在 Linux 上运行,请检查您的内核的年龄,并且很可能考虑升级。

另外,我怀疑您使用的是旧版本的 Gatling,因为现代版本不在 Linux 上使用 Java NIO。您应该升级(截至目前最新的是 3.5.1)


推荐阅读