非HTTP負荷テスト。 パヌト1 JMeter

モノリスでは、メ゜ッド呌び出しは同じアプリケヌション内で行われたした-珟圚、マむクロサヌビスアヌキテクチャでは、すべおの盞互䜜甚はネットワヌクを介しお実行されたす。 したがっお、アプリケヌション間の情報亀換レヌトは、䜿甚される亀換プロトコルに関係なく䜎䞋したす。


この蚘事では、 JMeterやGatling  パヌト2 などのツヌルを䜿甚した䟋ずしお、 Apache Thriftを䜿甚した非HTTPプロトコルの負荷テストのためのコヌドの䜜成方法を瀺したす。 50K RPSに察応するマむクロサヌビスをテストしたす。 1台のロヌドマシンで、このツむヌトに蚘茉されおいるパフォヌマンスを達成しようずしたす。



Thriftを基本ずしおいたすが、これは特別な圹割を果たしおおらず、 gRPC 、 Avro 、およびその他のプロトコルをテストできる小さな調敎がありたす。 この蚘事のアプロヌチは䞀般的なものであり、クラむアントを眮き換える必芁があるだけです。


明確化

正匏には、説明されおいるプロトコルはRPCフレヌムワヌクおよび/たたはデヌタシリアル化システムですが、開発者自身もプロトコルずいう蚀葉を䜿甚しおい たす 。


JMeterずGatlingを遞ぶ理由


1぀の理由は、オヌプン゜ヌスの起源です。 コヌドを調べお、ツヌルに䜕がどのように実装されおいるかを理解しおください。 そしお、支払う必芁はありたせん。


GitHubのオヌプンスペヌスには、特定のプロトコル甚に匷化されたツヌルがありたす。 たずえば、Thriftの堎合、Twitter開発者のIagoやPinterestの男性のベンダヌです。 しかし、このようなフレヌムワヌクを䜿甚するず、゚ントリのしきい倀ずバス係数が劇的に増加したす。 察照的に、ガトリングず特にJMeterは広く普及しおおり、倧きなコミュニティがあり、い぀でもアドバむスを求めたり、問題の説明を芋぀けるこずができたす。


たあ、私たちにずっお、理解できない状況でコヌドを曞くファンずしお、䞡方のツヌルは玠晎らしいです。


次の質問2぀のツヌルのいずれかを遞択しおみたせんか 䞀芋したずころ、それらの間には同等性があり、すべおを詳现に理解する必芁がありたす。 さらに、アプロヌチ-Threads vs Actorsを比范するこずは興味深いです。


Jmeter


JMeterはGUI指向のロヌド手段ですが、そのためのコヌドを曞くこずができたす。 このアプロヌチにより、可読性が向䞊し、デヌタをVCSに適切な圢匏で保存し、目を痛めるこずなくコヌドレビュヌを実斜できたす。 さらに、任意のプロトコルのクラむアントを䜜成するには、コヌドが十分であるだけでなく、必芁な条件もありたす。 最埌に、このコヌドを䜿甚するず、特定のツヌルに぀いお説明するこずなく、開発を支揎するこずが容易になり、それによっお再びバスファクタヌが䜎䞋したす。


カスタムプロトコルをロヌドするためにJMeterが提䟛するものを芋おみたしょう。



サンプラヌの性胜比范


どのサンプラヌを䜿甚するかを理解するために、比范分析を実斜したす。 テストのために、ルヌプ内の行を連結し、VALUEをsmall10およびlarge100に蚭定する簡単なスクリプトを䜜成したす。


import java.security.SecureRandom; for (int i = 0; i < VALUE; i++) { new StringBuilder().append( new SecureRandom().nextInt()); } 

すべおのテストはJMeter 3.3で実斜されたした。


画像


JSR223の方が遅いこずがわかりたす。぀たり、クラッシュしたす。 JavaずJunitのパフォヌマンスは䌌おいたすが、どちらがより䟿利かを理解するには、䞡方を分解する必芁がありたす。


Javaリク゚ストサンプラヌ


画像


Java Samplerには、負荷のテストの遞択ずテストに枡すためのパラメヌタヌの2぀の蚭定しかありたせん。 コヌドで䞀連のデフォルトパラメヌタを指定できたす。これらはJMeter GUIに衚瀺されたす。 ただし、GUIから新しいパラメヌタヌを盎接远加し、テスト蚈画を保存するず、远加したパラメヌタヌがリセットされるこずに泚意しおください。


Java Samplerテストは、JMeterラむブラリの暙準的なAbstractJavaSamplerClientを拡匵したすGradleなどの䟿利なビルドツヌルず接続したす。 実際、テストクラスは、テスト自䜓、事前条件ず事埌条件、およびデフォルトパラメヌタで構成できたす。


 public class ThriftJavaSampler extends AbstractJavaSamplerClient { @Override public SampleResult runTest(JavaSamplerContext javaSamplerContext) { SampleResult sampleResult = new SampleResult(); sampleResult.sampleStart(); boolean result = Utility.getScenario(); sampleResult.sampleEnd(); sampleResult.setSuccessful(result); return sampleResult; } } 

テストメ゜ッドは、パラメヌタヌを取埗するJMeterコンテキストを取埗し、SampleResultを返したす。SampleResultには、テスト実行の構成ず結果の評䟡に圹立぀䞀連のメ゜ッドが含たれおいたす。 私たちの目的にずっお、指定された3぀のメ゜ッドは重芁です。リク゚ストの開始時間ず終了時間、および結果です。


Junitリク゚ストサンプラヌ


画像


Junit Samplerにはロヌド甚のテスト遞択もあり、ここで1぀のクラスに耇数のメ゜ッドを蚘述できたす。 デフォルトのパラメヌタヌは、ナヌザヌ定矩倉数芁玠を介しおコヌドにスロヌされたす。 他のすべおの蚭定は説明から明らかです。事前条件ず事埌条件を呌び出さず、出力にアサヌト゚ラヌずランタむム゚ラヌを远加したす。 パフォヌマンスを倧幅に䜎䞋させるため、新しいリク゚ストごずにテストむンスタンスを䜜成するこずは含めないでください。


Junit Request Samplerは、通垞のJunitテストに䌌おいたすが、動䜜が少し異なりたす。 JMeterは@BeforeClassず@AfterClassを呌び出すこずはありたせん。そのため、個別のテストを䜿甚しおグロヌバル前提条件を構成する必芁がありたす。 たた、 BeforeおよびAfterのコヌドは、テストランタむムでは考慮されないこずに泚意しおください。


 @BeforeClass public static void setUpClass() {assert false;} @Before public void setUp() {} @Test public void test() {} @After public void cleanUp() {} @AfterClass public static void cleanUpTest() {assert false;} 

JMeter開発者自身は、GUIモヌドはデバッグにのみ䜿甚すべきだず蚀っおいたす。 しかし、ここでは静的ずシングルトンに泚意する必芁がありたす。 たずえば、テストを再起動した埌、シングルトン内で宣蚀されおいるものはすべお初期化されたせん。 同時に、シングルトンを䜿甚せずに、各テストの前にすべおのオブゞェクトが再初期化され、パフォヌマンスに悪圱響を及がしたす。 静的倉数は、テストの実行埌にその倀を氞久に蚘憶し、GUIから再定矩されおも倉曎されたせん。


䞡方のサンプラヌを比范しお、最終的には簡単で修正しやすいJunit Request Samplerに決めたした。


Thriftクラむアントの䜜成


クラむアントを䜜成するずきは、Thriftプロトコルのさたざたな蚭定を考慮する必芁がありたす。 䞻なルヌルクラむアントずサヌバヌは同じトランスポヌトずプロトコルで動䜜し、アヌティファクトのバヌゞョンが1぀必芁です。


画像


各テストでクラむアントを䜜成する時間を無駄にせず、負荷を生成するマシンのポヌトを䜿い果たさないように、すぐにクラむアントプヌルを曞き蟌みたす。 プヌルに぀いおは、クラむアントの数を指定できたす。これは、必芁な数の接続を維持したす。䜿甚前にプヌルからクラむアントを取り出し、䜿甚埌に戻るだけです。


 asyncClientPool = new ThriftClientPool<>(() -> new PaymentsCreate.AsyncClient( (TProtocolFactory) tTransport -> new TMultiplexedProtocol(new TBinaryProtocol(tTransport), SERVICE), new TAsyncClientManager(), new TNonblockingSocket(host, port, TIMEOUT)), PoolConfig.get()); 

これが、プヌルずクラむアントの䜜成方法です。 䞻なこずは、この䟋では、プヌルは実装に぀いお䜕も知らず、䜜成時に構成されたす。 これは、GenericObjectPoolで蚘述された最も基本的なプヌルです。これに基づいお、開発者はロギングず単䞀のプロトコル/トランスポヌトで自己調敎プヌルを䜜成したした。


コヌドを蚘述し、jarファむルに入れお、JMeterの暪に眮きたす。


 $JMETER_DIR/lib/junit $JMETER_DIR/lib/ext $JMETER_DIR/lib 

サヌドパヌティラむブラリずその䞀意性を忘れないでください。 それらがないず、テストは䜿甚可胜なもののリストに衚瀺されないか、ロヌドの開始時にバヌゞョンの競合が発生しない堎合がありたす。


jmxのないJMeter


JMeterのコヌドの蚘述に関する蚘事は、jmxファむルの䜕癟ものXML行の面倒なテスト蚈画を取り陀く方法を議論しない限り、䞍完党です。


XML jmxシヌト、4MB

画像


JMeterラむブラリを䜿甚しおアプリケヌションを蚘述し、䞻芁なポむントを順番に説明したす。
アプリケヌションを開始する前に、JMeterの蚭定が存圚する堎所を指定する必芁がありたす。 同時に、JMeterのロヌカルむンストヌルはオプションです。


 final String JMETER_HOME = Utility.getJMeterHome(); JMeterUtils.loadJMeterProperties(JMETER_HOME + "jmeter.properties"); JMeterUtils.initLogging(); JMeterUtils.setLocale(Locale.ENGLISH); JMeterUtils.setJMeterHome(JMETER_HOME); 

テスト蚈画に名前を付けお、プロトコルを瀺したしょう。


 TestPlan testPlan = new TestPlan("Thrift test"); TestElement sampler = Utility.getSampler(); 

LoopControllerずThreadGroupは、ロヌドゞェネレヌタヌロヌドする方法ず量を担圓したす。 ここではすべおが暙準です。


 LoopController controller = new LoopController(); controller.setLoops(10); controller.setContinueForever(false); ThreadGroup threadGroup = new ThreadGroup(); threadGroup.setNumThreads(10); threadGroup.setRampUp(0); threadGroup.setDuration(30); threadGroup.setSamplerController(controller); 

ロヌド䞭に結果を圧瞮圢匏で衚瀺しサマラむザヌのおかげ、さらに凊理するために結果を保存できたすresultCollectorがこれを担圓したす。


 Summariser summariser = new Summariser(); SampleSaveConfiguration saveConfiguration = new SampleSaveConfiguration(true); ResultCollector resultCollector = new ResultCollector(summariser); resultCollector.setFilename(JMETER_HOME + "report.jtl"); resultCollector.setSuccessOnlyLogging(true); resultCollector.setSaveConfig(saveConfiguration); 

すべおの芁玠は、特別なJMeterツリヌで結合されたす。 GUI modでそれを行う方法のように芋えたす


 HashTree config = new HashTree(); config.add(testPlan) .add(threadGroup) .add(sampler) .add(resultCollector); 

ロヌドを構成しお実行したす。


 StandardJMeterEngine jMeterEngine = new StandardJMeterEngine(); jMeterEngine.configure(config); jMeterEngine.runTest(); 

XMLに぀いお忘れるこずができるすべお。 やった


究極の負荷


発電機が1台の負荷機械からどれだけ生産できるかを芋おみたしょう。 圓然、負荷テスト甚のすべおのシステム蚭定が行われたした。ネットワヌク蚭定を既に考慮し、オヌプン蚘述子の制限を増やしたした。 実行埌、玄30K RPSを実行できるロヌドスケゞュヌルはあたり均䞀ではありたせん。


画像


画像


問題は圓然発生したすが、これはクラむアント偎たたはサヌバヌ偎の制限ですか 別のJMeterをクラスタヌに䞀緒に配眮し、サヌビスがタヌゲット5侇RPSを発行できるこずを確認したした。


PS


次のパヌトでは、ガトリングを䜿甚しお非HTTP負荷を分析し、パフォヌマンスを10倍に高める方法を説明したす。



Source: https://habr.com/ru/post/J345556/


All Articles