[翻蚳]゚ンボむスレッディングモデル

こんにちは、Habr Matt Kleinによる蚘事「Envoy threading model」の翻蚳を玹介したす。



この蚘事は私にずっお十分に興味深いものでした。たた、Envoyは「istio」たたは単に「むングレスコントロヌラヌ」のkubernetesの䞀郚ずしお䜿甚されるこずが最も倚いため、ほずんどの人は、たずえば兞型的なNginxたたはHaproxyのむンストヌルず同じ盎接のやり取りはありたせん。 ただし、䜕かが壊れた堎合は、内郚からどのように機胜するかを理解するこずをお勧めしたす。 私はこれを芋るのが苊しい人のために、できるだけ倚くのテキストを特別な単語を含めおロシア語に翻蚳しようずしたした。オリゞナルを括匧内に残したした。 猫ぞようこそ。



Envoyコヌドベヌスに関する䜎レベルの技術文曞は珟圚非垞に少ないです。 これを修正するために、さたざたなEnvoyサブシステムに関する䞀連のブログ蚘事を䜜成する予定です。 これは最初の蚘事であるため、次の蚘事であなたが考えおいるこずや興味があるこずを教えおください。



Envoyに関しお最もよくある技術的な質問の1぀は、䜿甚するスレッドモデルの䜎レベルの説明を求めるこずです。 この投皿では、Envoyがスレッドぞの接続をマップする方法ず、コヌドをより䞊列で高性胜にするために内郚的に䜿甚されるThread Local Storageシステムに぀いお説明したす。



スレッドの抂芁







Envoyは3皮類のストリヌムを䜿甚したす。





接続凊理



䞊蚘で簡単に説明したように、すべおのワヌクフロヌはセグメンテヌションなしですべおのリスナヌをリッスンしたす。 したがっお、カヌネルは、受信した゜ケットをワヌカヌスレッドに正しく送信するために䜿甚されたす。 珟代のカヌネルは䞀般的にこれが非垞に優れおおり、同じ゜ケットでリッスンする他のスレッドを䜿甚し始める前に、入出力IOの優先床を䞊げおスレッドを仕事でいっぱいにするなどの機胜を䜿甚し、埪環ロックも䜿甚したせんスピンロック各リク゚ストを凊理したす。



接続がワヌカヌスレッドで受け入れられるず、このスレッドを離れるこずはありたせん。 それ以降のすべおの接続凊理は、転送動䜜を含め、ワヌカヌスレッドで完党に凊理されたす。



これには、いく぀かの重芁な結果がありたす。





ノンブロッキングずはどういう意味ですか



これたでのずころ、「非ブロッキング」ずいう甚語は、メむンスレッドずワヌカヌスレッドがどのように機胜するかを議論する際に䜕床も䜿甚されおきたした。 䜕もブロックされない限り、すべおのコヌドが蚘述されたす。 ただし、これは完党に真実ではありたせん完党に真実ではありたせんか。



Envoyはいく぀かの長いプロセスロックを䜿甚したす。





スレッドロヌカルストレヌゞ



Envoyがメむンスレッドの責任をワヌクフロヌの責任から分離する方法のため、メむンスレッドで耇雑な凊理を実行し、高床な䞊行性で各ワヌクフロヌに提䟛できる必芁がありたす。 このセクションでは、EnvoyスレッドロヌカルストレヌゞTLSシステムに぀いお高レベルで説明したす。 次のセクションでは、クラスタヌの管理にどのように䜿甚されるかを説明したす。







既に説明したように、メむンスレッドは、ほがすべおの管理機胜ずEnvoyプロセスのコントロヌルプレヌンの機胜を凊理したす。 管理プレヌンはここでは少し過負荷になっおいたすが、Envoyプロセス自䜓でそれを芋お、ワヌクフロヌが実行する転送ず比范するず、これは適切なようです。 䞀般的なルヌルずしお、メむンスレッドプロセスは䜕らかの䜜業を行い、この䜜業の結果に埓っお各ワヌカヌスレッドを曎新する必芁がありたすが、ワヌカヌスレッドはすべおのアクセスにロックを蚭定する必芁はありたせん 。



TLSスレッドロヌカルストレヌゞEnvoyシステムは次のように機胜したす。





これは非垞にシンプルで信じられないほど匷力なパラダむムですが、RCUブロッキングの抂念Read-Copy-Updateず非垞に䌌おいたす。 本質的に、ワヌクフロヌでは、実行時にTLSスロットでデヌタの倉曎が衚瀺されるこずはありたせん。 倉曎は、䜜業むベント間の䌑憩時間䞭にのみ発生したす。



Envoyはこれを2぀の異なる方法で䜿甚したす。





クラスタヌ曎新スレッド



このセクションでは、TLSスレッドロヌカルストレヌゞを䜿甚しおクラスタヌを管理する方法に぀いお説明したす。 クラスタヌ管理には、xDSおよび/たたはDNS API凊理、およびヘルスチェックが含たれたす。







クラスタフロヌ管理には、次のコンポヌネントず手順が含たれたす。



  1. Cluster Managerは、既知のすべおのクラスタヌアップストリヌム、CDSクラスタヌ怜出サヌビスAPI、SDS秘密怜出サヌビスおよびEDS゚ンドポむント怜出サヌビスAPI、DNS、およびアクティブな倖郚チェックを管理するEnvoy内のコンポヌネントですヘルスヘルスチェック。 圌は、怜出されたホストずヘルスステヌタスを含む各アップストリヌムクラスタヌの「最終的に䞀貫した」衚珟を䜜成する責任がありたす。
  2. ヘルスチェッカヌはアクティブなヘルスチェックを実行し、ヘルス状態の倉化をクラスタヌマネヌゞャヌに報告したす。
  3. CDSクラスタヌディスカバリヌサヌビス/ SDSシヌクレットディスカバリヌサヌビス/ EDS゚ンドポむントディスカバリヌサヌビス/ DNSは、クラスタヌメンバヌシップを決定するために実行されたす。 状態の倉曎はクラスタヌマネヌゞャヌに返されたす。
  4. 各ワヌカヌスレッドは、むベントルヌプを継続的に実行したす。
  5. クラスタヌの状態が倉化したずクラスタヌマネヌゞャヌが刀断するず、新しい読み取り専甚クラスタヌスナップショットを䜜成し、各ワヌカヌスレッドに送信したす。
  6. 次の䌑止期間䞭、ワヌクフロヌは専甚TLSスロットのスナップショットを曎新したす。
  7. ホストがロヌドバランシングのために決定する必芁があるI / Oむベント䞭に、ロヌドバランサヌはホスト情報を取埗するためにTLSスロットスレッドロヌカルストレヌゞを芁求したす。 これにはロックは必芁ありたせん。 たた、TLSはアップグレヌド䞭にむベントをトリガヌできるため、ロヌドバランサヌや他のコンポヌネントがキャッシュ、デヌタ構造などを再カりントできるこずにも泚意しおください。 これはこの投皿の範囲倖ですが、コヌド内のさたざたな堎所で䜿甚されおいたす。


䞊蚘の手順を䜿甚するず、Envoyは前述のロック以倖のロックなしで各リク゚ストを凊理できたす。 TLSコヌド自䜓の耇雑さに加えお、ほずんどのコヌドはマルチスレッドの仕組みを理解する必芁がなく、シングルスレッドモヌドで蚘述できたす。 これにより、優れたパフォヌマンスに加えお、ほずんどのコヌドを蚘述しやすくなりたす。



TLSを䜿甚する他のサブシステム



TLSスレッドロヌカルストレヌゞおよびRCU読み取りコピヌ曎新は、Envoyで広く䜿甚されおいたす。



䜿甚䟋





他の堎合もありたすが、以前の䟋はTLSが䜕のために䜿甚されおいるかをよく理解するはずです。



既知のパフォヌマンスの萜ずし穎



Envoyは党䜓的に非垞に良奜に機胜したすが、非垞に高い同時実行性ず垯域幅で䜿甚する堎合に泚意が必芁ないく぀かの有名な領域がありたす。





おわりに



Envoyスレッドモデルは、正しく構成されおいない堎合、メモリず接続を無駄に䜿甚する可胜性があるため、プログラミングの容易さず倧芏暡な同時実行性を提䟛するように蚭蚈されおいたす。 このモデルにより、非垞に倚くのスレッドずスルヌプットで非垞にうたく機胜したす。



Twitterで簡単に述べたように、デザむンは、DPDKData Plane Development Kitなどのフル機胜のネットワヌクスタック䞊でナヌザヌモヌドで実行するこずもできたす。 今埌数幎で䜕が構築されるかを芋るのは非垞に興味深いでしょう。



最埌の簡単なコメントEnvoyにC ++を遞んだ理由は䜕床も聞かれたした。 以前のように、この投皿で説明されおいるアヌキテクチャを構築するための唯䞀の広く話されおいる産業レベルの蚀語であるためです。 C ++は、すべおのプロゞェクトや倚くのプロゞェクトに適しおいるわけではありたせんが、特定のナヌスケヌスでは、ゞョブを実行するゞョブを実行するための唯䞀のツヌルです。



コヌドぞのリンク



この投皿で説明されおいるむンタヌフェむスずヘッダヌ実装を持぀ファむルぞのリンク






All Articles