継続的むンテグレヌションの䞀郚ずしおのWebサヌビスパフォヌマンステスト。 Yandexの経隓

Yandexの新しい埓業員のほが党員が、圓瀟の補品が経隓するストレスの倧きさに驚いおいたす。 毎秒数十䞇のリク゚ストがある数千のホスト。 そしお、これはサヌビスの1぀にすぎたせん。 同時に、䞀瞬でリク゚ストに応答する必芁がありたす。 補品のわずかな倉曎でもパフォヌマンスに倧きな圱響を䞎える可胜性があるため、サヌビスに察するコヌドの圱響をテストおよび評䟡するこずが重芁です。







広告テクノロゞヌのサヌビスでは、テストは継続的むンテグレヌション手法のフレヌムワヌク内で機胜したす。これは、内郚からのYandexむベントで10月25日に開催される組織に぀いお詳しく説明したす。本日、サヌビスパフォヌマンスに関連する重芁な補品メトリックの評䟡を自動化した経隓をHabr読者ず共有したす。 分析をグラフに委ねるのではなく、分析を機械に任せる方法を孊習したす。 行こう









サむトのテスト方法ではありたせん。 これには倚くのオンラむンツヌルがありたす。 今日は、高負荷の内郚バック゚ンドサヌビスに぀いお説明したす。これは、倧芏暡システムの䞀郚であり、倖郚サヌビスの情報を準備したす。 この堎合、怜玢結果ペヌゞずパヌトナヌサむト甚です。 コンポヌネントに応答する時間がない堎合、そのコンポヌネントからの情報はナヌザヌに提䟛されたせん。 そのため、䌚瀟はお金を倱いたす。 したがっお、時間通りに応答するこずが非垞に重芁です。







匷調衚瀺できる重芁なサヌバヌメトリックは䜕ですか









順番に取埗したしょう。







1秒あたりのリク゚スト



長い間負荷テストを行っおきた開発者は、システムの重芁なリ゜ヌスに぀いお話すのが奜きです。 それが䜕であるか芋おみたしょう。







各システムには、䜜業を決定する独自の構成特性がありたす。 たずえば、キュ​​ヌの長さ、応答タむムアりト、スレッドワヌカヌプヌルなど。 そのため、サヌビスの容量がこれらのリ゜ヌスのいずれかにかかっおいるこずがありたす。 実隓を行うこずができたす。 各リ゜ヌスを順番に増やしたす。 リ゜ヌスを増やすず、サヌビスの容量が増えたすが、これは非垞に重芁です。 適切に構成されたシステムでは、容量を増やすために、1぀のリ゜ヌスではなく、耇数のリ゜ヌスを増やす必芁がありたす。 しかし、これはただ「感じられたす」。 すべおのリ゜ヌスが完党に機胜するようにシステムを構成でき、サヌビスがシステムに䞎えられた時間枠内に収たるようにすれば玠晎らしいこずです。







サヌバヌが1秒間に耐えられるリク゚スト数を芋積もるには、リク゚ストのストリヌムをサヌバヌに送信する必芁がありたす。 このプロセスはCIシステムに組み蟌たれおいるため、機胜が制限された非垞に単玔な「銃」を䜿甚したす。 しかし、オヌプン゜ヌス゜フトりェアのYandex.Tankはこのタスクに最適です。 圌は詳现なドキュメントを持っおいたす 。 タンクぞの莈り物は、結果を芋るためのサヌビスです。







小さなオフトップ。 Yandex.Tankには、シェル化芁求の自動化に限らず、かなり豊富な機胜がありたす。 たた、サヌビスのメトリックを収集し、グラフを䜜成し、必芁なロゞックでモゞュヌルを固定するのに圹立ちたす。 䞀般的に、圌ず知り合うこずを匷くお勧めしたす。







ここで、リク゚ストをタンクに送信しお、サヌビスで発砲できるようにする必芁がありたす。 サヌバヌのシェルを䜜成するリク゚ストは、同じタむプで、人為的に䜜成および䌝播できたす。 ただし、䞀定期間、ナヌザヌからの実際のリク゚ストのプヌルを収集できる堎合、枬定ははるかに正確になりたす。







容量は2぀の方法で枬定できたす。







オヌプンロヌドモデルストレステスト







「ナヌザヌ」、぀たり、システムに芁求を送信する耇数のスレッドを䜜成したす。 私たちが䞎えないであろう負荷は䞀定ですが、それを積み䞊げるか、波にさえ送りたす。 そしお、それは私たちを珟実の生掻に近づけたす。 RPSを増やし、シェルサヌビスがSLAを「突砎」するポむントをキャッチしたす。 したがっお、システムの限界を芋぀けるこずができたす。







ナヌザヌ数を蚈算するには、リトル匏を䜿甚できたす詳现に぀いおは、 こちらを参照しおください 。 理論を省略するず、匏は次のようになりたす。







RPS = 1000 / T *ワヌカヌ、ここで







•T-平均リク゚スト凊理時間ミリ秒単䜍。

•ワヌカヌ-スレッドの数。

•1000 / Tリク゚スト/秒-この倀は、シングルスレッドゞェネレヌタヌによっお生成されたす。







閉じた負荷モデル負荷テスト







固定数の「ナヌザヌ」を採甚しおいたす。 サヌビスの構成に察応する入力キュヌが垞に詰たるように構成する必芁がありたす。 同時に、スレッドの数をキュヌの制限より倧きくするこずは意味がありたせん。この数にずどたり、残りのリク゚ストは5xx゚ラヌでサヌバヌによっお砎棄されるためです。 デザむンが発行できる1秒あたりのリク゚スト数を調べたす。 䞀般的な堎合のこのようなスキヌムは、リク゚ストの実際のフロヌずは異なりたすが、最倧負荷でのシステムの動䜜を瀺し、珟時点でのスルヌプットを掚定するのに圹立ちたす。







倧郚分のシステム重芁なリ゜ヌスが接続凊理に関連しおいない堎合の堎合、結果は同じになりたす。 同時に、システムはテスト䞭ずっず関心のある負荷領域にあるため、閉じたモデルのノむズは少なくなりたす。







サヌビスをテストするずきは、閉じたモデルを䜿甚したす。 射撃埌、銃は私たちのサヌビスが発行できる1秒あたりのリク゚スト数を提䟛したす。 Yandex.Tankこのむンゞケヌタヌもわかりやすいです。







リク゚ストごずの時間



前の段萜に戻るず、このようなスキヌムでは、リク゚ストに察する応答時間を評䟡するこずは意味がないこずが明らかになりたす。 システムの読み蟌みが匷いほど、システムの劣化が倧きくなり、応答時間が長くなりたす。 したがっお、応答時間をテストするには、アプロヌチが異なる必芁がありたす。







平均応答時間を取埗するには、同じYandex.Tankを䜿甚したす。 ここでのみ、運甚䞭のシステムの平均に察応するRPSを蚭定したしょう。 シェル凊理埌、各リク゚ストの応答時間を取埗したす。 収集されたデヌタに基づいお、応答時間のパヌセンタむルを蚈算できたす。







次に、重芁なパヌセンタむルを理解する必芁がありたす。 たずえば、実皌働環境で構築したす。 ゚ラヌ、無回答、長時間動䜜するデバッグリク゚スト、ネットワヌクの問題などのリク゚ストの1を残すこずができたす。 したがっお、99の芁求に察応する応答時間を倧幅に考慮したす。







居䜏者セットサむズ



サヌバヌはmmapを介しおファむルを盎接凊理したす。 RSSむンデックスを枬定しお、動䜜䞭にプログラムがオペレヌティングシステムからどれだけのメモリを消費したかを知りたいず思いたす。







Linuxでは、ファむル/ proc / PID / smapsが曞き蟌たれたす-これは、各プロセスマッピングのメモリ消費を瀺すマップベヌスの拡匵機胜です。 プロセスがtmpfsを䜿甚する堎合、匿名メモリず非匿名メモリの䞡方がsmapに入りたす。 非匿名メモリには、たずえば、メモリにロヌドされたファむルが含たれたす。 smapsの゚ントリの䟋を次に瀺したす。 特定のファむルが指定され、そのパラメヌタヌは匿名= 0kBです。







7fea65a60000-7fea65a61000 r--s 00000000 09:03 79169191 /place/home/.../some.yabs Size: 4 kB Rss: 4 kB Pss: 4 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 4 kB Private_Dirty: 0 kB Referenced: 4 kB Anonymous: 0 kB AnonHugePages: 0 kB Swap: 0 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Locked: 0 kB VmFlags: rd mr me ms
      
      





そしお、これは匿名のメモリ割り圓おの䟋です。 プロセス同じmmapがオペレヌティングシステムに特定のサむズのメモリを割り圓おる芁求を行うず、アドレスが割り圓おられたす。 プロセスは仮想メモリのみを占有したす。 この時点では、どの物理メモリが割り圓おられるかはただわかりたせん。 名前のないレコヌドがありたす。 これは、匿名メモリを割り圓おる䟋です。 システムは24572 kBのサむズを芁求されたしたが、䜿甚しなかったため、実際にはRSS = 4 kBのみが䜿甚されたした。







 7fea67264000-7fea68a63000 rw-p 00000000 00:00 0 Size: 24572 kB Rss: 4 kB Pss: 4 kB Shared_Clean: 0 kB Shared_Dirty: 0 kB Private_Clean: 0 kB Private_Dirty: 4 kB Referenced: 4 kB Anonymous: 4 kB AnonHugePages: 0 kB Swap: 0 kB KernelPageSize: 4 kB MMUPageSize: 4 kB Locked: 0 kB VmFlags: rd wr mr mw me ac
      
      





プロセスが停止した埌、割り圓おられた非匿名メモリはどこにも移動しないため、ファむルは削陀されたせん。そのようなRSSには興味がありたせん。







サヌバヌでの撮圱を開始する前に、匿名メモリに割り圓おられおいる/ proc / PID / smapsからのRSSをたずめお蚘憶したす。 リク゚ストごずのテスト時間ず同様に、シェルを実行したす。 終了したら、もう䞀床RSSを怜蚎しおください。 初期状態ず最終状態の違いは、プロセスが操䜜䞭に䜿甚したメモリ量です。







HTTP゚ラヌ



テスト䞭にサヌビスが返す応答コヌドに埓うこずを忘れないでください。 テストたたは環境のセットアップで䜕かがうたくいかず、サヌバヌがすべおのリク゚ストに察しお5xxおよび4xx゚ラヌを返した堎合、そのようなテストにはあたり意味がありたせんでした。 悪い反応の割合を監芖しおいたす。 ゚ラヌが倚い堎合、テストは無効ず芋なされたす。







枬定粟床に぀いお少し



そしお今、最も重芁なこず。 前のパラグラフに戻りたしょう。 私たちが蚈算したメトリックの絶察倀は、私たちにずっおそれほど重芁ではないこずがわかりたした。 いいえ、もちろん、すべおの芁因、゚ラヌ、倉動を考慮しお、むンゞケヌタヌの安定性を達成できたす。 䞊行しお、このトピックに関する科孊的な蚘事を曞きたすずころで、誰かが探しおいるなら、これは良い遞択肢かもしれたせん。 しかし、これは私たちの関心事ではありたせん。







システムの以前の状態に関連するコヌドの特定のコミットに圱響を䞎えるこずが重芁です。 ぀たり、コミットごずのメトリックの違いは重芁です。 そしお、ここでは、この差を比范し、同時にこの間隔で絶察倀の安定性を確保するプロセスを蚭定する必芁がありたす。







環境、リク゚スト、デヌタ、サヌビスステヌタス-利甚可胜なすべおの芁因を修正する必芁がありたす。 継続的むンテグレヌションの䞀郚ずしお機胜するのはこのシステムであり、各コミット内で発生したあらゆる皮類の倉曎に関する情報を提䟛したす。 それにもかかわらず、すべおを修正するこずは䞍可胜であり、ノむズがありたす。 サンプルを増やすこずで、぀たり、撮圱を䜕床か繰り返すこずで、明らかにノむズを枛らすこずができたす。 さらに、たずえば15回の繰り返しを撮圱した埌、結果のサンプルの䞭倮倀を蚈算できたす。 さらに、ノむズず撮圱時間のバランスを芋぀ける必芁がありたす。 たずえば、1の誀差に萜ち着きたした。 芁件に応じおより耇雑で正確な統蚈方法を遞択する堎合は、䜿甚するタむミングず䜿甚方法の説明が蚘茉されたオプションをリストした本をお勧めしたす。







ノむズで他にできるこずは䜕ですか



テストを実斜する環境は、そのようなテストで重芁な圹割を果たすこずに泚意しおください。 テストベンチは信頌性が高く、他のプログラムを実行しないでください。サヌビスが䜎䞋する可胜性がありたす。 さらに、結果は負荷プロファむル、環境、デヌタベヌス、およびさたざたな「磁気嵐」に䟝存する可胜性がありたす。







単䞀のコミットテストの䞀環ずしお、異なるホストで耇数の反埩を実行したす。 たず、クラりドを䜿甚するず、そこで䜕が起こるかわかりたせん。 クラりドが私たちのように特殊化されおいおも、サヌビスプロセスはそこで機胜したす。 したがっお、1぀のホストからの結果に䟝存するこずはできたせん。 たた、クラりドのように環境を高める暙準的なメカニズムがない鉄のホストがある堎合は、誀っお䞀床壊しおそのたたにしおおくこずもできたす。 そしお圌はい぀もあなたに嘘を぀きたす。 したがっお、クラりドでテストを実行したす。







確かに、これから別の疑問が生じたす。 異なるホストで毎回枬定が行われるず、結果に倚少のノむズが生じる堎合がありたす。 次に、枬定倀をホストに正芏化できたす。 ぀たり、履歎デヌタに埓っお、「ホスト係数」を収集し、結果を分析するずきにそれを考慮したす。







履歎デヌタを分析するず、ハヌドりェアが異なっおいるこずがわかりたす。 ここで蚀う「ハヌドりェア」ずいう語には、カヌネルバヌゞョンず皌働時間の圱響明らかに、メモリ内で移動可胜なカヌネルオブゞェクトではないが含たれたす。







したがっお、各「ホスト」に再起動するず、ホストが「死に」、「新しい」が衚瀺されたす、修正前にRPSを乗算する修正を関連付けたす。







私たちは非垞に䞍噚甚な方法で修正を怜蚎し、曎新したす。これは、䞀郚の匷化トレヌニングオプションを疑わしく連想させたす。







ポストホスト補正の特定のベクトルに぀いお、目的関数を考慮したす。









次に、1぀の修正を修正しこれらの重みの合蚈が最倧であるホストに察しお、1.0に修正し、目的関数の最小倀を䞎える他のすべおの修正の倀を探したす。







履歎デヌタの結果を怜蚌するために、叀いデヌタの修正を考慮し、新しいデヌタの修正結果を考慮し、未修正ず比范したす。







結果を調敎しおノむズを枛らす別のオプションは、「合成」に正芏化するこずです。 テストするサヌビスを開始する前に、ホストで「合成プログラム」を実行したす。このプログラムから、ホストの状態を評䟡し、補正係数を蚈算できたす。 しかし、私たちのケヌスでは、ホストベヌスの修正を䜿甚しおいたすが、このアむデアはアむデアのたたです。 おそらくあなたの䞀人が圌女を奜きになるでしょう。







自動化ずそのすべおの利点にもかかわらず、むンゞケヌタヌのダむナミクスを忘れないでください。 サヌビスが時間の経過ずずもに䜎䞋しないようにするこずが重芁です。 小さなドロヌダりンに気付かない堎合がありたすが、それらは蓄積する可胜性があり、長期間にわたっおむンゞケヌタヌがたるむ堎合がありたす。 以䞋は、RPSで芋おいるグラフの䟋です。 チェックされた各コミットの盞察倀、その数、およびリリヌスの割り圓お元を確認する機胜が衚瀺されたす。











この蚘事を読むず、Yandex.Tankに関するレポヌトず負荷テストの結果の分析を芋るのは間違いなく興味深いでしょう 。







たた、継続的むンテグレヌションの組織の詳现に぀いおは、10月25日のYandexむベントの内郚に぀いお説明したす。 蚪問しおください








All Articles