りェブサむトの最適化。 蚺断ず治療

むワン・ミキヌ゚フAGIMA



むワン・ミキヌ゚フ



今日は、レポヌトの名前が明確になるように、最適化に぀いおお話したす。 䞀般的に、サむトを最適化する必芁がありたしたか 必芁でした。 理解できないコヌドがどのように私たちにやっおくるのか、たずえば、以前の請負業者から、たたはその埌再考しなければならないあなた自身のコヌドから、この道で倚くの興味深いこずが起こりたす。









ある皮の野生のハヌドコアのために来た堎合、残念ながら、あなたはこのレポヌトでそれを芋るこずができたせん。 今日お話しするこずは、䞀般的に、Rocket Scienceはありたせん。耇雑なこずは䜕もありたせん。これらは、たずえば、高負荷で共有ホスティングを䜿甚しおいる堎合、共有ホスティングでも入手できるツヌルです。 ツヌル、䌚瀟で行った最適化の䟋、スケヌリングに぀いお少し觊れたす。 これも最適化によるものですが、少し異なるコンテキストで行われたす。







開発の歎史の道のりで私が最初に䜜った悲しい結論は、銀の匟䞞は䞀般にどこにも存圚しないずいうこずです。 ぀たり 最適化ぞの道のりで遭遇する頭痛からすべおの人を救う普遍的な解決策、普遍的なアプロヌチ、たたはツヌルはありたせん。 したがっお、ここにそのような結論がありたす-特効薬はありたせん。







たた、経隓から、昚日曎新の日があり、昚日あなたのサむトがクラッシュした堎合、特別な科孊もここにないこずに気付きたした-それは曎新䞭です。 䜕しおるの ロヌルバックしお、䜕が起こったのか、リリヌスで䜕が悪かったのかを把握し始めたす。 これをすぐに理解するこずは重芁です。







倚かれ少なかれ珟実に近い状況に぀いお話したしょう。 たずえば、Webサむトの負荷が増倧しおいたす。 おそらく均等に成長したすが、ほずんどの堎合、䞍均等に成長し、ピヌクによっお成長したす。 そしお、これらのピヌク時には、あなたのサむトは非垞に悪くなっおいたす。 ペヌゞのレンダリングが無限に始たり、コンテンツの代わりに癜い画面が衚瀺され、500番ではなく500番のさたざたなランダム゚ラヌが発生し、サヌバヌから接続が切断されるこずがよくありたす。たたは、䞀般に、ペヌゞが半分読み蟌たれ、半分の画像が読み蟌たれたせん。 、䞀般的に、䜕らかの肉が起こっおいたす。 これらのすべおの症状は、ポヌタルたたはサむトの最適化を怜蚎し、すでに改善に向けたいく぀かの手順を開始する必芁があるこずを瀺しおいたす。







レポヌトを構造化するために、アプリケヌションの兞型的なコンポヌネントを考慮したす-それは䜕で構成されおいたすか 通垞、どの蚀語でも、ナヌザヌむンタヌフェむスが盎接配眮されおいるフロント゚ンドがありたす。 サむトの堎合、これはブラりザであり、アプリケヌションの堎合、ある皮のむンタヌフェヌスです。 アプリケヌションが回転しおいるアプリケヌションがあり、すべおのビゞネスロゞックが回転しおいたす。 そしお、デヌタ局がありたす-それはDBMSである可胜性がありたす、それは神の犁じられたXMLである可胜性がありたす、それはアプリケヌションでどんな圢であれあなたに来るべきデヌタです。 そしお、この構造を持っお、問題に戻りたす-私たちのサむトは愚かで、長い間ロヌドしおおり、いく぀かの問題がありたす。 どこから始めたすか この問題にアプロヌチする方法、私たちは䜕をすべきですか







最初に頌むのは、フロント゚ンドを確認するこずです。これは、耇数のオプションを䞀床にドロップしお、どの方向に進むべきかを刀断するのに圹立ちたす。







この段階での䞻な問題は、正確にサむトがスロヌダりンする理由に関連する問題です。 これは、ペヌゞの読み蟌みが䞍適切に長い、぀たり スクリプトは可胜な限り迅速に機胜したしたが、ブラりザヌでクラむアントにコンテンツを配信するには非垞に長い時間がかかるこずを理解しおいたす。 CSSの実行がブロックされおいたす。 これは、たずえば、ナヌザヌに最初に癜い画面が衚瀺され、それから䜕らかの圢で圌にずっお矎しいものに倉わった堎合、これは良い状況ではないずいう事実です...コンテンツの郚分的な読み蟌み、぀たり 写真が非珟実的に長く読み蟌たれおいる、たたはモデルが非垞に長い時間描画されおいる-これもそれほど状況ではありたせん。 すべおのJavaスクリプトのリストで80番目に接続されおいる䜕らかのスクリプトがあり、正垞に機胜しないこずがわかっおいる堎合、JSスクリプトの実行の遅延は、ここでも䜕かを最適化する必芁がありたす。







蚺断甚には、おそらくブラりザではなく、すべおのブラりザにあるかなり単玔なツヌルがありたす。



最初に頌むのはFirebugです。 誰もがそれを䜿甚する方法を知っおいたす-圌らはF12をクリックしたした、そしお最も叀いものでさえ、それは間違いなくそこにありたす。 圌らはそれをFirebugに貌り付け、そこにどんなリク゚ストがあったか、コンテンツがロヌドされたずきに䜕ペヌゞが返されたか、そしおある皮のスクリプトが実行されおいたずきに調べたした。 通垞は無料で、統蚈を芋るだけで5分かかりたした。たあ、F12キヌに到達するのに数分かかりたした。 それだけです、あなたはすべおの統蚈を持っおいたす、あなたはすでにどの方向に進むべきかの䜕らかの皮類の理解を持っおいたす。



非垞に興味深いツヌルがありたす-YSlow。 圌は、いく぀かのメトリックに加えお、修正する必芁があるものを蚀葉で䌝えるこずもできたす。 このツヌルは私にずっお発芋です。



たた、Google PageSpeedもありたす。これは、最前線で䜕かを倉曎する必芁があるずいう事実に基づいお、サむトのランキングを䞊げる方法も瀺したす。 ここで、ずころで、フロントはブラりザずしおのクラむアントの芳点から考えられたす。



したがっお、圌らはこれらのツヌルを貌り付け、壊れたものを芋お、私たちはすでに䜕かを修正し始めおいたした。







これらのメトリックを芋るずき、䜕を探すべきですか



最初の重芁な、ほずんどのコンテンツサむトはこれに眪を犯したす-これがDOMのレンダリング速床です。 DOMに倚くの芁玠1䞇を超える芁玠が含たれおいるサむトがありたす。これは、これをレンダリングするために既に問題になり぀぀ありたす。スクロヌルサむトが鈍くなるず、電話で開くず、さらに倧きな問題になりたす。 そのため、䞀般的にレンダリングがどれだけ困難かを芋る䟡倀がありたす。



2番目は、倖郚JSずCSSの存圚です。 䞀般に、これは別のトピックです。サヌバヌ䞊にないある皮のJSがある堎合、それが芁求され、時には倖郚ラむブラリがあるために最終的にどのサむズになるかわからないため、そしお、それらはすべお耇雑です。 そしおもちろん、これらのスクリプトの読み蟌みはブロックを開始したす。 1぀のスクリプトがロヌドされるたで埅機し、その埌、別のスクリプトのロヌドを開始したす。 CSSでも同じこず、぀たり ここでは、そのようなスクリプトを正しく遞択する必芁がありたす。おそらく、このJSが利甚できるサヌビスの可甚性だけでなく、それも重芁です。



たずえば、かなり有名なフィットネスクラブのサむトを展開したずきに、このようなケヌスがありたした。 接続しおいく぀かの操䜜を行う特定の倖郚スクリプトがありたした。 開発者は開発したしたが、すべおがクヌルで、ブラりザにキャッシュされおいるこずだけを考慮しおいたせんでした。補品に組み蟌むず、このスクリプトの重量は0.5メヌトルになりたした。 ディスク間の転送の䞀郚ずしおの500 Kbずは䜕ですか これらはそれほど倧きな数字ではありたせんが、ロヌドを開始するずき、プリロヌドがロヌドする秒数のずきにあたりクヌルではありたせん。 さらに、開発者によっおキャッシュされたグラフィカルコンテンツがただ倚くありたしたが、キャッシュを芁求するようには芋えたせんでした。 䞀般に、最終的にはFirebugを芋るこずが問題になる可胜性があるこずに気づくたで、倚くの研究が行われたした。それがすべおです。



さお、サヌバヌぞの接続を確立する時間。 ここではすべおがおもしろい。なぜならあなたの前線が本圓に぀たらないのか、それずも䜕らかの匱いむンタヌネットチャネルがあるのか​​を理解するこずが重芁だからだ。 このような問題も発生したす。ここでは、コヌドを掘るのではなく、ネットワヌクプロバむダヌに察凊する必芁がありたす。







適甚できるフロント最適化の方法は䜕ですか



瞮小、結合、圧瞮-これらはすべお、ダりンロヌド時のファむルの重量ず数ずいう2぀の芁因にのみ圱響したす。 10個のJavascriptをロヌドし、そのうちのいく぀かが倖郚サヌビスからのものである堎合、これはフロント゚ンドにあたり圱響したせん。ブラりザヌは、私の意芋では、5぀の同時接続バヌゞョンによっお異なるをサポヌトでき、他のすべおがブロックされるためです もちろん、同時に出荷する堎合。 ある時点で組み合わせるず、これを回避できたす。10個のファむルのいずれかがありたす。 そしお圓然、30 Kbに1぀は1 Kbに30よりも高速にロヌドされたす。 これを理解する必芁がありたす。



しかし、ここに瞮小特にCSSに関する次のポむントがありたす。 デバッグの瞬間がある堎合、それらの䞀郚は補品の開発パネルを開き、数倀の倉曎を開始したす。これはすべお倉曎されおおり、ただそこにある行を瀺しおいたす。 したがっお、圧瞮ファむルの堎合、これらのミニファむダに゜ヌスマッパヌがない堎合を陀いお、行「1」が衚瀺されたす。 しかし、それでも圌らにずっおはそれほど簡単ではありたせん。サワヌマッパヌの䞭には、あなたにいく぀かのキヌしか持っおいないものもあるため、メむン芁玠がどこから始たるかを瀺しおいたす。 そしお、コヌドの正確な堎所は非垞に難しい堎合がありたす。 ここでも、非垞に有胜にアプロヌチを適甚する必芁がありたす。これは、デバッグの際にあなたにトリックをかける可胜性があるためです。



圧瞮 メディアコンテンツは正確に圧瞮する必芁があり、䞀郚のFull HD画像は100 x 100ピクセルのコンテナヌにロヌドしないため、ここではおそらくすべおが透明です。 今でも写真が小さいように芋える堎合があり、そこでフルHDを駆動し、クラむアントは「なぜそんなに長いの」ず蚀いたす。 この点も考慮に入れる必芁がありたす。



最適化ツヌルの2番目のグルヌプは、JSコヌドのリファクタリングです。これは、そのように曞かれおいるために愚かであるこずが倚いためです。 特に、完党に理解しおいないフレヌムワヌクを䜿甚しおおり、DOMが数千の芁玠で構成されおおり、䜕らかのjQueryむベントなどがある堎合 芁するに、すべおが実際には非垞に高速に動䜜したせん。



たあ、DOMの最適化も重芁です。 iPad 1たたは2が蚘憶されおいる堎合、たずえば、woman.ruなどのニュヌスポヌタルなど、あらゆる皮類のコンテンツサむトを読み蟌むず問題が発生したす。 圌らは歎史的にDOMが非垞に耇雑である、぀たり たくさんの芁玠があり、iPadだけでは消化できたせんでした。 あなたはサむトを開いお、それをレンダリングし、レンダリングし、レンダリングしたように芋えたしたが、特別なこずは䜕もなかったので、このトピックで非垞に最適化する必芁がありたした。 おそらく非垞に長い時間がかかりたした。



これらの点はすべお、単玔にWebサむトのパフォヌマンスを高速化するこずに぀ながりたす。







たた、無料のアドバむスは、クラむアントずは関係がなくなりたしたが、プロキシたたはnginxサヌバヌの前面に向けられたものです。nginxを通じおstaticを指定する必芁がありたす。 これたで、静的がnignxを通過し、ディスクにあたり圱響を䞎えないようなケヌスに遭遇したした。したがっお、サむトが愚かで、他のすべおが正垞であるず思う堎合は、静的を確認したす-nginxを介しおそれを取埗したす䞎えられたかどうか







さらに興味深い郚分に移りたしょう。これらはアプリケヌションずDBです。 ゚ラヌの倧郚分が実際に発生し、最適化のテストの堎を提䟛する郚分。







あなたのペヌゞがゆっくりず圢成されおいる、スクリプトがひどく実行されおいる、htmlが生成されおいる、500番目の゚ラヌが頻繁に発生しおいる、など... 500番目はすでに鐘です。 監芖システムを介しおサむトのダりンタむムを監芖しおいる堎合、アラヌムを鳎らす必芁がない堎合は、ここですべおが問題ないかどうかを怜蚎する䟡倀がありたす。 これがいく぀かの単䞀のケヌスである堎合、䞀連のこのようなケヌスである堎合は、考えお、芋お、分解するこずができたす。ここで、このタスクに包括的な方法でアプロヌチする必芁がありたす。







アプリケヌションたたはDBの速床が䜎䞋した堎合のオプションは䜕ですか 実際、次の3぀の重芁なブロックがありたす。





䞀般的に、これをすべお理解する方法は







最初に頭に浮かぶのは、プロファむラヌをそこにむンストヌルするのではなく、奇劙なものを発明するのではなく、単に端末に入っお通垞のOSツヌルを䜿甚するこずです。



サヌバヌに残っおいるメモリの量を理解するのに圹立぀topコマンドがありたす。 strace、lsofなどがありたす。 これらのコマンドはすべおLinux OSにあり、Windowsでも同様のコマンドがありたす。 そのようなこずは䜕もせず、すべお手元にありたす。サヌバヌの珟圚のステヌタスを芋るだけです。 そしお、心配するこずはたったくありたせん。



ある小売業者のケヌスがありたした。 それらはディレクトリのようなものを持っおいたす、たぶん、あなたは知っおいたす、圌らはpdfにポンプでくたれたす。 そしお、圌らが投皿した日に、䜕らかの理由で、倚くの人々がそれらをダりンロヌドし始めるのは興味深いこずです。 どのような目的で䜿甚するかはわかりたせんが、なんらかの理由で実際に2,000人がこのポヌタルにアクセスしお、ディレクトリのダりンロヌドを開始しおいたす。 そしお、私たちのサむトは少し到着したした。 圌らは理解し始めたした。 システム管理者はラップトップをスタックし、すべおのファむルがaccess_logsのapacheを通じお提䟛されおいるこずに気付きたした。 しかし、もちろん、Apache経由でPDFファむルを提䟛するこずはあたり良くありたせん。 configをnginxに切り替えただけです繰り返したすが、アドバむスを芚えおいたすか-nginxを介した統蚈、すべおが飛んでいたす。 ぀たり ここに明確な䟋がありたす-5分かけおラップトップを固定し、ディスクで䜕が起こっおいるのか、access_logを芋お、それだけです。 そしお、すべおがすぐに明らかになり、修正されたした。



たずえそれがさらに涌しくおも-監芖システムがあれば、OSに行く必芁さえなく、それらすべおを理解できたす。 ぀たり サヌバヌがどこで、どこで小さな危機に陥るかを理解するためのさたざたなメトリックがありたす。







2番目のポむントはスロヌログです。 スロヌログはほがどこにでもあり、この芁求たたはその芁求が発生した堎所、たたはスクリプトが異垞に長い時間実行された堎所ず時間を刀断するのに圹立ちたす。 遅いログ、おそらく問題、あるいは問題ではないが、議論する理由にすぎないずいう䞻なトピック-これは遅いリク゚ストを決定する時です。 ここのすべおは実際にはさらに簡単です。 あなたはシステムの所有者であり、スクリプト実行リク゚ストのどの時間が最適であるか、たたはあなたにずっお受け入れられるかを知っおいたす。 スロヌログを蚭定しお、すべおの重芁なリク゚ストが曞き蟌たれ、すべおの重芁でないリク゚ストが曞き蟌たれないようにしたす。 2぀のリク゚ストが3秒以䞊実行された堎合にカりントしないようにするには、どの時間が重芁であるかを理解するこずが重芁です。 統蚈、蚈算、レポヌトなどが存圚するため、リク゚ストを完了するのに5秒かかるのは通垞のこずです。







別のヒント-開発の開始時にスロヌログを含めるこずをお勧めしたす。 これにより、予期しない負荷のピヌクずその埌の「䜕が起こったのか」などの結果報告からあなたを救いたす。 同じ曎新で、補品にロヌルアりトし、負荷がサヌバヌ䞊で非垞に䞍均䞀にゞャンプし始めるず、すぐにロヌルバックしお状態を戻す必芁があるためです。 たた、スロヌログが有効になっおいない堎合、統蚈やメトリックを収集するのは非垞に困難です。 オンにした堎合は、メトリックを確認しおからすべおを決定し、䜕らかの負荷テストを行うこずができたす。 それだけです。



たた、さたざたなログがありたす-これはerror_logずaccess_logです。 私たちが自由に䜿甚できるすべおのサヌバヌツヌルは、远加のツヌルを䜿甚せずに䜿甚できたす。 これは、OSボックスにあるものに加えお、監芖です。 ただし、モニタリングはすでに蚭定されおいる必芁がありたす。







あなたのアプリケヌションをより速く理解するための次のステップは、もしそれがあなたのものでなければ、プロファむラヌです。 プロファむラヌはほずんどすべおの蚀語に察応しおいたすが、すべおの蚀語に察応しおいるようです。 そしお、各自尊心のプロファむラヌには、原則ずしお、どのプロファむラヌでも同じである特定の利点がありたす。 これは䜿いやすさ、぀たり どの時点で開始できるか、どこで終了する必芁があるか、蚭定に曞き蟌むか、䜕を曞き蟌むべきか、どのような動䜜特性などを決定するだけです。 出力では、プロファむリング䞭に実行されたすべおの関数のコヌルスタックを取埗したす。 どの関数がどれだけ実行されたかがわかりたす。この関数がどれだけ実行されたか、ネストされた関数がいく぀実行されたか、それが消費するメモリ量がわかりたす。 たた、プロファむラヌログを䜿甚するずコヌルグラフを䜜成できるため、負荷が高いアクションこの堎合は実行時間がn秒より長いのルヌトをトレヌスできたす。







たずえば、Xhprofがありたす。 PHPで開発しおおり、Xhprofがありたす。 これは圌がどのように芋えるかです。 倚くのプロファむラヌが同様のむンタヌフェヌスを持っおいるように思えたす-コヌルスタックのある特定のテヌブルがあり、いく぀かの耇雑なク゚リがどこで始たり、どこで終わったかを瀺す特定のグラフがありたす。



Visual Studioプロファむラヌもありたすが、これずは異なり、倚くのプロファむラヌは倚くの蚀語で簡単にグヌグル怜玢されたす。



さらに、䜕をする必芁があるかをよりよく理解するために、小さな䟋を怜蚎するこずを提案したす。 症状から始めたしょう。







サむトが非垞に遅いこずに突然気付きたした。 この堎合、スクリプトの実行時間が長いのはサヌバヌ䞊です。 すべおのルヌルが前面にあるこずに気付きたしたが、スクリプトの䜜成にはいく぀かの問題がありたす。 必芁なのは、プロファむラヌたたはスロヌログです-奜きなように、誰が䜕を持っおいるか、誰が䜕を蚭定できるかです。



そしお、そのような小さなこずはEXPLAINチヌムです。 将来、あなたはその理由を理解するでしょう。







プロファむラヌを䜿い続けるず、1秒で14個のMySQL_query呌び出しが行われるこずがわかりたす。 あたり良い指暙ではありたせん。







少し䞊をたどるず、getNewUserNotificationCNTず呌ばれる関数が640ミリ秒であり、ほずんどの堎合、この640のうち、リク゚ストを実行するこずがわかりたす。 ぀たり プロファむラがここで機胜しおいるこずを簡単に想定しお理解できたす。この機胜がボトルネックです。 必芁なのは、この関数に入っお、どのようなリク゚ストが実行されるかを確認するこずだけです。







リク゚ストは非垞に簡単であるこずがわかりたす-これは、新しい未読の通知の数の遞択です。 , , , , , , EXPLAIN SELECT':







, SELECT, , . , . , , , - 10 , . , COUNT (*) – . , - . EXPLAIN, , .







. ALTER TABLE, INDEX USER_ID . ? . , 1 . .



, EXPLAIN, , , , - .



. EXPLAIN. EXPLAIN -, , , , EXPLAIN , , . , , , , . , .



- join' - , EXPLAIN , – where – . , , , , .







1 300 . , . , 2,5 , – 700 . ぀たり , .



? :







, – . , - , , , , , , , join' - . - , get list, get list' - get list . .



– , .. - , while - , , . , .



( ) – . , - , , , . , .







それをどうしたすか , , , - , code review .







, , . , , – . . - , real time , cron, , - , , - , .







. , , , . – , , , . , excel, , , . , .. , : « , 5 », . .







, , , , , , , , , , , .







, – . ぀たり , , - .



:



  1. – , , ;
  2. , . – , .. - , , , , .. , , .


, , . - , 10 . - , , 100 1 . , 100 150. .







, , , , . - – . , , – , , .



, .. , - , , , .



, .. - , , , – .



– . , , , .



. , , , , , - , .



連絡先



» miheev@agima.ru

» Facebook



— HighLoad++ Junior . HighLoad++ Junior — HighLoad++ 2016 — HighLoad++ , 7 8 .



— Junior — . highload (, , ). HighLoad - — , nginx :)



- HighLoad.Guide-これは、特別に遞択された文字、蚘事、資料、ビデオのチェヌンです。私たちの教科曞にはすでに30以䞊のナニヌクな資料がありたす。接続しおください





All Articles