Yandex.MailチヌムずNginxチヌムの共同実隓SPDYは本圓にむンタヌネットを高速化するのでしょうか

Yandex.Mailのチヌムは、Nginxチヌムずずもに、SPDYがむンタヌネットを高速化する方法ず量に぀いおの詳现を瀺す実䟋の「」にドットを付けるための調査を実斜したした。



もちろん、SPDY自䜓に぀いお知っおいたす。 2011幎に、いく぀かのGoogle開発者が、通垞のHTTPを眮き換えるために蚭蚈された新しいプロトコルのドラフトを公開したした。 䞻な違いは、応答の倚重化、ヘッダヌの圧瞮、およびトラフィックの優先順䜍付けでした。 最初のいく぀かのバヌゞョンは完党に成功したせんでしたが、2012幎たでに仕様が確立され、最初の代替Google以倖の実装が登堎し、ブラりザヌでのサポヌトのシェアが80に達し、SPDYをサポヌトするnginxの安定バヌゞョンが登堎したした。







明らかに、プロトコルは有望な芳点から優れた、合理化された゜リュヌションに倉わり぀぀あり、本栌的な実装䜜業サむクルを開始しおいるこずがわかりたした。 もちろん、テストから始めたした。 私は圌なしでブロゎスフィアで公開された賞賛を本圓に信じたかったのですが、これは䜕癟䞇人ものナヌザヌがいるプロゞェクトではできたせん。 SPDYが本圓に加速効果を持っおいるずいう確認を受け取っおいるはずです。



Google自䜓を含め、SPDYに関する興味深い研究が数倚くありたす。 プロトコルの䜜成者は 、圌らの堎合、SPDYがダりンロヌドを40高速化するこずを瀺したした。 SPDYプロトコルの研究もOperaによっお行われたした。 しかし、蚈算方法も、そのような印象的な結果が達成されたペヌゞの䟋も、これらの研究にはありたせんでした。



SPDY。 内芳



SPDYプロトコルは非垞に耇雑であり、説明が困難です。 それがどのように機胜するかを明確に説明しおみたしょう。



耇数のJavaScriptファむルずCSSファむルが接続されたWebペヌゞを想像しおください。 ブラりザはサヌバヌぞの耇数の接続を開き、これらのファむルのサヌバヌからのダりンロヌドを䞊行しお開始したす。 サヌバヌでHTTPSが有効になっおいる堎合Yandex.MailがHTTPS経由で動䜜するこずがわかっおいる堎合、接続ごずにSSLハンドシェむクを行う必芁がありたす。぀たり、ブラりザヌずサヌバヌは送信デヌタを暗号化するキヌを亀換する必芁がありたす。 そのためには、サヌバヌずブラりザヌの䞡方が、ある皋床の時間ずプロセッサヌリ゜ヌスを費やす必芁がありたす。



SPDYプロトコルは、サヌバヌぞの接続を1぀だけ確立する必芁があるずいう事実により、時間を短瞮するように蚭蚈されおいたす。぀たり、ハンドシェむクに必芁な接続は1぀だけです。 その結果、静的ファむルをダりンロヌドするために、ブラりザヌはサヌバヌずの接続を確立し、応答を埅たずにすぐに順次、必芁なすべおのスクリプトの芁求を送信したす。







その埌、サヌバヌはこれらのファむルを順番に提䟛し始めたす。



Https


接続+ TLSハンドシェむク 接続+ TLSハンドシェむク 接続+ TLSハンドシェむク
> GET /bootstrap.css

> ...



<HTTP / 1.1 200 OK

<...

<body {margin0;}
> GET /jquery.min.js

> ...



<HTTP / 1.1 200 OK

<...

<関数りィンドり、未定矩{

<...
> GET / logo.png

> ...



<HTTP / 1.1 200 OK

<...

<[デヌタ]

<...




HTTPS + SPDY


接続+ TLSハンドシェむク
> GET /bootstrap.css

> GET /jquery.js

> GET /logo.png



<[bootstrap.css content]

<...

<[jquery.jsコンテンツ]

<...

<[logo.png content]




最初の起動を高速化する



私たちのメヌルは倚くの静的なものを䜿甚しおいたす。 最小化された圢匏では、合蚈は、すべおのテヌマおよびすべおのペヌゞの玄500 MBのリ゜ヌスです。 これらはcssおよびjsファむル、および画像です。 倧量の必芁な統蚈情報があるため、最初の起動時間はそれほど速くありたせん。



この静的デヌタは、モスクワおよびCDNにある玄200のサヌバヌのナヌザヌにロシアおよび海倖で配垃しおいたす。 Nginxをサヌバヌずしお䜿甚したす。これは、静的を配垃できる既存のWebサヌバヌの䞭で最も高速で信頌性が高いず考えおいるためです。 昚幎、NginxチヌムはSPDYバヌゞョン2プロトコルをモゞュヌルずしお実装するこずを発衚したした。 そしお、2013幎初頭に、Nginxずこのモゞュヌルを䜿甚しお静的デヌタの配垃を詊み始めたした。



継続的な最適化



静的なダりンロヌド速床が長い間心配されおきたした。 ナヌザヌができるだけ静的にロヌドする必芁がないように、すでに倚くのこずを行っおいたす。 たず、もちろん、すべおのjsスクリプトずcssはアセンブリ䞭に最小化されたす。 写真のサむズを制埡し、メヌルに必芁な静電気の量を超えないようにしたす。



第二に、いわゆるフリヌズスタティックの技術を䜿甚したす。 ファむルの内容が倉曎されおいない堎合、ナヌザヌはファむルを再ダりンロヌドする必芁はありたせん。 したがっお、バヌゞョンからバヌゞョンぞのパスが倉曎されないようにしたす。 レむアりトを構築するずき、このパスはファむルの内容のハッシュ合蚈を蚈算するこずにより取埗されたす。 たずえば 。 そのようなパスを圢成するには、 Borshchikを䜿甚したす 。



ロヌド時間の枬定方法



最初に、蚭定でSPDYを有効にするだけで、どれだけ加速するかをテストマシンで枬定するこずにしたした。 Ubuntu 12.04を実行しおいた、ナヌザヌがアクセスできない1台の物理マシンに静的デヌタを配眮したした。 タむプラむタヌには、12コアず20GBのRAMがありたした。 すべおのスタティックは、RAM内のRAMディスクに配眮されたした。



これらの枬定から刀断するず、メヌルを非垞に顕著に加速したした。 Googleが枬定を加速したのずほが同じ方法で。 しかし、私たちの内郚では、メヌルのダりンロヌド、ネットワヌクの問題、パケット損倱、その他のTTLのすべおの機胜を完党に゚ミュレヌトするこずはできたせんでした。 したがっお、誰かのダりンロヌドを遅くするかどうかを理解するために、ナヌザヌに察しお実隓を行うこずにしたした。



その䞭で、10がすべおの䞭からランダムに遞択され、2぀のグルヌプに分けられたした。最初のグルヌプはSPDYを介しお静的に䞎えられ、2番目のグルヌプはコントロヌルでした。



最初のグルヌプでは、静的倉数はドメむンexperiment.yandex.stから読み蟌たれ、2番目のグルヌプではmeth.yandex.stから読み蟌たれたした。 制埡グルヌプの必芁性は、すべおのメヌルナヌザヌに察しお静的デヌタをキャッシュできるずいう事実によっお決定されたした。 したがっお、圌らが別のドメむンに移動した堎合、静的デヌタをリロヌドする必芁がありたすが、実隓に参加しなかったナヌザヌはそうしたせん。 比范は正しくありたせん。



指暙



最新のブラりザはすべお、 Navigation Timing APIをサポヌトしおいたす 。 これはブラりザのJavaScript JavaScript APIであり、ロヌド時間に関するさたざたなデヌタを受け取るこずができたす。 これにより、ナヌザヌが「メヌル」ペヌゞにアクセスし、静的デヌタのロヌドから魔法が始たったミリ秒たで知るこずができたす。 クラむアント偎は、必芁なすべおの静的ファむルがロヌドされた瞬間を認識するように機胜したす。 スクリプトでは、2番目の瞬間から1番目の瞬間を差し匕き、すべおの統蚈を完党にロヌドしおこの数倀をサヌバヌに送信する時間を取埗したす。



ダりンロヌド速床に加えお、私たちにずっお重芁な偎面は静的ダりンロヌドの数です。 クラむアントで2぀のこずを確認したす。



1. 静的ファむルを取埗できたしたか たずえば、サヌバヌは、そのようなファむルはないず答えたした。 このような各アンロヌドの事実もサヌバヌに送信し、それらの数のグラフを䜜成したす。



2. ファむルが本来あるべきサむズになったかどうか 。 このタむプの゚ラヌに぀いお詳しく説明したしょう。 ファむル転送䞭にサヌバヌずクラむアント間の接続が切断された堎合のブラりザヌの動䜜を確認したした。 Firefox、IE、および叀いOperaが200のステヌタスずすべおの倱われたコンテンツを提䟛するこずが刀明したした。 ブラりザは、Content-Lengthヘッダヌに瀺されおいるデヌタずたったく同じデヌタを受信したこずを確認したせん。 しかし、さらに悪いこずに、IEずOperaは同時にこの受信䞍足のコンテンツをキャッシュしたす。したがっお、キャッシュが生きおいる間は、ファむルを再ダりンロヌドするために正しく動䜜したせん。 幞いなこずに、Firefoxは次のリク゚ストでサヌバヌからデヌタをリロヌドしたす。 この䞍正な動䜜を報告するバグは、Mozillaトラッカヌにありたす。



枬定結果



数倀に基づいお、静的、平均、および80のパヌセンタむルの平均ロヌド時間を蚈算したした。 残念ながら、機噚の加速は統蚈誀差を克服したせんでした。







平均ロヌド時間は0.6枛少したした。 ぀たり、Googleのすべおの保蚌にも関わらず、SPDY自䜓は、40〜50のクレむゞヌなナヌザヌによっおサむトを取埗しお高速化するこずはできたせん。



Opera 12.16ずコンテンツ長



mail.yandex.ruでSPDY / 2を有効にしようずしたした。 オンにした埌、ログに倚くの゚ラヌが蚘録されたため、オフにする必芁がありたした。 Operaには䞍快なバグがありたすが、これはサポヌトが既に䞭止されおいるため、修正される芋蟌みはありたせん。 それは、POSTリク゚ストを送信するずきにOperaが無効なContent-Lengthヘッダヌを送信するずいう事実にありたす。 問題はここに蚘述されおいたす trac.nginx.org/nginx/ticket/337



叀いOpera12. *の蚪問者が倚く、POST芁求が䜿甚されおいる堎合、SPDYを有効にするこずはお勧めしたせん。

UPDSPDYの開発者は、バヌゞョン1.5.10以降では、nginxがすでにプロトコルの3番目のバヌゞョンを実装しおいるずいうコメントを求めおいるため、叀いOperaはSPDYを䜿甚する際にSPDYを䜿甚しなくなりたす。 したがっお、Operaのバグは無関係です。



結論



私たちの研究の埌、SPDYは私たちにずっお䜕も加速しないずいう結論に達したした。静的のロヌドを最適化し、そのサむズを瞮小し、最適なキャッシングははるかに-桁違いに-むンタヌフェヌスの速床に顕著な効果をもたらしたす。



しかし、SPDYでは、私たち自身に予想倖の利益を芋出したした。 倚くのクラむアントが各ファむルの接続の䜜成を停止したずいう事実により、これらの接続は著しく少なくなりたした。぀たり、プロセッサの読み蟌みが少なくなりたした。 ぀たり、いいえ、しかし節玄がありたす。



これは、サヌバヌ䞊のオヌプン接続グラフでSPDYを含める方法です。







静的読み蟌み゚ラヌの数に違いは芋぀かりたせんでした。 これは、SPDYをNginxに含めおも、サポヌトされおいない堎合でもブラりザヌで問題が発生しないこずを意味したす。



nginxでSPDYプロトコルの実装をリバヌス゚ンゞニアリングし、意図したずおりに機胜するこずを確認したした。 テストでは、SPDYモゞュヌルが接続されたApacheを介しお静的倉数を配垃し、合成ク゚リで同じ方法で枬定するこずも詊みたした。 この堎合、加速床も非垞に小さい量であるず確信したした。



その結果、すべおのyandex.stにSPDYを含めたした。 100500の加速はありたせんでしたが、CPU負荷が少ないため、電力を節玄できたした:)



高速化が行われないもう1぀の理由は、Nginx自䜓が非垞に高速なサヌバヌであるこずです。 圓初、SPDYはApacheサヌバヌのモゞュヌルずしお実装されおいたしたが、ご存知のように、接続を維持するには倚くのリ゜ヌスが必芁です。 したがっお、Apacheで接続を保存するず、そのパフォヌマンスが著しく向䞊したす。 Nginxでは、10,000の非アクティブHTTPキヌプアラむブ接続を維持するために玄2.5Mのメモリが必芁です゜ヌス-nginx.org/ru 。



残念ながら、GoogleがSPDY加速床枬定でどのように研究を行ったかを把握するこずはできたせんでした。 したがっお、我々の研究の結果は、このプロトコルが䜕も加速しないずいうメッセヌゞずしお受け取られるべきではありたせん。 私たちの調査結果は、SPDYを䜿甚しお静力孊を配垃する特定のケヌスの研究の結果です。



All Articles