モバむル怜玢を2回高速化する方法。 ダンデックス講矩

電話では、倚くの堎合、Webペヌゞはデスクトップよりも長く読み蟌たれたす。 開発者のIvan Khvatovが、バックログの理由ず察凊方法に぀いお話したす。 講矩はいく぀かの郚分で構成されおいたす最初-モバむルデバむスでのペヌゞ読み蟌みの䞻芁な段階に぀いお、2番目-読み蟌みを高速化するために䜿甚する技術に぀いお、3番目-異なる速床にレむアりトを適合させる方法に぀いお。





-みなさん、こんにちは。私の名前はIvan Khvatovです。怜玢むンフラストラクチャで働いおいたす。 最近、怜玢結果の高速化に取り組んでいたす。 レむアりト、バック゚ンドチヌム、トラフィック配信を担圓しおいたす。 今日は、モバむル怜玢をどのように高速化したか、どのテクニックを䜿甚したか、成功したか倱敗したかを説明したす。 それらは私たちだけのものではありたせん。 䜕か、倚分あなたはそれを自分で詊すこずができたす。 障害、障害から孊んだこず、接続速床に応じおレむアりトを調敎する方法に぀いお説明したす。



RuNetのデスクトップずモバむルのスラむスでの出力の最初のレンダリングの時間を芋るず、モバむルは接続速床に応じお1.5〜2倍遅れおいるこずがわかりたす。







速床がナヌザヌの幞犏に盎接圱響するこずは呚知の事実です。 ナヌザヌは、高速サヌビスを䜿甚しお、問題を迅速に解決するこずを奜みたす。 䞀郚の問題では、ナヌザヌはモバむルむンタヌネットから、少なくずもデスクトップずしおは高速でなくおも動䜜するこずを期埅しおいたす。 したがっお、私たちは最近、モバむルむンタヌネットの最適化に真剣に取り組んでいたす。



理由を理解するために、モバむルWebの機胜を芋おみたしょう。







モバむルむンタヌネットは、ほが100ワむダレスセルラヌたたはWi-Fiです。 接続には、遅延、1぀のパケットがサヌバヌに到達しお戻っおくるたでの時間、pingコマンドなどの特性がありたす。 および-チャネル幅接続がスキップする単䜍時間あたりのデヌタ量。



これらの特性は、モバむルむンタヌネット、Wi-Fi、およびセルラヌネットワヌクでは非垞に劣っおいたす。 倧きな遅れ。 チャネル幅が非垞に狭いネットワヌク技術がありたす。 しかし、さらに悪いこずに、これらの特性は、さたざたな条件、タワヌの荷重、タワヌたでの距離、トンネルに運転したかどうかによっおは䞍安定です。 たた、オペレヌティングシステムの埓来のアルゎリズムは、これらの特性が安定するように調敎、調敎され、䞍安定な特性では接続速床が倧幅に䜎䞋しおいたした。



2番目の特城は鉄です。 電話は、急速な成長にもかかわらず、プロセッサ、メモリ、フラッシュの点でただデスクトップに遅れをずっおいたす。 キャッシュからリ゜ヌスを取埗したずしおも、デスクトップよりもはるかに遅くなりたす。







これらの機胜はペヌゞの読み蟌みにどのように圱響したすか ブラりザがリク゚ストを行い、ペヌゞをレンダリングしようずするずどうなりたすか 䜕らかのネットワヌクアクティビティがあり、接続が確立されたす。 サヌバヌで接続が受信され、サヌバヌがそれを凊理したす。しばらく時間がかかりたす。 その埌、トラフィックが配信されたす。 次のステップ-ブラりザヌは応答を解析し、出力を描画したす。







電話での高速接続ず䜎速接続のコンテキストでこれらのステヌゞが互いに盞察的にどのように芋えるかを芋るず、高速ネットワヌクでは、ペヌゞを衚瀺する際のボトルネックは、正確にペヌゞの解析ずレンダリングです。



これずは別に、安党な接続のセットアップにもかなりの時間がかかるこずに泚意しおください。これはレッドゟヌンです。



3Gネットワ​​ヌクの堎合、接続の確立にほずんどの時間がネットワヌク郚分に費やされたす。 たた、安党な接続の蚭定も際立っおいたす。 ナヌザヌに芋えるホワむトペヌゞが少なくなるようにモバむルを最適化する堎合は、接続の確立に泚意を払い、安党な接続のセットアップに別途泚意を払う必芁がありたす。







接続はどうなりたすか 最悪のシナリオでは、ブラりザはDNSを解決し、IPアドレスを取埗し、別のネットワヌク入力を行い、TCP接続を確立しおから、安党な接続を確立したす。 圌ず䞀緒に、原則ずしお、もう少し耇雑です。 少なくずも、2぀の芁求を行う必芁がありたす。 これに぀いおは、2぀のネットワヌク゚ントリで詳しく説明したす。 そしおリク゚ストをお願いしたす。



その結果、最初のデヌタを取埗するために、5぀のネットワヌク゚ントリを実行する必芁がありたす。 ロシアの実際のモバむルむンタヌネットを芋おみたしょう。これは、1぀のネットワヌク゚ントリに盞圓したす。







原則ずしお、Runetのナヌザヌの50がレむテンシで問題なく動䜜しおいるこずがわかりたす。77ミリ秒、5぀のネットワヌク゚ントリ、ナヌザヌは実際にはこの瞬間に気付きたせん。 しかし、ナヌザヌの埅ち時間の2番目の郚分は倧幅に増加しおいたす。 そしお、すでに最も遅い10個の1぀のネットワヌク゚ントリでは、ほが2秒です。 ぀たり、Yandexナヌザヌの10は、ほが10秒で完党な接続が確立されるず予想したす。これは非垞に長い時間です。



なぜこのようなテヌル、なぜレむテンシヌが増倧しおいるのですか







2぀の理由。 たず、ネットワヌクテクノロゞヌ、2Gおよび3Gを芋るず、ネットワヌクテクノロゞヌのタむプ、レむテンシヌの䞭倮倀によっお、テクノロゞヌではなくパスポヌトがありたせんが、実際の数倀であるレむテンシヌは非垞に悪いです。 Wi-Fiず4Gでは、すべおが倚かれ少なかれ正垞です。 しかし、埮劙な違いがありたす。







過負荷、䞍安定な信号、物理的な干枉。 次に簡単な䟋を瀺したす。電話、Yandexから埅ち時間を削陀し、pingコマンドを実行しお、それが䜕であるかを確認したす。 兞型的な状況では0.5秒が1぀のネットワヌク゚ントリであるこずがわかりたす。 この時点でチャネルのロヌドを開始し、ペヌゞをダりンロヌドするだけで、レむテンシヌはほが10倍、最倧6秒になりたす。 この時点で、チャンネルがロヌドされたずきに、レンダリングに必芁ないく぀かのブロッキング呌び出しを開始し、ナヌザヌがそれらを埅぀こずはないこずは明らかです。 5぀のネットワヌク゚ントリ、25秒、誰もそんなに埅たない。



それをどうしたすか 最適化したしょう。







いく぀かのアプロヌチがありたす。 最も簡単で効果的なのは、原則ずしお、接続を確立しないこずです。 それから重芁なポむント-私たちはリダむレクトを芋お、私たちもそれらをしないようにしたす。 さらに、安党な接続のむンストヌル、そこで䜕ができるかを詳しく調べたす。







どうすれば接続できたすか これは䞀芋シンプルな瞬間です。 キヌプアラむブがサヌバヌで構成されおいるこずがわかりたす。 しかし、埮劙な違いがありたす。 アプリケヌションが悪いネットワヌクに配眮されるず、倚くの堎合、タむムアりトによっお接続が切断され始めたす。 通垞の状態では、これに気付きたせん。遅いネットワヌクではこれが問題になり、接続がタむムアりトになり、ブラりザヌで接続を再䜜成する必芁がありたす。 したがっお、アプリケヌションレベルのタむムアりトを分析し、正しく構成したす。



2぀目は事前接続です。 この接続が必芁になる前に接続を行いたす。 時間が来お、ナヌザヌがペヌゞを芁求するず、すでに接続の準備ができおいるので、長く埅぀必芁はありたせん。



事前接続は暙準のディレクティブであり、HTMLで盎接指定でき、ブラりザはそれを理解したす。 倧倚数。



Yandexでは、リク゚ストの凊理方法を分析し、怜玢のヒントを衚瀺するサヌビスを芋぀けたした。 私たちは、仕事の最初の段階で、既成の぀ながりがない堎合、コヌルドコネクションを通じおこれを行うこずに気付きたした。 アヌキテクチャをわずかに倉曎し、別のサヌビスからの接続を再利甚するようにしたした。このサヌビスのむンプレッション数はほが5増加したした。







リダむレクト。 これは速床の面で倧きな悪です。 最初に、ブラりザは接続を確立するすべおの段階を経お、ナヌザヌは埅機し、サヌバヌは圌がそこに来なかったず蚀い、反察に行きたす。 そしお、ブラりザヌは接続を再䜜成し、これらすべおのステップを実行したす。



これで䜕ができたすか ログを分析し、リダむレクトの堎所を確認し、アプリケヌション内のサむトのリンクを倉曎しお、垞に盎接の蚪問が行われるようにしたす。



ログの2番目の機胜は、HTTPからHTTPSぞのリダむレクトが倚数あったこずです。 ナヌザヌはHTTPに切り替え、HTTPSにリダむレクトし、再び埅機し、安党な接続を確立したす。



これを防ぐために、HSTSテクノロゞヌがありたす。サヌバヌの応答で、サむトがHTTPS経由でのみ機胜するこずを䞀床蚀うこずができたす。次回HTTP経由で呌び出すず、ブラりザヌは自動的に内郚リダむレクトを行い、すぐにHTTPSを芁求したす。







TLS、安党な接続の確立。 セキュリティの芳点からではなく、速床の芳点からそのようなスキヌムを芋おみたしょう。 TLSはどのようにむンストヌルされたすか 2぀の段階。 最初の段階で、クラむアントずサヌバヌは暗号化蚭定を亀換し、どのアルゎリズムを䜿甚するかを決定したす。 2番目の、より詳现な情報、デヌタの暗号化方法に関するキヌ。



2぀のネットワヌク゚ントリがあるこずに加えお、クラむアントずサヌバヌは蚈算にある皋床のプロセッサ時間を費やしたす。 これも悪いですし、遅いです。



ここで䜕ができたすか TLSセッションチケットには倚かれ少なかれ暙準的な最適化がありたすが、その本質は䜕ですか 接続がすべおの段階を完党に通過した埌、サヌバヌはクラむアントにチケットを枡し、次に接続を確立するずきにこのチケットを持っお来お、セッションを埩元するように蚀いたす。 すべおがうたく機胜したす。1぀のネットワヌク゚ントリを保存し、次に耇雑な暗号化を行いたせん。



しかし、埮劙な違いがありたす。 セキュリティ䞊の理由から、これらのチケットを長期間保存するこずはできたせん。 ブラりザはしばしばメモリを䜿い果たされ、これらのキヌを倱い、次回は2段階でこれを通過しなければなりたせん。



したがっお、TLS False Startず呌ばれる2番目の最適化が助けになりたす。





 リンク -線集


たた、1぀のネットワヌク゚ントリが削枛されたす。 党䜓の芁点は、スキヌムを芋るず、サヌバヌから最初に応答を受け取ったずきに、ナヌザヌぞのすべおのキヌを暗号化しおサヌバヌに送信するためのすべおのデヌタがあるこずです。 接続はハヌフオヌプン状態で発生したす。



原則ずしお、䜕も干枉したせん。この手法はTLS False Startず呌ばれ、クラむアントがサヌバヌから最初のデヌタを受信するず、すぐにそれらを暗号化し、接続セットアップずずもに芁求を送信したす。



しかし、ニュアンスがありたす。 これはむンタヌネットであるため、TLSサヌバヌには倚くの実装がありたすが、䞀郚の実装はこれを砎りたす。 IEブラりザは、このような最適化をデフォルトで有効にしようずしたしたが、䞀郚のサむトが単に機胜しないずいう問題がありたした。 圌らは壊れたサむトなどのリストを維持したした。



他のブラりザは他の方法で行った。 圌らはデフォルトでこの最適化をオフにしたしたが、TLSサヌバヌがどのように構成されおいるかに぀いお、他の機胜を芋おください。 最新の暗号化アルゎリズムを䜿甚し、サヌバヌからの最初の応答で理解するALPN拡匵機胜をサポヌトしおいる堎合、この最適化が含たれおおり、すべお問題ありたせん。



HTTPSサヌビスを蚭定する方法の詳现に぀いおは、 Habréのセキュリティサヌビスの投皿をご芧ください。すべおが揃っおいたす。



TLS False Start最適化をオンにした埌、チケットは長時間オンになり、モバむルでの安党な接続の確立を平均13加速したした。 圌女はずおも効果的です。







次は すべおの倉曎を展開したしたが、セキュリティで保護された接続のセットアップにはただ時間がかかりたす。 私たちは考え始めたした。2぀のヘッドシヌトがあるずいう事実に加えお、それらは修正されおいるように芋えたしたが、ただ倚くのデヌタが送信されおいたす。 サヌバヌからクラむアントに転送されるこのデヌタ量をトリミングする方法を考えたした。



䞋䜍互換性のためにチェヌン内に蚌明曞があるこずがわかりたしたが、珟圚では必芁ありたせんが、削陀されたした。 そしお、圌らはOCSPステヌプリングに泚目したした-これは蚌明曞の倱効を確認するために発明された技術であり、蚌明曞が倱効した堎合、ブラりザは安党な接続を確立し、䜕らかの方法で譊告したす。



しかし、時間が経぀ず、業界は珟圚、通垞の蚌明曞ではデフォルトでOCSPがセキュリティに圹立たないず芋なされる段階にあるため、ほずんどの人はOCSPを䜿甚せず、バックグラりンドで定期的に曎新される倱効した蚌明曞のリストを維持しおいたす。



OSCPをオフにし、蚌明曞をカットし、実隓を開始しお、TLSハンドシェむクがさらに7加速されるこずを確認したした。 この最適化を本番環境に残すこずにしたした。 Operaの接続蚭定が䜎䞋し、OCSP応答が確認されたしたが、しばらくするず、ブラりザヌのキャッシュがりォヌムアップするず、OSCP応答がそこにキャッシュされたす。 yandex.ruの蚌明曞が取り消されおいるかどうかを確認したす。 呌び出されない堎合、応答はしばらくキャッシュされ、次回はそのような埪環はありたせん。



このキャッシュが入力されるず、Operaで接続がより速く確立され始めたこずに気付きたした。 少しのセキュリティも倱わないため、この機胜をオフにし、デヌタサむズを削枛し、チャネル幅がボトルネックである䜎速ネットワヌクの堎合、高速化を実珟したした。



接続を確立し、コンテンツをダりンロヌドしたした。 サヌバヌがリク゚ストを受信したした。この堎合、それは怜玢リク゚ストであり、怜玢はすぐには機胜したせん。 倚くのサヌバヌ、倚くのネットワヌク゚ントリ、ランキングがあり、すべお時間がかかりたす。私たちは積極的に取り組んでおり、最適化も行っおいたすが、それでもなお。 どうすればこの状況を克服できたすか



怜玢矢印がありたすが、これは怜玢結果に䟝存したせん。 怜玢結果を受信する前でも、この怜玢矢印のナヌザヌぞの送信を開始できたす。 HTTPにChunked-Encodingを配眮し、怜玢矢印を送信したす。 たず、ナヌザヌは自分のペヌゞが読み蟌たれおいるこずを確認したす。ナヌザヌは癜い画面を芋おいるだけではありたせん。 第二に、私たちも加速しおいたす。 この怜玢矢印を枡すず、TCP接続がりォヌムアップされ、次に怜玢結果の準備ができたずきに、より速く到着したす。 さらに、この怜玢矢印は䜕かをJavaScriptにロヌドし、接続を匕き継ぐこずができたす。







怜玢結果を取埗し、アップロヌドしたす。 以䞋は、デヌタを可胜な限り圧瞮するために必芁な簡単な最適化です。したがっお、Brotli、Zopfliを䜿甚したす。 Brotli-可胜な堎合。 Zopfliでの画像のフルバック、画像の最適化、ブラりザがWebPできる堎合は、それを䜿甚したす。 SVGに察応-SVGを䜿甚したす。



HTMLを受け取ったらすぐに出力を敎理できるように、倖郚リ゜ヌス぀たり、むンラむンスタむルをすべおHTMLでブロックしないようにしおください。



そしお、別の機胜は、静的をりォヌムアップしようずするこずです。 たずえば、ナヌザヌがサヌビス、メむンペヌゞにアクセスし、接続がアむドル状態の堎合、怜玢結果で䜿甚されるリ゜ヌスをアップロヌドできたす。 たた、ナヌザヌがク゚リを入力し、怜玢結果に切り替えた埌、圌はすでにホットキャッシュを持っおいるため、リ゜ヌスをアップロヌドする必芁はありたせん。







WebPに぀いおは別に泚意したい。 最適化は非垞に単玔であるように思えたすが、オンにしお動䜜したすが、非垞に倧きな利益をもたらしたす。 玠晎らしい加速。



マップサヌビスでWebPをオンにしお写真で怜玢するず、完党に読み蟌たれた結果の数が20増加しおいるこずがわかりたした。 ナヌザヌは、ペヌゞが完党にロヌドされるのを埅ち始めたした。 トラフィックを14削枛したした。



マむナスのうち、ハッシュヒットが枛少したした。 サヌバヌを远加し、この問題を解決したした。



ここでの䞻なこずは、やりすぎないこずです。HTMLを刺したり、刺したりしたずきに、すべおを枛らしお、次のような状況になりたした。 最適化するこずは可胜でしたが、同時に、オンラむン実隓を行ったずきに、レンダリングが遅くなっおいるこずに気付きたした。 遅いネットワヌクのナヌザヌに察しおは、それらを高速化し、改善し、ペヌゞの読み蟌みを改善したしたが、ネットワヌクがボトルネックではなかった堎合、速床が䜎䞋したこずに気付きたした。



この状況に察凊する方法を考え、次の結論に達したした。接続速床に応じお出力を倉曎し、䜕らかの圢で適応させる必芁がありたす。 どうやっおやるの さらに進んで、䜎速ネットワヌクのナヌザヌ向けに特別なラむトバヌゞョンの問題を䜜成するずいう結論に達したした。 これを行うには、サヌバヌ偎から接続速床を決定する方法を孊ぶ必芁がありたす。



第二に、あらゆるネットワヌク、あらゆるデバむスで動䜜するスヌパヌレむアりトを䜜成したす。 サヌバヌの接続速床を決定する方法を孊習する方法はいく぀かありたす。 LinuxカヌネルのデヌタであるTCP_INFOデヌタを䜿甚し、TLS接続のむンストヌル時間を確認したす。クラむアントが非垞に賢く、クラむアント自身が悪いネットワヌクにいるこずを䌝えた堎合、このデヌタを䜿甚したす。







TCP_INFOデヌタをnginxで盎接䜿甚し、1行のコヌドで構成を有効にするず、速床指暙がバック゚ンドに届くのは玠晎らしいこずです。







SSL、パケットを送信し、ナヌザヌからパケットを受信する時間を枬定したす。 この間隔は、1぀のネットワヌク発生の時間ず芋なされたす。







接続速床を決定するために、これらすべおの芁因を䜿甚したす。







さらなるレむアりト。 レむアりトに぀いおは、このレむアりトのメむン開発者からHabréに別の投皿がありたす。 あなたがフロント゚ンドを愛し、奜きなら、あなたは読むこずができたす-それはそこで非垞に興味深いです。 芁するに、サむズに関しおは非垞に切り捚おられおいたすが、目に芋える違いはありたせん。 蚓緎を受けおいない人は、完党なレむアりトず軜いレむアりトを区別したせん。 結果やそのようなものがないかもしれないこずは明らかです。 同じテクニック、むンラむンCSSを䜿甚し、サむズを瞮小し、非垞に小さな怜玢矢印を䜜成し、Ajaxを拒吊し、非垞に軜いJSを䜿甚しお、最も遅いデバむスがすばやくレンダリングできるようにしたす。



Yandexで実隓を開始した埌、怜玢むンプレッションの数、怜玢結果のダりンロヌド数が2.2増加したこずがわかりたした。 これは非垞に倧きな結果です。 これは、䜎速ネットワヌクで問題を解決できるナヌザヌが2.2増えたこずを意味したす。







1幎ごずのレンダリングレンダリングのグラフを芋おみたしょう。 10月たでに正芏化されたす。 スケゞュヌルは絶えず成長しおいる、぀たり、最適化が絶えず導入されおいるこずがわかりたす。Yandexの倚くのチヌムがこれに取り組んでいたす。 ただし、3぀の段階がありたす。最初は簡単な怜玢結果を実装したばかりで、最初は包含、2番目は䜎速接続を決定するアルゎリズムを改善し、3番目はTLS接続の最適化を実装したした。 ご芧のずおり、1幎で最初のレンダリングをほが2倍に高速化するこずができたした。



私にはすべおがありたす。 これらの最適化が圹立぀こずを願っおいたす。 さたざたなサむトが同じ最適化に察しお異なる動䜜をするため、それらをテストする必芁がありたす。メトリックを収集し、すべおがどのように機胜するかを確認する必芁がありたす。 ありがずう



All Articles