JMeterBeanShellサンプラヌを忘れる

Jmeterで暙準のテスト蚈画芁玠を䜿甚するず、すべおではなく倚くのこずができたす。 機胜を拡匵し、より耇雑なロゞックを実装するには、BeanShell Samplerを䜿甚するのが慣習です。これは、䞖界䞭で歎史的に䜕らかの圢で開発されおきたした。 そしお䞖界䞭で圌らは定期的にこれに苊しんでいたすが、サボテンを食べ続けおいたす。



圌なしではどうですか



原則ずしお、ロヌドステヌション自䜓のパフォヌマンスに関しお最高の結果を埗るには、Javaリク゚ストを実装するか、独自のサンプラヌを䜜成するこずも最も効果的です。 しかし、個人的に、私はこの゜リュヌションが奜きではありたせん



だから私はい぀もそのような決定を避けようずしたしたそしお今のずころ避けたした。 個人的には、コヌドがテスト蚈画自䜓に含たれおいるずきに気に入っおおり、JMeterを䜿甚しおこのコヌドを実行するのにかかる時間を远跡できたす。 この意味で、BeanShellサンプラヌアプロヌチ自䜓は非垞に䟿利であり、実装のみが悪いです。 理由を説明したす。



悪いBeanShellサンプラヌずは







BeanShell Samplerのコヌド挿入を䜿甚しお、高床にロヌドされたテスト蚈画を開発したした。 開発段階ではすべお順調でしたが、負荷テストの詊甚を開始するず、非垞に䞍快な動䜜が発生したした。 特定の数のスレッドでは、すべおが正垞に機胜したした。 しかし、スレッド数の増加に䌎い、いく぀かの䞍十分さが始たりたした。 このテストでは、タヌゲットの負荷匷床が倧幅に䞍足しおおり、レポヌトでは、個々のBeanShellサンプルの凊理時間が数十秒に達したこずが瀺されたした。 さらに、BeanShellサンプラヌは非垞に少なく、スレッドグルヌプごずに1぀たたは2぀であり、そこで耇雑なこずが起こったずは蚀いたせん。 ロヌドステヌション自䜓のパフォヌマンスパラメヌタヌを調べおも問題は芋぀かりたせんでした。CPU負荷は20〜30で、JMeterプロセスに十分なメモリがあり、ガベヌゞコレクタヌはタむムリヌにクリヌンアップしたした。 問題がJMeterのプログラムコヌド自䜓たたはBeanShellむンタヌプリタヌの実装にあるこずは明らかです。 Daw Reset bsh.Interpreterで遊んでも䜕も埗られたせん。 それだけではありたせん。ある堎所では、メモリオヌバヌランがないようにむンストヌルする方が良いず曞いおおり、別の堎所では、パフォヌマンス䞊の理由で削陀する方が良いず曞いおいたす。

そのような問題に関するメッセヌゞは、JMeterフォヌラムで時々芋られ、Apache JMeter Userメヌリングリストに茉っおいたす。 同僚も䞀郚のテストの動䜜に぀いお䞍満を述べおいたしたが、問題はツヌル自䜓に起因する傟向がありたした。



どうする



JMeterには、JSR223サンプラヌず呌ばれる非垞によく䌌たサンプラヌがありたす。 サンプラヌだけでなく、ファミリヌ党䜓サンプラヌ、タむマヌ、プリプロセッサヌずポストプロセッサヌ、アサヌション、タむマヌ、リスナヌ。 そのサンプラヌは、このサンプラヌが倧幅なパフォヌマンスの改善を達成するずいう非垞に心匷い蚀葉で始たりたす。 しかし、泚意深い読者はすぐに動揺したす。この効果を達成するには、コンパむルをサポヌトするスクリプト゚ンゞンを遞択する必芁がありたす。 そのすぐ近くで、Java゚ンゞンがそうではないこずが瀺されおいたす。

Javaに぀いおは、さらに蚀いたす。BeanShellず同じ゚ンゞンで実装されおいたす。 これは、実行可胜コヌドで゚ラヌを発生させるこずで簡単に確認できたす。 ログの䟋倖スタックで、bshむンタヌプリタヌがそこずそこの䞡方で呌び出されおいるこずがわかりたす。 したがっお、JSR223 / javaずBeanShell Samplerの間にたったく違いはありたせん。 他の゚ンゞンに぀いおは䜕も蚀われおいたせんが、それらもすべお解釈されたす。 したがっお、暙準のJMeterパッケヌゞには、コンパむルによっお利益を埗るこずができる゚ンゞンはありたせん。

ドキュメントで蚀及されおいる唯䞀のコンパむル枈みスクリプト゚ンゞンはGroovyです。 JSR223をサポヌトする他の゚ンゞンがありたす。 私はScalaを詊しおみたしたが、この束がいかにゆっくりず動いおいるかを恐れ、このトピックをより良い時たで残したした。 泚ここでのポむントはおそらくScalaではなく、JSR 223暙準の実装ずCompilableむンタヌフェヌスの実装です。

Groovyサポヌトを有効にするには、プロゞェクトのWebサむトたたはこちらからバむナリの最新バヌゞョンをダりンロヌドする必芁がありたす 。 アヌカむブから必芁なファむルは、embeddable \ groovy-all- {version} .jarの1぀だけです。 Zhimetrのlibフォルダヌに解凍したす。 プログラムを再起動するず、利甚可胜なJSR223蚀語のリストにGroovyが衚瀺されたす。







JSR223 + Groovyでのテスト蚈画のすべおのBeanShellサンプラヌを䜜り盎した埌、奇跡が起こりたしたすべおが正垞に正垞に、たたは少なくずもプログラミングしたずおりに動䜜し始め、ブレヌキなしでCPU負荷がさらに䜎くなりたした。 JSR223サンプラヌの応答時間は桁違いに短くなり、テストは必芁な負荷に達したした。



Groovyパフォヌマンス



始めに戻った堎合-远加の゜フトりェアロゞックを実装するさたざたな方法-Groovyを䜿甚した゜リュヌションは、実際にパヌセンテヌゞを絞る必芁がある堎合を陀き、ほずんどすべおの堎合に十分なはずです。 Groovyスクリプトは、通垞のJavaバむトコヌドにコンパむルされ、ネむティブJavaコヌドであるかのように各スレッドのコンテキストで実行されたすただし、独自のコンパむラヌがあり、゚ンゞンを呌び出すためのオヌバヌヘッドがただあるこずに泚意しおください。 Blazemeterの関係者は、さたざたな実装オプションの速床を比范し、Groovyコヌドの速床はpure Javaのコヌドに比べおわずかに劣るずいう結論に達したした。

私も少し実隓をしたした。 敎数挔算で人工的な蚈算を実行する小さなフラグメントを䜜成したした。



int i; int s = Integer.parseInt(Parameters); for (i = 1; i < 10000; i++) { s += i * (i % 2 * 2 - 1); } log.warn(s.toString());
      
      







入力デヌタパラメヌタヌずログぞの䟝存性は、念のために远加されたした。これは、実行を完党に陀倖したり、結果をキャッシュしたりする、トリッキヌなコンパむラヌずむンタヌプリタヌがコヌドを最適化するのを防ぐためです。 さらに、パラメヌタもナニヌクでした。 1000反埩の100スレッドを備えたCore i7を搭茉したラップトップでは、各結果は次のずおりでした。



実装 スルヌプット

Beanshellサンプラヌ 〜20 /秒

JSR223 +java | beanshell | bsh 〜20 /秒

JSR223 + Groovy 〜13800 /秒



Groovyのギャップは非垞に倧きいため、信じるこずすら困難ですが、ログから刀断するず、すべおが正垞に機胜しおいたした。



GroovyのサブセットずしおのJava


Groovyの倧きな利点は、95のケヌスで、任意のJavaコヌドが有効なGroovyコヌドであるこずです。 BeanShell構文でさえ、珟圚のJava暙準からさらに離れおいたすたずえば、BeanShellでは、任意の数の匕数を䜿甚しお関数を呌び出す堎合は、倉曎する必芁がありたす。 珟時点ですべおの可胜性を孊習するこずに興味がない堎合は、その必芁はありたせん。 䞀方、あなたがそれをマスタヌすれば、あなたは確実にあなたの効果を高めるこずができるでしょう。



bsh.shared


BeanShellでグロヌバル名前空間bsh.sharedを䜿甚した堎合、小さな埅ち䌏せがありたす。Groovyにはこの皮のものは䜕もありたせん。 幞いなこずに、この問題は自分で簡単に解決できたす。 このために、10行のコヌドが蚘述されおいたす。



 import java.util.concurrent.ConcurrentHashMap; public class SharedHashMap { private static final ConcurrentHashMap instance = new ConcurrentHashMap(); public static ConcurrentHashMap GetInstance() { return instance; } }
      
      





実際、これはシングルトンであり、垞に各スレッドに察しお同じオブゞェクトを返したす。 さらに、jarに収集され、Zhimetrのlibフォルダヌに配眮されたす。 クラスはグロヌバル名前空間で宣蚀されおいるのでそう、これは非難されたす、Groovyコヌドではむンポヌトせずに、SharedHashMapを䜿甚しおそこに䜕かを眮くこずができたす。



 //     hash map. sharedHashMap = SharedHashMap.GetInstance() //   -. sharedHashMap.put('Counter', new java.util.concurrent.atomic.AtomicInteger())
      
      





あなたが拟う必芁があるずき、同様に



 sharedHashMap = SharedHashMap.GetInstance() // * counter = sharedHashMap.get('Counter') counter.incrementAndGet() //..
      
      





* Groovyは、セミコロンず同様に倉数の型を宣蚀する必芁はありたせん。



BeanShell Samplerを䜿甚した移行


すでに倚くのBeanShellサンプラヌが含たれおいるテスト蚈画が既にあり、問題があるためにこの蚘事を芋぀けたずしたす。 Groovyに切り替えたす。 Groovy接続は䞊蚘で説明されおおり、5分以内に完了したす。

たず、JSR223サンプラヌを䜜成し、BeanShellからコヌドを転送したす。 コヌドを統合し、[ファむル名]フィヌルドで指定するこずで別のファむルで遞択できる堎合、生掻を倧幅に簡玠化できたす。 次に、コピヌ/貌り付けを䜿甚しお、JSR223サンプラヌを適切な堎所に貌り付けるだけです。 そうでない堎合は、それぞれの堎合にBeanShellからコヌドをコピヌしたす。



キャッシングキヌ


ここで重芁なのは、JMeterがサンプラヌ自䜓に入力されたコヌドをコンパむルするのは、コンパむルキヌが指定されおいる堎合のみですCompilation Cache Keyフィヌルド。 テスト蚈画内で䞀意の行である必芁がありたす。 ファむルを介しお接続されたスクリプトの堎合、ファむルぞのフルパスを䜿甚するため、コンパむルキヌを入力する必芁はありたせん。



JavaずGroovyの文字列


Groovy構文には埮劙な点が1぀ありたす。 たず、2皮類の文字列がありたす。



詳现はこちらをご芧ください。 Groovyストリングには、$ {expression}などの匏を䜿甚する機胜がありたす。この匏は、ストリング内で匏倀に自動的に展開されたす。 これは非垞に䟿利なポむントですが、意倖にもJMeter倉数を参照する構文ず䞀臎したす。 だからGroovyで曞くず



 currId = 123 log.info("Current ID: ${currId}")
      
      





同時に、currIdずいう名前の通垞のJMeter倉数が珟圚のスレッドで定矩され、その倀がスクリプトに盎接代入されたす。 たた、1回眮換されたす。 その埌、コヌドがコンパむルされ、結果がキャッシュされたす。 したがっお、このような匏で䜿甚される倉数名がJMeter倉数ず重耇しないようにする必芁がありたす。 たた、本圓に倀をJSR223サンプラヌに枡す必芁がある堎合は、このためにParametersフィヌルドを䜿甚する必芁がありたす。







倖郚ファむルを゜ヌスコヌドずしお䜿甚する堎合、JMeter倉数眮換は発生したせんフィヌルドでのみ発生したすが、パラメヌタヌを䜿甚できたす。

Groovy文字列の機胜を䜿甚する予定がない堎合は、Java文字列を䜿甚するこずをお勧めしたす぀たり、単䞀匕甚笊で囲みたす。 たた、パフォヌマンスは向䞊したすが、もちろん1ペニヌです。



おわりに



BeanShellサンプラヌの動䜜は、䞀般的なむンタヌプリタヌの問題、぀たりむンタヌプリタヌコヌドの速床が遅いこずを瀺しおいたす。 BeanShellに数行しかない堎合は、おそらく問題に気付かないでしょうが、倚くのコヌドがある堎合やルヌプがある堎合には間違いなく気付くでしょう。 LoadRunnerむンタヌプリタヌでもたったく同じ問題が芳察されたした。

これたでにBeanShellを䜿甚したテストの実行に問題がなかった堎合は、今埌安党にプレむし、自分でテストを䜜成しないこずをお勧めしたす。 代わりに、JSR223 + Groovyをすぐに䜿甚するこずをお勧めしたす。これにより、ロヌドステヌションでパフォヌマンスの問題が発生する可胜性が䜎くなりたす。



蚘事から取り出す重芁なポむント。




All Articles