Gatling工具抛出GC Overhead limit超出

时间:2016-05-05 16:24:08

标签: gatling

我正在尝试运行使用Gatling工具中的Feed方法的负载测试。目前,当我们使用大小 3.5GB 的文件(有600000条记录)时,Gatling失败,例外如下: 模拟LoadTestSimulation开始......

线程中的异常" main" java.lang.OutOfMemoryError:超出了GC开销限制     at java.util.Arrays.copyOf(Arrays.java:2367)     at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)     at 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(Iterator.scala:742)     在scala.collection.AbstractIterator.foreach(Iterator.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)     at io.gatling.core.Predef $ .feederBuilder(Predef.scala:32)     在io.gatling.core.feeder.FeederSupport $ class.separatedValues(FeederSupport.scala:38)     at io.gatling.core.Predef $ .separatedValues(Predef.scala:32)     在io.gatling.core.feeder.FeederSupport $ class.separatedValues(FeederSupport.scala:35)     at io.gatling.core.Predef $ .separatedValues(Predef.scala:32)     在io.gatling.core.feeder.FeederSupport $ class.tsv(FeederSupport.scala:32) :gatling FAILED

我们正在使用使用这些参数的gradle gatling任务 - -PjvmArgs = -Dbroker = brokerhost:9092 -Dtopic = -Dusers = 100 -Dduration_in_mins = 2 -Dinput_file_name = -Psim =&#34; LoadTestSimulation&#34;。< / p>

val scn = scenario(&#34; Demo&#34;)     .feed(tsv(inputFileName,true).circular)     .exec(卡夫卡(&#34;请求&#34)     .sendString,字符串)

设置(     scn.inject(constantUsersPerSec(users.toDouble)期间(duration.toInt分钟))       //scn.inject(rampUsers(500)超过(200秒))       .protocols(kafkaConf)) }

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

1 个答案:

答案 0 :(得分:1)

您正在使用TSV,即制表符分隔文件进纸器。这是官方文件所说的:

  

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

或更好:

  

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

有关详细信息,请参阅CSV Feeders

你“可以”做的是尝试增加足够的内存以允许JVM和GC在内存中的这个“巨大”文件上运行,我认为由于你的例外原因而无法工作(参见更多{{3} })

所以我想你唯一的选择就是编写自己的进纸器,它可以即时读取文件中的数据。