【问题标题】:Gatling tool throws GC Overhead limit exceededGatling 工具抛出 GC Overhead limit exceeded
【发布时间】:2016-08-31 12:47:47
【问题描述】:

我正在尝试运行使用 Gatling 工具中的 feed 方法的负载测试。目前,当我们使用一个大小约为 3.5GB 且有 600000 条记录的文件时,Gatling 会失败,但异常如下: 模拟 LoadTestSimulation 开始...

线程“主”java.lang.OutOfMemoryError 中的异常:超出 GC 开销限制 在 java.util.Arrays.copyOf(Arrays.java:2367) 在 java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130) 在 java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114) 在 java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:535) 在 java.lang.StringBuffer.append(StringBuffer.java:322) 在 java.io.BufferedReader.readLine(BufferedReader.java:351) 在 java.io.BufferedReader.readLine(BufferedReader.java:382) 在 scala.io.BufferedSource$BufferedLineIterator.hasNext(BufferedSource.scala:72) 在 scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:369) 在 scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:369) 在 scala.collection.Iterator$class.foreach(Ite​​rator.scala:742) 在 scala.collection.AbstractIterator.foreach(Ite​​rator.scala:1194) 在 scala.collection.generic.Growable$class.$plus$plus$eq(Growable.scala:59) 在 scala.collection.immutable.VectorBuilder.$plus$plus$eq(Vector.scala:732) 在 scala.collection.immutable.VectorBuilder.$plus$plus$eq(Vector.scala:708) 在 scala.collection.TraversableOnce$class.to(TraversableOnce.scala:308) 在 scala.collection.AbstractIterator.to(Iterator.scala:1194) 在 scala.collection.TraversableOnce$class.toVector(TraversableOnce.scala:304) 在 scala.collection.AbstractIterator.toVector(Iterator.scala:1194) 在 io.gatling.core.feeder.SeparatedValuesParser$$anonfun$parse$1.apply(SeparatedValuesParser.scala:34) 在 io.gatling.core.feeder.SeparatedValuesParser$$anonfun$parse$1.apply(SeparatedValuesParser.scala:33) 在 io.gatling.core.util.IO$.withSource(IO.scala:152) 在 io.gatling.core.feeder.SeparatedValuesParser$.parse(SeparatedValuesParser.scala:33) 在 io.gatling.core.feeder.FeederSupport$$anonfun$separatedValues$1.apply(FeederSupport.scala:38) 在 io.gatling.core.feeder.FeederSupport$$anonfun$separatedValues$1.apply(FeederSupport.scala:38) 在 io.gatling.core.feeder.FeederSupport$class.feederBuilder(FeederSupport.scala:46) 在 io.gatling.core.Predef$.feederBuilder(Predef.scala:32) 在 io.gatling.core.feeder.FeederSupport$class.separatedValues(FeederSupport.scala:38) 在 io.gatling.core.Predef$.separatedValues(Predef.scala:32) 在 io.gatling.core.feeder.FeederSupport$class.separatedValues(FeederSupport.scala:35) 在 io.gatling.core.Predef$.separatedValues(Predef.scala:32) 在 io.gatling.core.feeder.FeederSupport$class.tsv(FeederSupport.scala:32) :gatling 失败

我们正在使用使用这些参数的 gradle gatling 任务 - -PjvmArgs=-Dbroker=brokerhost:9092 -Dtopic= -Dusers=100 -Dduration_in_mins=2 -Dinput_file_name= -Psim="LoadTestSimulation"。

val scn = 场景(“演示”) .feed(tsv(inputFileName, true).circular) .exec(卡夫卡(“请求”) .sendString,String)

设置( scn.inject(constantUsersPerSec(users.toDouble) during (duration.toInt minutes)) //scn.inject(rampUsers(500) over (200 seconds)) .protocols(kafkaConf)) }

任何建议或提示,我们是否应该将文件拆分为多个文件并运行而不是传递这么大的文件, 这个文件会立即加载到内存中吗?

【问题讨论】:

    标签: gatling


    【解决方案1】:

    您正在使用 TSV,即制表符分隔的文件馈送器。官方文档是这样说的:

    这些内置函数返回 RecordSeqFeederBuilder 实例,意味着整个文件被加载到内存中并被解析,因此在模拟运行期间生成的馈线不会在磁盘上读取。

    或更好:

    在内存中加载 feeder 文件会占用大量堆,预计与文件大小的比例为 5 到 10 倍。这是由于 JVM 的内部 UTF-16 字符编码和对象头开销造成的。 如果内存对您来说是个问题,您可能需要动态读取文件系统并构建自己的 Feeder。

    欲了解更多信息,请参阅CSV Feeders

    您“可以”做的是尝试增加足够的内存以允许 JVM 和 GC 对内存中的这种“巨大”文件进行操作,我认为由于您的异常原因,这将无法工作(请参阅更多 here

    所以我猜你唯一的选择是编写你自己的馈线,它可以从文件中动态读取数据。

    【讨论】:

    • 将文件拆分成更小的文件然后运行有意义吗?
    • 视情况而定,我不知道您的情况,因此我无法告诉您您的测试是否可以拆分并按顺序进行测试。但我认为处理大量文件并编写逻辑将它们作为馈线进行协调与编写自己的馈线具有相似的复杂性。
    猜你喜欢
    • 2018-06-03
    • 2019-12-28
    • 2012-06-09
    • 2015-11-30
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多