我正在尝试运行使用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)) }
任何建议或提示,我们应该将文件拆分为多个文件并运行而不是传递这样大的文件, 这个文件会立刻加载到内存中吗?
答案 0 :(得分:1)
您正在使用TSV,即制表符分隔文件进纸器。这是官方文件所说的:
这些内置函数返回RecordSeqFeederBuilder实例,表示整个文件已加载到内存中并进行解析,因此在模拟运行期间生成的馈送器不会在磁盘上读取。
或更好:
在内存中加载进纸器文件会占用大量堆,预计文件大小的比例为5到10倍。这是由于JVM的内部UTF-16字符编码和对象标头开销。 如果内存对您来说是个问题,您可能需要动态阅读文件系统并构建自己的Feedder。
有关详细信息,请参阅CSV Feeders。
你“可以”做的是尝试增加足够的内存以允许JVM和GC在内存中的这个“巨大”文件上运行,我认为由于你的例外原因而无法工作(参见更多{{3} })
所以我想你唯一的选择就是编写自己的进纸器,它可以即时读取文件中的数据。