マビノギサーバーの物語
こんにちは、Mad Posundaeです。
マビノギでゲームサーバーの話は初めて!
シングルスレッドとマルチスレッドについて説明します。
まず、説明して理解するのに役立つ適切な例を見てみましょう。
私たちはスタートアップ企業に勤めていますが、昨日、新しいプログラムの開発の依頼を受けました。
お客さんがリクエストすると、サンデーを配ります。
番組名は「サンデー」で、ゲストにサンデーを配るのにかかる時間は1秒に設定されていました。
「サンデー」プログラムを使用して、10人の顧客に10個のサンデーを配布するのにどのくらい時間がかかりますか?
答えを知っていますか?
この問題に対する答えは、「サンデー」がマルチスレッドベースで開発されているかどうかによって、複数ある可能性があります。
そうそう。所要時間を見れば推測できますが、
シングルスレッドとマルチスレッドの主な違いは、マルチスレッドは並列処理できることです。
では、現在のマビノギのゲームサーバーはシングルスレッドなのでしょうか?多分マルチスレッド?
ご想像のとおり、マビノギのゲームサーバーは現在シングルスレッドです。
サードパーティのモジュールと、クライアントのパケットの入出力を担当する部分は、マルチスレッドです。
実際のクライアントの要求を処理するゲーム ロジック スレッドはシングルスレッドです。
したがって、クライアントから要求されたパケットをサーバーで処理するには、要求されたすべてのパケットが最初に処理されるのを待つ必要があります。
そのため、クライアントからのリクエストが大量にあると、サーバーがボトルネックになります。
その結果、一般的にラグと呼ばれるものが発生します。
「Eternity」のプロジェクトでは、上記のようなことについて多くの議論をしました。
最終的に、ゲームロジックのスレッドをマルチスレッドに変更することにしました。
そうして初めて、ボトルネックを最小限に抑えることができます。
上の表で「Sundae」をマルチスレッドで開発しているのに、なぜ1秒ではなく1.xx秒になっているのでしょうか?
数学的に行うと、スレッドの数がnの場合、プロセスのパフォーマンスもN倍になるはずです。
しかし、実際にはそうではありません。これは、ハードウェア/ソフトウェアの制限があるためです。
ハードウェアの制限はCPUの性能のことなので、個別には説明せず、ソフトウェアの制限のみを説明します。
マルチスレッド環境では、メモリ領域がスレッド間で共有される「クリティカル領域」に近づくと待機時間が発生します。
そのため、1秒ではなく1.xx秒です。
遅延の理由は次のとおりです。
再び「サンデー」を例にとると、「サンデー」の重要な領域は「10個のサンデーが入ったプレート」です。
複数のスレッドが同時にプレートからサンデーを取り出そうとしている場合
サンデーが破れているとか、サンデーが3つ残っていると思っていたら2つしか残っていないことが判明した、などなど。
「同期エラー」が発生する場合があります。
これを防ぐには、プログラマは独自の「同期エラー」防止コードを記述する必要があります。
このコードは、他のスレッドが最初のスレッドで作業を終了するまで待機します。
これは待ち時間です。
マビノギコンテンツのフィールドレイドを例にとり、「クリティカルエリア」についてさらに説明します。
モクルカルピは途中、多くのスキルを持っています。
この時点で、Mokurkalpiの健康値は「重要な領域」として扱われるべきです。
1 つのスレッドでは、スキルが順番に処理されるため、追加の処理は必要ありませんでした。
マルチスレッドでは、複数のスレッドによって Mokurkalpi の正常性値が低下する状況があります。
これは、追加の処理が必要なものです。
例えば、マビノギのゲームサーバーコードには「重要な領域」がたくさんあります。
マルチスレッド環境に切り替えるということは、これらすべての「重要な領域」に「同期エラー」がないことを意味します。
これは、コードを完全に修正する必要があることを意味し、多くの労力と時間がかかります。
しかし、今よりもエリンにとってより快適な環境をミレジアンに提供した方が良いでしょう。
それが自分たちの仕事だと分かっているし、ベストを尽くすつもりだ。どうぞよろしくお願いいたします。
この長い投稿を読んでくれてありがとう!
どうもありがとうございます。
0コメント