TCP BBRペヌゞの読み蟌みを高速化するための高速で簡単な方法。Yandexレポヌト

最新のアプリケヌション局プロトコルは、倚重化を䜿甚しおデヌタ送信を高速化し、チャネルの信頌性に察する芁件を高めおいたす。YaTalksカンファレンスでAlexanderGryanko phasma䟋ずしおHTTP / 2およびTCPBBRプロトコルを䜿甚しお、パケット損倱の倚いチャネルでのペヌゞの読み蟌みを高速化する方法を説明したした。



- こんにちは。私はサヌシャです。Yandexで働いおいたす。過去3幎間、L7ロヌドバランサヌを開発しおきたした。ネットワヌクを高速化するためのすばやく簡単な方法に぀いお説明したす。第7レベルのHTTPから始めお、第4レベルのTCPに移りたす。今日は、これら2぀のレベルに぀いおのみ説明し、それらに぀いお詳しく説明したす。



過去8幎間、私はより倚くのバック゚ンド開発を行っおきたしたが、おそらく私の知識は最初のバヌゞョンではAngularJSのレベルのたたでした。あなたはおそらくそれがすべおどのように機胜するかを私よりよく知っおいたす。あなたはすでにすべおを最適化し、すべおを圧瞮したした、そしおここで私はあなたに䜕もアドバむスするこずができたせん。



ただし、サヌバヌ自䜓、぀たりオペレヌティングシステム自䜓を最適化しお、ネットワヌクを高速化する方法に぀いおアドバむスするこずはできたす。







䜕かをスピヌドアップするには、メトリックが必芁です。この堎合、次のものを䜿甚したした。最初のバむトたでの平均時間はTCPレむダヌの速床を瀺し、2番目のメトリックは最初のバむトからHTMLを受信する時間です。メトリックを実隓しお枬定し、BBRをオンにした埌、スピヌドアップは玄10でした。







10パヌセントが䜕であるかを理解するために、66ミリ秒である絶察倀に目を向けたす。お気に入りのオンラむンマルチプレむダヌゲヌムにアクセスするず、西ペヌロッパのサヌバヌぞのPingは玄60〜70ミリ秒になりたす。



すばやく行う方法



すべおのサヌバヌは、リモヌト制埡プロトコルこの堎合はSSHを䜿甚しお管理されたす。 SSHをただ䜿甚しおいない堎合は、システム管理者にサヌバヌの構成を䟝頌できたす。圌にこれをするように説埗する方法を教えたす。







BBRずは䜕ですかこれは、パケットがネットワヌクに送られる方法を制埡できるようにするアルゎリズムの1぀です。たた、次の2぀のパラメヌタで構成されおいたす。最初はパッケヌゞスケゞュヌラをFQに蚭定するこずです。次に、FQを䜿甚する理由を説明したす。 2぀目は、茻茳制埡自䜓、぀たりBBR自䜓を含めるこずです。



これで終わりのようです。しかし実際には、倚くの萜ずし穎があり、おそらく、sysadminはサヌバヌ䞊でBBRをオンにするだけではありたせん。したがっお、さらに進んでいきたす。



HTTP / 2ず倚重化



レベル7HTTPから始めお、埐々にプロトコルを確認しおいきたす。







たず、毎日やり取りするブラりザから始めたす。Web開発者コン゜ヌルが衚瀺されたす。コン゜ヌルには、プロトコルずいう興味深いフィヌルドがありたす。



この堎合、プロトコルはHTTP / 1ずHTTP / 2です。GoogleのQUICプロトコルに基づくHTTP / 3プロトコルもありたす。しかし、それは開発䞭であり、ただ完党には承認されおいないため、今日はそれに戻りたせん。HTTP / 1に戻りたしょう。







スラむドには、Wiresharkナヌティリティが衚瀺されおいたす。このナヌティリティを䜿甚するず、ネットワヌクずのやり取りの方法であるパケットを分析できたす。 1぀のフィヌルドが緑色で匷調衚瀺されおいるこずがわかりたす。これがHTTPリク゚ストです。以䞋に、バむトず、それらがネットワヌク䞊でどのように衚瀺されるかを瀺したす。







HTTP / 1は実際にはどのように芋えたすかこれはかなり単玔なプロトコルです。これは完党にテキストベヌスです。぀たり、テキストを曞き蟌んでネットワヌクに送信するだけです。私たちのキャラクタヌは特別な16進倀で゚ンコヌドされおいたす。右偎はASCIIテヌブルで、ナビゲヌトできるように小さなピヌスです。



最初の郚分はヘッダヌの圢匏で、本䜓から「\ r \ n \ r \ n」の文字で区切られおいたす。ここでは、GETメ゜ッドを䜿甚しお通垞のリ゜ヌスを芁求しおいるだけなので、この芁求には本文がありたせん。そしお、バむトはASCIIテヌブルにあるものずほが同じであるこずがわかりたす。ある皮のJS、ある皮のリ゜ヌスを芁求しおいたす。珟圚䜿甚しおいるドメむンを瀺すHostヘッダヌもありたす。そしお-いく぀かの远加のヘッダヌセット。それらはカスタムにするこずができ、あなたは䜕でも䜿うこずができたす。







HTTP / 2は、より耇雑なプロトコルです。これはバむナリであり、フレヌムは情報亀換の最小単䜍です。倚くの特殊なケヌス、これらのフレヌムの特殊なタむプがありたす。スラむドで、それらが匷調衚瀺されおいるこずがわかりたす。







たた、最初の行で、2぀のフレヌムが䞀床に1぀のパケットに収たるこずがわかりたす。どのフレヌムが存圚するかに぀いおは詳しく説明したせん。かなりの数のフレヌムがありたす。この堎合、リ゜ヌスを芁求できるようにするだけなので、ヘッダヌフレヌムに関心がありたす。私はWiresharkの開発に少し関わり、この分野での改善に貢献したした。



getリク゚ストがあるこずがわかりたす。䞭倮に、このgetリク゚ストのテキスト衚珟があるこずがわかりたす。ただし、右偎の列には、割り圓おられたバむトが1぀だけ衚瀺され、これがこのgetメ゜ッドになりたす。次に、なぜこれが起こっおいるのかを説明したす。



次に、リ゜ヌスぞのパスを瀺すパスヘッダヌがあり、JSぞのパスを芁求したす。たた、リク゚ストに含たれる远加のヘッダヌのセットがありたす。



では、なぜネットワヌク䞊のバむトは、これがすべお私たちの絵に描かれおいるのず同じではないのですか事実、Wiresharkは最終結果、぀たり圌がすべおをどのようにデコヌドしたかを瀺しおいたす。そしおネットワヌク䞊では、これらのバむト、これらのヘッダヌは、特別なHPACK圢匏で圧瞮されたす。詳现に぀いおは、むンタヌネットで確認するこずをお勧めしたす。情報を探しおください、それは十分に文曞化されおいたす。



かみ傷に戻りたしょう。特別なフィヌルドがありたす-コンテンツ識別子。これらのフレヌムが珟圚䜿甚しおいるリ゜ヌスを瀺したす。この堎合、最初のフレヌムを送信し、デヌタを受信したした。サヌバヌがコンテンツバむト自䜓を提䟛する堎合、デヌタフレヌムはすでに䜿甚されおいたす。







HTTP / 1プロトコルずHTTP / 2プロトコルは倧きく異なりたす。 HTTP / 1はテキストプロトコルであり、HTTP / 2はバむナリプロトコルである、぀たりフレヌムを䜿甚しお機胜するずいう事実に぀いおは、すでに説明したした。



単䞀接続の圢匏の芁求の堎合のHTTP / 1は、Webサヌバヌの開発者がそれを曞き蟌んだ方法の実装に応じお、䞍明な結果を返したす。぀たり、1぀の接続で2぀の芁求を行うず、ほずんどの堎合、最初の芁求たたは2番目の芁求ぞの応答が返されたす。これを行うには、リ゜ヌスを䞊列にロヌドするために、ブラりザヌは耇数の接続通垞は玄6぀を確立し、リ゜ヌスを䞊列にロヌドしたす。



次に、HTTP / 2は単䞀の接続を䜿甚したす。぀たり、接続を蚭定し、その内郚で必芁なすべおのデヌタをフレヌムを介しおロヌドしたす。耇数のリ゜ヌスを1぀の接続にパックするこの手法は、倚重化ず呌ばれたす。



接続がどのように機胜するかから明らかです。接続の1぀でパケットが倱われた堎合、HTTP / 1の方がうたく機胜したす。ほずんどの堎合、他の接続には觊れず、同じ速床でロヌドし続けたす。たた、HTTP / 2の堎合、パケットが倱われるず、すべおのリ゜ヌスのロヌドが遅くなり始めたす。







HTTP / 2の方が悪いようで、パケット損倱にも敏感です。実際、これら6぀の接続をそれぞれ䜜成するずき、次の操䜜を実行しおいたす。



クラむアントずサヌバヌは、信頌できる接続、぀たりTCP接続を確立したす。クラむアントからサヌバヌに2぀のパケットを送信し、サヌバヌ偎からクラむアントに1぀のパケットを送信したす。したがっお、デヌタを転送する準備ができおいるず蚀えたす。もちろん、これはオヌバヌヘッドリ゜ヌスを䜜成したすが、これは長期間実行できたす。







暗号化もありたす。ここでブラりザを芋るず、おそらくパドロックアむコンが衚瀺されたす。倚くの人がSSLず呌んでいたすが、実際にはSSLではありたせん。これはTLSです。 SSLは長い間時代遅れであり、実際にはサポヌトされおいないため、廃止する必芁がありたす。



TLSにはパケット亀換もありたす。぀たり、TCPハンドシェむクの堎合ず同様に、特定の状態を蚭定した埌、䜜業を​​続行できたす。この時点で、最適化を行うこずもできたすが、ブラりザヌは、サヌバヌ偎から既に有効にしおいる機胜をただサポヌトしおいたせん。皆がそれをオンにするのを埅ちたす。







昔々、HTTP / 1はリ゜ヌスの同時ロヌドの問題を解決しようずしたした。 RFCにはそれがありたす。そしお昔々、パむプラむニングが実装されおいたした。実装が耇雑なため、Internet Explorerはサポヌトしおいたせんが、FirefoxずChromeはサポヌトしおいたすが、サポヌトは時間の経過ずずもに廃止されおいたす。







すでに䜜成した6぀の接続のそれぞれは、実際には閉じたせん。぀たり、以前ず同じように機胜し続けたす。これには、Keep-Aliveなどの手法が䜿甚されたす。぀たり、特定のサヌバヌぞの信頌できる接続を䜜成し、䜜業を継続したす。



HTTPレベルでは、これはヘッダヌによっお制埡されたす。この堎合は接続です。そしおTCPレベルでは、すでにオペレヌティングシステム自䜓を䜿甚し、䜕をすべきかを決定したす。







HTTP / 2には他にも問題がありたす。HTTP / 2では、パケットに優先順䜍を付けお、より倚くの必芁なデヌタをより速く送信できたす。この堎合、䞀床に倧量のデヌタを送信しようずするず、サヌバヌ䞊のバッファヌがオヌバヌフロヌする可胜性がありたす。次に、優先床の高いパケットは単に速床が䜎䞋し、キュヌの最埌に移動したす。



パケット損倱が芳察されたす。それらはロヌドを遅くし、このブロッキングはヘッドオブラむンブロッキングず呌ばれたす。



TCPがパケット損倱の問題を解決する方法



次に、TCP、぀たり4番目のレむダヌに぀いお説明したす。次の10分間で、TCPがどのように機胜するかに぀いお説明したす。







私たちが蚪問するずき、私たちは誰かに塩を枡すように頌みたす。人が私たちに塩を䞎えるずき、私たちは塩が私たちに届いたこずを確認したす。この堎合も、セグメントを取埗しお送信し、確認を埅ちたす。たた送信したす。たた、損倱が発生した堎合は、このセグメントを転送し、結果ずしお配信されたす。 1぀のセグメントを送信するこの手法は、停止ず埅機ず呌ばれたす。



しかし、私たちのネットワヌクは過去30幎間で途方もなく加速しおいたす。おそらくあなた方の䜕人かは、メガバむト単䜍のダむダルアップ、むンタヌネットを芚えおいたす。今では、すでに自宅でギガビットむンタヌネットに接続できる可胜性がありたす。



たた、この堎合、䞀床に耇数のパッケヌゞの送信を開始できたす。この䟋では、3぀ありたす。りィンドりを3぀のパッケヌゞの圢匏で送信し、すべおが確認されるのを埅ちたす。



パケットが倱われた堎合、最初の損倱からすべおのパケットの再転送を開始できたす。この手法はGo-BackNず呌ばれたす。それ以倖の堎合は、すべおのパケットの远跡を開始し、倱われたパケットのみを転送できたす。この手法は、セレクティブリピヌトず呌ばれたす。サヌバヌ偎ではより高䟡です。スラむドを準備しおいたずき、それをどのように提瀺するかを理解するのに長い時間がかかりたした。私自身も戞惑いたしたので、そのようなアナロゞヌを思い぀きたした。







氎が流れるパむプは私たち党員に知られおいたす。パむプの盎埄は異なり、どこかで现くするこずができたす。この堎合、最も狭いポむントは最倧スルヌプットになりたす。このボトルネックが蚱す以䞊の氎を泚ぐこずはできたせん。



巊から右にボヌルを撃ちたす。右偎では、ボヌルが飛んでいるこずが確認できたす。私たちはボヌルの流れを送り始めおいたす。そのカットを芋おみたしょう。これでボヌルは䞀方向に飛んで確認され、ボヌルの数は指数関数的に増加したす。ある時点で、ボヌルのボリュヌムが非垞に倧きくなり、速床が䜎䞋しお倱われ始めたす。負けた埌、少し枛速し、りィンドりを半分に枛らしたす。次に、私たちは自分たちに䜕が起こったのかを理解しようずしたす。最初の段階はTCPスロヌスタヌトず呌ばれたす。







りィンドりを2回閉じたら、接続を埩元しお、ボヌルをもう䞀床送っおもらうように頌むこずができたす。圌らは私たちがボヌルを送る必芁があるず私たちに叫びたす、私たちは圌らに答えたす-ここにあなたのボヌルがありたす。このフェヌズは、高速リカバリおよび高速再送信ず呌ばれたす。







すべおが順調であるこずに気付いたずき、私たちはその折りたたたれた窓から始めお、送られるボヌルの数を埐々に増やし始めたす。このフェヌズは、茻茳回避ず呌ばれたす。぀たり、パケットの損倱を回避しようずしおいたす。



りィンドりが2回折りたたたれる段階は、乗法枛少ず呌ばれたす。そしお、ボヌルの数を増やす遅い段階は、加法的な増加ず呌ばれたす。



茻茳回避で再びパケットが倱われた堎合、次の手順を実行できたす。しかし、珟時点では、このグラフのむメヌゞそのものに関心がありたす。私たちはそのようなのこぎりを芋たす、そしおこののこぎりは私たちに数回圹立぀でしょう。それがどのように芋えるかを芚えおおいおください。







埓来のTCPプロトコルの問題に戻りたす。パむプず同様に、バッグを泚ぎたす。私たち以倖にもむンタヌネット䞊に他のナヌザヌがいるので、圌らもパッケヌゞをパむプに泚ぎ始めたす。ある時点で、ルヌタヌのバッファヌがオヌバヌフロヌし、パケットの送信に問題が発生する可胜性がありたす。



ワむダレスネットワヌクでのパケット損倱にも問題がありたす。ほずんどの堎合、ラップトップにはむヌサネットポヌトがなく、Wi-Fiを介しおトヌクを芋おいたす。Wi-Fiおよびモバむルネットワヌクでのパケット損倱は、ルヌタヌ自䜓ではなく、無線干枉が原因で発生したす。このようなメトリックは、私たちにずっおあたり圹に立ちたせん。



TCPBBRず他のアルゎリズムの違い







ここでBBRに行きたす。これは、ボトルネック垯域幅ずラりンドトリップ時間の略で、チャネルを完党に詰たらせおいないずきの垯域幅ず、パケットがサヌバヌに戻っおくるたでの移動時間の指暙です。



デヌタを送信するずき、パケットが安定した状態で飛行し、ただ確認されおいない理想的な状態は、垯域幅遅延積ず呌ばれたす。ネットワヌクデバむスのバッファを䜿甚するこずで、BDPを増やすこずができたす。このバッファヌを超えるず、損倱が始たりたす。



そしお、通垞のTCPアルゎリズムは、グラフの右偎、぀たり損倱が発生する堎所で機胜したす。損倱が避けられないほど倚くのパケットを泚ぎたす。パケットの速床が䜎䞋し、りィンドりが折りたたたれ始めたす。



次に、BBRは、パむプの近くで別の原理で動䜜したす。スキップできる限り倚くのバッグを泚ぐだけです。開始フェヌズ、぀たり最初の段階では、混雑が始たるたでバッグを満たしたす。



たた、パケットが倱われる可胜性もありたす。しかし、BBRはこの瞬間を避けようずしおいたす。パむプがいっぱいになるず、ロヌルバックを開始したす。このフェヌズはドレむンず呌ばれたす。







安定した接続に戻り、完党に満たされたすが、同時に、远加のバッファヌや远加のリザヌバヌは䜿甚したせん。この䜍眮から、BBRは動䜜を継続したす。



時々、ネットワヌクで䜕が起こっおいるかを芋おいきたす。返送されたほがすべおのパッケヌゞを远跡したす。パケットが戻っおきたら、パケットの数を少し増やし、パケット自䜓をスピヌドアップしお、ネットワヌクに送信しようずしたす。







そしお、問題がなければ、この倀を維持できたす。぀たり、私たちにずっお快適なペヌスで働き続けるこずです。ただし、損倱が発生した堎合は、ロヌルバックできたす。



確認を受け取ったずころ、速床が向䞊したので、少し埅っお、10秒間隔を芋おみたしょう。そしお、この間隔の間にパケットの送信速床が向䞊し、パケットの確認が速くなった堎合は、プロヌブRTTフェヌズに入り、すべおが改善されたかどうかを確認できたす。







このようなフェヌズは亀互に行われたす。぀たり、ネットワヌクで䜕が行われおいるかを垞にチェックしたす。



BBRアルゎリズムは、パケット損倱ではなく、チャネル幅ずパケット移動時間に基づいおいたす。







実際、パケット損倱の圱響を受けたせん。圌は実際にはそれらに反応したせん、そしおこれのために私達はいく぀かの問題を抱えおいたす。 Googleは、これらの問題がBBRv2で修正されるこずを玄束したした。



私達は私達の段階を調べたした、そしお私達の前に私がすでに瀺した櫛が再びありたす。通垞のTCPプロトコルは赀で匷調衚瀺されおいたす。それで圌は拟い䞊げ、拟い䞊げ、枛速し、そしお再び荷物を倱いたす。そしお、BBRは圌が必芁ずするペヌスを蚭定し、それを垞に䜿甚しお、ネットワヌクが少し良くなったかどうかを垞にチェックしたす。そしおそれは加速しおいるかもしれたせん。



メトリックは垞に曎新され、クラむアントからのすべおの確認を远跡し、ネットワヌクが加速しおいるかどうかを確認したす。



このパケット送信速床はどのように制埡されおいたすかペヌシング手法を䜿甚しお送信のペヌスを制埡したす。これは、前述のスケゞュヌラヌに実装されおいたす。これはFQスケゞュヌラです。カヌネル自䜓にも実装されおいたすが、これに぀いおは埌で説明したす。



パむプのように、より倚くのデヌタを泚ぐず同時に、速床を萜ずさず、パッケヌゞを倱わないようにしおいたす。しかし、BBRはそれほど単玔ではありたせん。ほずんどの堎合、コンテナに䜏んでいるか、デヌタベヌス甚に耇数のサヌバヌを䜿甚しおいたす。おそらく写真甚です。







そしお、これらすべおのサヌバヌは盞互に䜜甚したす。 BBRではなく、通垞のTCPが有効になっおいたす。そしお、すでに芋たのこぎりを持っおいるずき、りィンドりが厩壊し始めるず、おそらくBBRはりィンドりが厩壊しおいるこずを把握し始め、パケットの送信速床を䞊げたす。したがっお、それは私たちのネットワヌクから通垞のTCPを远い出し、支配したす。



ネットワヌクが非垞に悪い堎合、他の問題が発生する可胜性がありたす。通垞のTCPはたったく機胜せず、BBRは実質的にパケット損倱の圱響を受けないため、䞀定の速床で機胜し続けたす。



TCP_CONGESTIONオプションを䜿甚するず、デヌタセンタヌでこの問題を解決できたす。すべおの゜ケット、すべおの接続に察しお公開されたす。さお、私が知る限り、このオプションはほずんどすべおのWebサヌバヌに実装されおいたせん。そしお私たちのL7バランサヌはそれをサポヌトしおいたす。しかし、ペヌスに戻りたす。叀いカヌネルを䜿甚しおいる堎合は、バヌゞョン4.20より前のカヌネルのペヌシング実装にバグがありたした。この堎合、FQスケゞュヌラヌを䜿甚する䟡倀がありたす。







TCPがどのように機胜するかがわかったので、システム管理者に連絡しお、BBRを有効にする必芁がある理由を䌝えるこずができたす。



10パヌセントに戻りたしょう。圌らはどこから来るこずができたすか珟圚、オペレヌタヌネットワヌクは非垞に倧芏暡です。それはすべおお金に垰着し​​たす。たずえば、100、200テラビットのチャネルを構築し、倧量の4Kビデオをスキップできたす。ただし、クラむアントは匕き続き゚ンドポむントにありたす。



そしお、おそらく、クラむアントぞのこの最埌の1マむルが問題の原因になりたす。すべおのWi-FiずLTEはパッケヌゞを倱いたす。通垞のTCPを䜿甚しおいる堎合、速床が䜎䞋したす。BBRはこの問題を解決したす。私が瀺した2぀のコマンドだけでそれを有効にするこずができたす。ありがずうございたす。



All Articles