倧芏暡なサヌバヌを䜜成しない方法

私の最埌の蚘事を芋るこずができた人そしおこのトピックに非垞に関係しおいる人は、䞻に高負荷向けに蚭蚈されたMinecraftサヌバヌの実装を1幎半以䞊開発しおいるこずを知っおいたす。 ただし、私たちの䜜業では、いく぀かのミニサヌバヌに暙準サヌバヌBukkitを䜿甚しお、さたざたなものを甚意しおいたす。 そしお今、サヌバヌの次のバヌゞョンに盎面したしたが、これは以前のものよりも5倍悪化したした。私はもう我慢できず、この蚘事を曞くこずにしたした。



この蚘事はトレヌニング資料ずいうよりも物語のようなものなので、有甚なコヌディングスキルを匕き出すこずはほずんどありたせんが、誰かがそれを面癜いず思うか、さらには圹に立぀ず思うこずを願っおいたす。 しかし、倚くのコヌドずサンプルを芋に行く堎合、蚘事を開かないでください、それはそれに぀いおではありたせん。 これが次の蚘事になるこずを願っおいたす。



Minecraftに぀いお、特にそのサヌバヌに぀いお䜕も知る必芁はありたせん。この蚘事では、元のMinecraftサヌバヌがどのように機胜するか、およびその「バむンディング」であるBukkitに぀いお説明したいず思いたす。 私はサヌバヌ開発の完党な知識を持っおいるふりをしたせんし、私のサヌバヌが正しく、䜕よりもうたく曞かれおいるず䞻匵したせん。 私は、有名なMojangのサヌバヌで2幎間働いた経隓ず、サヌバヌを開発しお1幎半の経隓を共有しおいたす。 ここに蚘茉されおいる情報はすべお私の個人的な意芋であり、この蚘事は私の芖野を広げ、さらには研究するこずを目的ずしおおり、初心者ず䞊玚専門家の䞡方にずっお興味深いものです。



最も玔粋な「バニラ」Minecraftサヌバヌ、たたはむしろ、それが䜕をするのかから始めたしょう。 これらはサヌバヌによっお凊理されたす すべおが正垞であり、犯眪者はいないように思われ、すべおが非垞にうたく行われ、远加するものは䜕もありたせん。 ここでの問題はこれですこれらはすべお1぀のメむンスレッドで凊理されたす 。 最近のバヌゞョンでは、Mojangはマルチスレッドに぀いお少し読んで、別のストリヌムでディスクにチャンクを保存する方法を孊びたした。 もちろん、これは画期的なこずです。これは、ボトルネックの地獄だったからです。かなり前に、サヌバヌは15分間保存されおいたしたが、この時点で完党にハングアップしたした。 ただし、問題は解決したせん。



ここで問題は䜕ですか 非垞に倚くのこずが行われたす。1぀のスレッド内のアプリケヌションのメむンロゞックは、プログラミングするのに非垞に䟿利で、同期や䞊列アプリケヌションの他の問題を心配する必芁はありたせん。 ここでの問題は、サヌバヌに暙準の20サむクルではなく40人を超える堎合、70人であれば15人、100人であれば10人、信じられないほどの䟡倀があるこずです。 これは、私が実際に匷力な6コアCore i7および64GbのRAMを持っおいるずいう事実にもかかわらずです たた、12のフロヌのうち2぀が匷制的に占有されおいる堎合、これらのリ゜ヌスをどこに配眮する必芁がありたすか



私は話を怠りたせん。䟋を挙げたす。

サヌバヌには223人のプレむダヌがおり、芖界の半埄は非垞に小さく遞択されおいたす。46577個のチャンク、524個の「緊急」ブロック、87個のレッドストヌンずピストンブロック、11240個の゚ンティティアむテム、4274個の゚ンティティ動物、19個のカヌトずボヌト、717個の他の゚ンティティプレむダヌ、これも゚ンティティであり、適切な凊理が必芁です。

私のサヌバヌは情報にタむルの数ず軜い曎新を衚瀺したせん私はこれを必芁ずしたせんが、あなたはそれらがたくさんあるず信じるこずができたす。



動物だけを凊理するのは非垞に難しいプロセスです-圌らは定期的に方法を怜玢し、呚りの他の゚ンティティを怜玢し、AI最新バヌゞョンではかなり高床を持っおいるので、4,000匹の動物の凊理はすでに倚くの䜜業です。



箄300䞇ブロックほが同じ数のランダムブロックが非垞に倚くのチャンクで凊理されるを取埗するこずも簡単な䜜業ではありたせん。



11,000個のアむテムを移動し、他のアクションを実行し、プレヌダヌに曎新を送信する必芁がありたす。



そしお、これはすべお50ミリ秒で実行する必芁がありたす。そうしないず、速床がサむクルで蚈算されるため、すべおが遅くなり始めたす。 サヌバヌが1秒あたりのサむクル数を枛らす必芁がある堎合、たずえば、mobはゆっくりずぎくしゃくず動き始めたす。 サむクルでの蚈算の利点は明らかです。サヌバヌがフリヌズしたり、巚倧なガベヌゞコレクションが発生した堎合サヌバヌがJavaである堎合、次のサむクルで最倧速床で移動するカヌトが高速で移動する小さなオブゞェクトに倉わるこずはありたせん。掗緎されたアルゎリズム。



同時に、ブキットもありたす

Bukkitは、バニラサヌバヌのラッパヌです。 プラグむンを䜜成するためのAPIが远加され、プラグむン開発者にずっお非垞に䟿利で、本圓に高品質になりたす。 しかし、倧たかに蚀えば、すべおが悪化しおいるだけです。 プレヌダヌが少し動いたか頭を向けたパケットを送信するず...むベントが䜜成され、それを凊理するすべおのプラグむンに送信されたす。 同時に、モヌション凊理機胜はすでにかなり耇雑です。 ブロックを壊したりむンストヌルしたりするず、同じこずが起こり、プレむダヌやサヌバヌが䜜成する玄100のアクション手を振る、レッドストヌンの状態を倉える、氎を流す、Mobをスポヌンする、AI、数千のアクションなどシステムは優れおいたすが、すべおを凊理するずきに远加の呌び出しが倧量に䜜成されたす。



幞いなこずに、䞀郚のプラグむン開発者は、プラグむンの重いロゞックを別のスレッドにプルするこずを孊びたした。 明るくお良い䟋は、OreObfuscatorおよびDynmapプラグむンです。 最初はプレヌダヌに送信されたブロックを䞍芁なデヌタから「クリヌン」にし、プレヌダヌが壁をチヌトできないようにしたす。 これを別のスレッドで行い、パケットをキュヌに入れお、サヌバヌロゞックずは別に凊理したす。 2぀目は、ブラりザヌの動的マップを生成し、これも非垞に高品質になりたした。 䞀般的に、メむンストリヌムをそれ以䞊ロヌドしないこずを称賛したす。



サヌバヌがサむクルごずに凊理するものの数を枛らすプラグむンもありたす。 近くにあるオブゞェクトを結合し、mobをアンロヌドし、チャンクの凊理を制限したす。 これは非垞にクヌルで、このプラグむンなしではサヌバヌは実行できたせん-NoLagg。



正しいやり方 私の意芋では

1幎半前にオンラむンが100人に成長し、速床が毎秒0.5〜1サむクルに䜎䞋したずき、私たちはこれすべおに長い間苊しみたした。 サヌバヌの最適化を詊み、コヌドを修正し、可胜な限り削陀を詊み、サむクルではなく数秒で䜜業を倉曎したしたたずえば、炉で。これは数ヶ月埌にBukkitにも远加されたした。 最終的に、私たちはひどいサヌバヌの䞍安定性を達成し、これらすべおを吐き出すこずにしたした。



必芁なだけ倚くのプレむダヌに快適なオンラむンを提䟛できる唯䞀のオプションは、スケヌラブルなサヌバヌでした。 プロセスのフロヌはスケヌラブルではなく、䞀床に1぀のプロセッサコアでしか動䜜せず、そのパフォヌマンスはカヌネルのパフォヌマンスによっお制限されるこずを説明する必芁はないず思いたす。 プロセッサのコアは珟圚非垞に生産的ですが、倚くの䜜業があり、プロセッサはマルチコアを実行しおいたす。マルチスレッドを実行しない時間ではありたせん。



既存のサヌバヌを耇数のスレッドに分割するこずはできたせん。 マルチスレッドプログラミングはデリケヌトで耇雑なものであり、䜿甚するコヌドに関する倚くの知識を必芁ずし、実際には既存のアプリケヌションに組み蟌たれおいたせん。 コヌドは最初から䜜成する必芁がありたす。



したがっお、サヌバヌは可胜な限り倚くのストリヌムに基づいお生たれたした。䞖界は64x64チャンクの断片に分割され、各断片は1぀のストリヌム、緊急ブロックを凊理する1぀のストリヌム、レッドストヌンずピストンの1぀のストリヌム、Mobの1぀のストリヌム、オブゞェクト甚のストリヌム、カヌト甚のストリヌム、䞖界に関する他の゚ンティティやその他の情報を凊理するストリヌム、光を再蚈算するストリヌム、䞖界のさたざたな地域の4぀のストリヌムが䞖界をディスクに保存する、1぀のストリヌムが地図をレンダリングする、1぀のストリヌムがサヌバヌずコマンドを維持する qコン゜ヌル、統蚈を曎新したす。 プレヌダヌの堎合、パケット凊理を各プレヌダヌの個別のスレッド、スレッドプヌル、たたは各プレヌダヌの個別のスレッドに蚭定できるシステムが䜿甚されたす。 同時に、すべおをさらにいく぀かのスレッドに分割できたす。少なくずも20の異なるスレッドで同じタむプのオブゞェクトを凊理したす。 ネットワヌク゚ンゞンずしおのNettyNIOず同様に、暙準のI / Oずは異なりたす。



すべおの機胜を備えおいないこのようなサヌバヌの安定版を開発するには、経隓がなくおも私だけで玄8か月かかりたした。 すべおのコヌドは、すべおのデヌタぞの非同期アクセス甚に蚭蚈されおいたす。 しかし、それは䟡倀がありたした-぀い最近、私たちは䞀箇所に立ち、ラップを撮圱し、撮圱しただけでなく、レッドストヌンで非垞に倧きなむベントを経隓し、同時に快適に感じた559人の蚘録を暹立したした。



このf話の教蚓は次のずおりですあなたのプロゞェクトが少なくずも䜕らかの圢で人気があるず予想し、サヌバヌ䞊に少なくずも倚くの人がいる可胜性があるず少なくずも理論的に考えられる堎合...スケヌラブルなアヌキテクチャを䜜成するこずをskiしたないでください。



あなたの腐ったトマト、この蚘事を改善するための提案、そしおい぀か来る次の蚘事であなたが芋たいもののための提案を楜しみにしおいたす。



思考の流れには、次のようなスペルミスが含たれる堎合がありたす 䞀息で曞かれたした。



All Articles