お世話になっております。
現在、Irisの検証を行っております。そこでIrisを使用して、送信処理(GameNetDriver処理)のマルチスレッド化に取り組んでいます。
マルチスレッドの実現はできました(Iris-Multi-Thread.png)が、サーバがクラッシュする現象が起こっており、それについてご質問させていただきます。
<br/>
・発生している問題
サーバを起動して、クライアントを繋げてしばらく時間が経過した後に専用サーバがクラッシュします。クラッシュした際のログを添付いたします(Iris-Multi-Thread.log)
サーバのログを確認したところ、"SIGSEGV"のエラーが発生しており、その原因がわからない状態です。
またコールバックを確認するとサーバのReceived処理で発生しています。送信処理をマルチスレッドにして、クラッシュが受信処理で発生する原因がわかりません。
サーバがクラッシュする原因は何でしょうか?また、それの解決案についてご教示いただきたいです。
<br/>
・補足情報
通常のIris(マルチスレッド化をしていない状態)で同じクライアント数を接続した際はクラッシュしないことを確認しました。
また、時間経過によって発生(クライアントの接続時などではないようです)しております。
専用サーバのプロセスに割り当てられたメモリ使用率は小さいままです。
<br/>
・追加したソースコード
マルチスレッドをする際に追加したコードを以下に示します。
UNetDriver::TickFlush(float DeltaSeconds)関数
"QUICK_SCOPE_CYCLE_COUNTER(STAT_NetDriver_TickClientConnections)"の下の部分に以下を追加しました。 // Add #if UE_WITH_IRIS if (ReplicationSystem) { SendTasks.Empty(); for (int32 i = 0; i < ClientConnections.Num(); ++i) { SendTasks.Add(UE::Tasks::Launch(TEXT("Iris Multi"), [this, i, DeltaSeconds] { ClientConnections[i]->Tick(DeltaSeconds); })); } // Wait for (const UE::Tasks::FTask& Task : SendTasks) { if (Task.IsValid()) { Task.Wait(FTimespan::FromMilliseconds(500)); } } } else
ClientConnectionsごとのTick(送信処理)をコネクションごとにスレッドを作成して、そのすべてが完了するまで待機しています。
このコードを追加した状態でLinux Serverをパッケージ化して、クラウド上で起動しています。
<br/>
よろしくお願いいたします。