2016-05-05 20 views
0

ガットリングツールにあるフィードメソッドを使用する負荷テストを実行しようとしています。現在、我々は600000件のレコードを持っている3.5ギガバイト周りサイズであるファイルを使用する場合、ガトリングは、以下のような例外で失敗: シミュレーションLoadTestSimulationはスレッド「メイン」java.lang.OutOfMemoryErrorを中...ギャングツールがGCオーバーヘッドの上限を超過しました

例外を開始しました:GCオーバーヘッドの上限が、java.util.Arrays.copyOf(Arrays.java:2367)の を超えました。 at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130) at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java :114) at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:535) at java.lang.StringBuffer.append(StringBuffer.java:322)scala.io.BufferedSource $ BufferedLineIterator.hasNext(:72 BufferedSource.scala)でjava.io.BufferedReader.readLine(BufferedReader.java:382)でjava.io.BufferedReader.readLine(BufferedReader.java:351) でスケーラの$$ anon $ 11.hasNext(Iterator.scala:369) をscala.collection.Iterator $ classにあるscala.collection.Iterator $$ anon $ 11.hasNext(Iterator.scala:369) にある に配置します。 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)(TraversableOnce.scala:308) at scala.collection.AbstractIterator.to(Iterator.scala:1194) at scala.collection.TraversableOnce $ class.toVector(TraversableOnce.scala:308) (Iterator.scala:1194) io.gatling.core.feeder.SeparatedValuesParser $$ anonfun $ parse $ 1.apply(SeparatedValuesParser.scala:34) at io.gatling。 io.gatling.core.util.IO $ .withSource(IO.scala:152) (io.gatling.core.feeder)の でcore.feeder.SeparatedValuesParser $$ anonfun $ parse $ 1.apply(SeparatedValuesParser.scala:33) .SeparatedValuesParser $ .parse(SeparatedValuesParser.scala:33) io.gatling.core.feeder.FeederSupport $$ anonfun $ separatedValues $ 1.apply(FeederSupp ort.scala:38) io.gatling.core.feeder.FeederSupport $$ anonfun $ separatedValues $ 1.applyで(FeederSupport.scala:38) io.gatling.core.feeder.FeederSupport $ class.feederBuilderで(FeederSupport。スケーラ:46) 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) at io.gatling.core.feeder.FeederSupport $ class.tsv(FeederSupport.scala:32) :ギャトリングFAILED

これらのパラメータを使用するgradle gatlingタスクを使用しています。-PjvmArgs = -Dbroker = brokerhost:9092 -Dtopic = -Dusers = 100 -Dduration_in_mins = 2 -Dinput_file_name = -Psim = "LoadTestSimulation"

ヴァルのSCN =シナリオ( "デモ") .feed(TSV(inputFileName、真).circular) .exec(カフカ( "要求") .sendString、String)を

セットアップ( SCN .inject(constantUsersPerSec(ユーザー。中toDouble)(オーバーduration.toInt分)) //scn.inject(rampUsers(500)(200秒)) .protocols(kafkaConf)) }

任意の提案やヒントが、私たちは、ファイルを分割する必要がありますそのような大きなファイルを渡す代わりに複数のファイルに移動して実行すると、 このファイルは一度にメモリにロードされますか?

答えて

1

TSV、つまりタブで区切られたファイルフィーダを使用しています。

​​

以上:

Loading feeder files in memory uses a lot of heap, expect a 5-to-10-times ratio with the file size. This is due to JVM’s internal UTF-16 char encoding and object headers overhead. If memory is an issue for you, you might want to read from the filesystem on the fly and build your own Feeder.

詳細情報についてはCSV Feedersを参照これは、公式ドキュメントが言うことです。

あなたができることは、JVMとGCがメモリ内のそのような "巨大な"ファイルで動作するのに十分なメモリを増やそうとすることです。例外の理由により動作しないと思います(hereを参照)

あなたの唯一の選択肢は、オンザフライでファイルからデータを読み取る独自のフィーダーを書くことだと思います。

+0

ファイルを小さなファイルに分割して実行しても意味がありますか? – user1459742

+0

それはあなたのシナリオを知らないので、テストするものを分割して順次テストすることができるかどうかはわかりません。しかし、私は、多くのファイルを処理し、ロジックを書くことは、フィーダーが自分のフィーダーを書くことと同様の複雑さを持っていると考えていると思います。 – Teliatko

関連する問題