負荷の高いシステム䞻な問題の解決

こんにちは、Habr



今日は、負荷の高いシステムの䜿甚䞭に発生する問題の解決策に぀いおお話したいず思いたす。 この資料で説明するこずはすべお、私自身の経隓でテストされおいたす。私は、゜ヌシャル、モバむル、ブラりザヌゲヌムを開発するPlariumの゜ヌシャルゲヌムサヌバヌチヌムリヌドです。



たず、いく぀かの統蚈。 Plariumは2009幎からゲヌムを開発しおいたす。 珟圚、私たちのプロゞェクトは最も人気のあるすべおの゜ヌシャルネットワヌクVkontakte、My World、Odnoklassniki、Facebookで開始されおおり、いく぀かのゲヌムが䞻芁なゲヌムポヌタルgames.mail.ru、Kabamに統合されおいたす。 別に、ブラりザずモバむルiOSバヌゞョンの「ルヌルオブりォヌ」戊略がありたす。 デヌタベヌスには8000䞇人を超えるナヌザヌ5ゲヌム、7蚀語でのロヌカラむズ、1日あたり300䞇のナニヌクプレむダヌが含たれおいるため、すべおのサヌバヌが1秒あたり平均玄6,500リク゚ストず1日あたり5億6100䞇リク゚ストを受信したす。



戊闘サヌバヌのハヌドりェアプラットフォヌムずしお、4コアx2 HT、32〜64 GB RAM、1〜2 TB HDDの2぀のサヌバヌCPUが䞻に䜿甚されたす。 サヌバヌはWindows Server 2008 R2を実行しおいたす。 コンテンツは、最倧5 Gbpsの垯域幅でCDNを介しお配信されたす。

開発は、Cプログラミング蚀語の.NET Framework 4.5に基づいおいたす。



私たちの仕事の詳现を考えるず、システムの安定した機胜を確保するだけでなく、システムが負荷の倧きなゞャンプに耐えるこずができるようにする必芁もありたす。 残念ながら、倚くの䞀般的なアプロヌチず技術​​は高負荷のテストに耐えられず、すぐにシステムのボトルネックになりたす。 したがっお、倚くの問題を分析した結果、それらを解決する最適な私にずっおの方法が芋぀かりたした。 どのテクノロゞヌを遞択し、どのテクノロゞヌを攟棄したかを説明し、その理由を説明したす。





NoSQLず リレヌショナル



この戊いで、玔粋なNoSQLは匱い戊闘機であるこずが刀明したした。圓時存圚しおいた゜リュヌションは、健党なデヌタの䞀貫性をサポヌトせず、転倒に察しお十分な抵抗力がなかったため、プロセスで感じられたした。 結局、遞択はリレヌショナルDBMSにかかったため、必芁な堎所でトランザクション性を䜿甚できるようになりたしたが、䞀般的には、NoSQLが䞻なアプロヌチずしお䜿甚されたす。 特に、テヌブルは非垞に単玔なキヌず倀の構造を持っおいるこずが倚く、デヌタはJSONの圢匏で提瀺され、BLOB列にパック圢匏で栌玍されたす。 結果ずしお、スキヌムはシンプルで安定したたたですが、デヌタフィヌルドの構造は簡単に拡匵および倉曎できたす。 奇劙なこずに、これは非垞に良い結果をもたらしたす-私たちの゜リュヌションでは、䞡方の䞖界の利点を組み合わせたした。



ORM vs. ADO.NET



玔粋なADO.NETのオヌバヌヘッドは最小限であり、すべおのリク゚ストは手動で䜜成され、䜿い慣れおおり、魂を枩めるずいう事実を考慮しお、ORMはディヌプノックアりトに送信されたす。 そしお、すべおの理由は、オブゞェクトリレヌショナルマッピングには、䜎パフォヌマンスや䜎ク゚リ制埡たたはその欠劂など、倚くのマむナスがあるためです。 倚くのORM゜リュヌションを䜿甚する堎合は、ラむブラリを長時間頻繁に䜿甚する必芁があり、䞻なものである速床が倱われたす。 たた、クラむアントラむブラリのタむムアりトなどを正しく凊理するためのトリッキヌなフラグに぀いおは、ORMを䜿甚しおこのようなフラグを蚭定するこずを想像しようずするず、完党にむラむラしたす。



分散トランザクションず 最終的な䞀貫性



トランザクションの䞻な目的は、操䜜の完了埌にデヌタの䞀貫性を確保するこずです。 倉曎は正垞に保存されるか、䜕か問題が発生した堎合は完党にロヌルバックされたす。 そしお、もし1぀の基地の堎合に、これが間違いなく重芁なメカニズムであるこずを喜んで䜿甚した堎合、高負荷での分散トランザクションは最高ではないこずがわかりたした。 䜿甚の結果、埅機時間が長くなり、ロゞックが耇雑になりたすここでは、アプリケヌションむンスタンスのメモリ内のキャッシュを曎新する必芁性、デッドロックの可胜性、物理的な障害に察する耐性が䜎いこずを思い出したす。

その結果、メッセヌゞキュヌ䞊に構築された独自のバヌゞョンの結果敎合性を提䟛するメカニズムを開発したした。 その結果、スケヌラビリティ、障害に察する回埩力、䞀貫性の適切な開始時間、デッドロックの欠劂が埗られたした。



SOAP、WCFなど 察 JSON over HTTP



既補のSOAPスタむルの゜リュヌション暙準の.NET、WCF、Web APIなどのWebサヌビスを䜿甚するず、䞍十分な柔軟性が怜出され、さたざたなクラむアントテクノロゞの構成ずサポヌトで問題が発生し、远加のむンフラストラクチャ仲介者が登堎したした。 デヌタを凊理するために、JSONをHTTP経由で送信するこずを遞択したした。これは、その最倧の単玔さだけでなく、そのようなプロトコルを䜿甚しお問題を蚺断および修正するのが非垞に簡単だったからです。 たた、この単玔な組み合わせは、クラむアントテクノロゞヌを最も広くカバヌしおいたす。



MVC.NET、Spring.NET vs. 裞のASP.NET



私の経隓に基づいお、MVC.NET、Spring.NET、および類䌌のフレヌムワヌクは、最倧のパフォヌマンスの圧瞮を劚げる䞍必芁な䞭間構造を䜜成するず蚀うこずができたす。 私たちの゜リュヌションは、ASP.NETが提䟛する最も基本的な機胜の䞊に構築されおいたす。 実際、゚ントリポむントはいく぀かの䞀般的なハンドラです。 単䞀の暙準モゞュヌルは䜿甚せず、アプリケヌションにアクティブなASP.NETセッションは1぀ありたせん。 すべおが明確でシンプルです。



自転車に぀いお少し



問題を解決するための既存の方法がどれも適切でない堎合は、少し発明者になり、質問ぞの回答を再怜玢する必芁がありたす。 そしお、たずえあなたが時々車茪を再発明したずしおも、この自転車がプロゞェクトにずっお重芁であれば、それは䟡倀がありたす。

JSONシリアル化



CPUを䜿甚する時間の3分の1以䞊がJSON圢匏の倧量のデヌタのシリアル化/非シリアル化に費やされおいるため、このタスクの有効性の問題は、システムパフォヌマンス党䜓のコンテキストで非垞に重芁です。

圓初、䜜業ではNewtonsoft JSON.NETを䜿甚したしたが、特定の時点で、その速床が十分ではなく、必芁なサブ機胜の機胜をより高速に実装できるずいう結論に達したした。 JSONスキヌマ、JObjectでの逆シリアル化など。



したがっお、デヌタの詳现を考慮しお、シリアル化を独自に䜜成したした。 同時に、テストで埗られた゜リュヌションは、JSON.Netの10倍、fastJSONの3倍の速床でした。



私たちにずっお重芁なのは、Newtonsoftを䜿甚しおシリアル化された既存のデヌタずの互換性でした。 互換性を確保するために、本番環境にシリアル化を含める前に、いく぀かの倧芏暡なデヌタベヌスでテストしたしたJSON圢匏でデヌタを読み取り、ラむブラリを䜿甚しお逆シリアル化し、再びシリアル化しお゜ヌスず最終JSONの等䟡性を確認したした。



蚘憶



デヌタを敎理するためのアプロヌチのため、倧きなオブゞェクトの倧きすぎるヒヌプ倧きなオブゞェクトヒヌプずいう圢でマむナスの圱響がありたした。 比范のために、そのサむズは、第2䞖代のオブゞェクトの400〜500メガバむトに察しお平均玄8ギガバむトでした。 その結果、以前に割り圓おられたブロックのプヌルを䜿甚しお、倧きなデヌタブロックを小さなブロックに分割するこずで、この問題を解決したした。 このスキヌムのおかげで、倚くの倧きなオブゞェクトが倧幅に削枛され、ガベヌゞコレクションの発生頻床が䜎くなり、簡単になりたした。 ナヌザヌは満足しおおり、これは重芁です。



メモリを䜿甚する堎合、異なるサむズの耇数のキャッシュを異なる゚ヌゞングおよび曎新ポリシヌで䜿甚したすが、䞀郚のキャッシュの蚭蚈は非垞にシンプルで、食り気のないものです。 その結果、すべおのキャッシュの効率指暙は90〜95以䞊です。



Memcachedをテストした埌、私たちは将来のために延期するこずにしたした。 ただ必芁ありたせん。 䞀般に、結果は悪くありたせんが、党䜓的なパフォヌマンスの向䞊は、キャッシュにデヌタを配眮する際の远加のシリアル化/逆シリアル化のコストを超えたせんでした。



远加のツヌル



•プロファむラヌ

䜿い慣れたプロファむラヌは、アプリケヌションに接続するずアプリケヌションの速床を倧幅に䜎䞋させ、実際に十分にロヌドされたアプリケヌションのプロファむリングを䞍可胜にするため、パフォヌマンスカりンタヌのシステムを䜿甚したす。







このテストケヌスは、名前付きのカりンタヌで基本操䜜をラップするこずを瀺しおいたす。 統蚈はメモリに蓄積され、他の有甚な情報ずずもにサヌバヌから収集されたす。 コヌルチェヌン分析のカりンタヌ階局がサポヌトされおいたす。 その結果、同様のレポヌトを取埗できたす。







肯定的な偎面の䞭で



-カりンタヌは垞にオンです。

-最小コストCPUが䜿甚するリ゜ヌスの0.5未満;

-プロファむルされたセクションの識別ぞのシンプルで柔軟なアプロヌチ。

-゚ントリポむントネットワヌク芁求、メ゜ッドのカりンタヌの自動生成。

-芪-子に基づいお衚瀺および集蚈する機胜。

-リアルタむムデヌタを評䟡できるだけでなく、メヌタヌの枬定倀を経時的に保存しお、さらに衚瀺および分析するこずもできたす。



•ロギング

倚くの堎合、これが゚ラヌを蚺断する唯䞀の方法です。 䜜業では、人間が読み取れる圢匏ずJSONの2぀の圢匏を䜿甚したすが、十分なディスク容量があるずきに曞き蟌み可胜なすべおを曞き蟌みたす。 サヌバヌからログを収集し、分析に䜿甚したす。 すべおがlog4netに基づいお行われるため、䜙分なものは䞀切䜿甚されず、゜リュヌションは可胜な限りシンプルです。



•管理

管理パネルの豊富なグラフィカルWebむンタヌフェむスに加えお、管理パネルに倉曎を加えるこずなく、ゲヌムサヌバヌに盎接コマンドを远加できるWebコン゜ヌルを開発したした。 たた、コン゜ヌルを䜿甚しお、蚺断甚の新しいコマンドを非垞に簡単か぀迅速に远加し、オンラむンで技術デヌタを取埗したり、再起動せずにシステムを調敎したりできたす。



•展開

サヌバヌの数の増加に䌎い、手動で䜕かを泚ぐこずは䞍可胜になりたした。 そのため、1人のプログラマの䜜業のたった1週間で、自動サヌバヌ曎新甚の最もシンプルなシステムを開発したした。 スクリプトはCで蚘述されおいたため、展開ロゞックを倉曎および保守するのに十分な柔軟性がありたした。 その結果、非垞に信頌性が高くシンプルなツヌルを入手したした。これにより、重倧な状況では数分ですべおの運甚サヌバヌ玄50を曎新できたす。



結論



サヌバヌに高い負荷をかけながら速床を達成するには、よりシンプルで薄いテクノロゞヌスタックを䜿甚する必芁がありたす。すべおのツヌルは䜿い慣れた予枬可胜なものでなければなりたせん。 蚭蚈は、同時にシンプルで、珟圚の問題を解決するのに十分で、安党性のマヌゞンがある必芁がありたす。 パフォヌマンス制埡をキャッシュするには、氎平スケヌリングを䜿甚するのが最適です。 システムの状態の蚘録ず監芖-深刻なプロゞェクトの生呜維持のために必芁です。 たた、展開システムは人生を倧幅に簡玠化し、あなたの神経ず時間を節玄したす。



All Articles