Photon Server設定
Photonの主要な設定ファイルはPhotonServer.configです。
このファイルは、SDKのバイナリフォルダに格納されています。
このファイルはアプリケーション、IPのリスナー、パフォーマンス特有の値を設定するために使用されます。
このファイルには、ゲームロジックからの設定値は含まれません。
デフォルト値はPhotonがより多くのコアでスケールできるようにしますが、通常のマシンよりも優先されることはありません。
基本的に、パフォーマンスの調整は不要です。
以下は、もっとも一般的に使用される設定です。
さらに詳細なオプションについては、Photon Server Config設定ページを参照してください。
インスタンスノード
複数のインスタンスがサポートされています。
各インスタンスには、設定ファイル内に個別のノードがあります。
インスタンスはアプリケーション、リスナーや、その他のインスタンスを実行する際に一緒に使用する必要がある設定のグループです。
例:
XML
<Configuration>
<Instance Name="LoadBalancing"
MaxMessageSize="512000"
MaxQueuedDataPerPeer="512000"
PerPeerMaxReliableDataInTransit="51200"
PerPeerTransmitRateLimitKBSec="256"
PerPeerTransmitRatePeriodMilliseconds="200"
MinimumTimeout="5000"
MaximumTimeout="30000"
DisplayName="LoadBalancing (MyCloud)">
<!-- instance config here -->
</Instance>
</Configuration>
インスタンスノードには、以下の属性を設定できます:
- Name: Photon Socket Serverのインスタンスに使用する名前。
- MaxMessageSize: 単一のピアから送信されるメッセージの最大許容サイズ(単位:バイト)
- MaxQueuedDataPerPeer: ピアごとの最大バッファサイズ容量(単位:バイト)
- PerPeerMaxReliableDataInTransit: ピアが送信可能で、かつピアがまだACKを受信していない高信頼データの最大数(単位:バイト)この量のデータが送信されると、その後の高信頼データはすべてキューされます。
- PerPeerTransmitRateLimitKBSec: 1秒間に送信できるデータ(高信頼および低信頼)の最大量(単位:KB)。これによって、ピアが1秒間に送信できるデータ量に上限を設定できます。 上限に達すると、その後の高信頼データはキューされ、低信頼データは省略されます。
- PerPeerTransmitRatePeriodMilliseconds: 送信率の制限を確認する頻度。 デフォルトでは、250ミリ秒ごとに確認し、確認するたびにPerPeerTransmitRateLimitKBSecを4倍に拡張します。
値を小さくするとデータフロの一貫性が向上し、値を大きくするとフローがぎこちなくなりますが、サーバーリソースの使用は減ります。 - MinimumTimeout (「タイムアウト設定」を参照してください)
- MaximumTimeout (「タイムアウト設定」を参照してください)
- DisplayName: PhotonControl.PhotonControlがインスタンスに表示する名前。
- DataSendingDelayMilliseconds (「遅延設定」を参照してください)
- AckSendingDelayMilliseconds (「遅延設定」を参照してください)
- ProduceDumps: クラッシュ時の「ダンプファイル」作成の有効化/非有効化を切り替えます。 Photon Coreの問題を見つけるうえで、ダンプファイルは不可欠です。
- DumpType: 書き出すクラッシュダンプの種類を定義します。「Full」、「Maxi」、「Mini」の種類があり、含まれる情報量が順に少なくなります。
ただし、情報量が少ないほど必要なハードディスク容量は少なくなります。 - MaxDumpsToProduce: 最大でいくつのダンプファイルを書き出すかを設定します。ファイルが移動または削除された場合には、新規ファイルを書き出すことが可能です。
- LogFileLocation: 管理されていないPhoton Socket Server向けのログファイルの場所。「PhotonSocketServer.exe」への絶対パス、または相対パスとなります。
- ...
タイムアウト設定
インスタンスノードの2つの値は、 サーバーが応答のないUDPクライアントをどのようにタイムアウトするかを示します。
すなわち MinimumTimeout と MaximumTimeout です。
UDPで接続されているピアは、切断されるまでに MinimumTimeout ミリ秒、応答するための時間があります。
切断されるまでの実際の時間は、ピアごとにRTTの履歴にもとづいて動的に決定されます。
過去に良かったRTTはより早く切断されます。
TCP接続はノード TCPListener と TCPListener (PhotonServer.config にも)に、個別の InactivityTimeout 設定があります。
これらは5秒(5,000ミリ秒)に設定されています。
この時間内にリクエストが届かない場合、接続はタイムアウトし閉じられます。
クライアントはこれを回避するために、定期的にサーバを「ping」します。
クライアントは独自に接続を監視し、 接続をタイムアウトする可能性もある点に留意してください。
両方の側が、ゲームに適切で、近似したタイムアウトを持つ必要があります。
遅延設定
属性 DataSendingDelayMilliseconds と AckSendingDelayMilliseconds は、 パフォーマンスと最小応答時間の交換を表します。
この遅延は、トラフィックを削減するためにラグを直接加えます:
待機によってサーバーがコマンドを集約し、1つのパッケージでの送信が可能になります。
送信 の遅延はサーバーが何かを送信するとトリガーされ、ack の遅延は信頼性の高いデータの受信にトリガーされます。
上記の通り、各デフォルト値は50ミリ秒です。
これは適切な値ですが、クライアントとサーバーが同じマシン上で稼動していても50ミリ秒未満のラウンドトリップタイムが発生します。
ゲームに合わせて、異なる値での負荷テストをおこなってください。 0の遅延は、タイマーの使用を省略した特殊なケースです。 10未満の低い遅延は避けてください。
ログ設定
- LogFileLocation: 管理されていないPhoton Socket Serverのログファイルの場所です 。絶対パスまたは "PhotonSocketServer.exe" からの相対パスのいずれかを指定することができます。
- LogFileName: 管理されていないPhoton Socket Serverログファイルの名前。
- LoggingEnabled: このインスタンスへの管理されていないロギングを有効または無効にします。
- LogUnimportantExceptions: 重要でないと考えられるいくつかの例外をログに記録するかどうかを指定します。
スキーマの検証
- ValidateSchema: このインスタンスのスキーマ検証を有効または無効にします。
- SchemaValidationFailureIsFatal: スキーマの検証の失敗がサーバーのシャットダウンにつながるかどうかを指定します。
アプリケーションノード
設定ファイルは、Photonが起動時にどのアプリケーションを読み込むかを定義します。
「Applications」ノードでは、複数の「Application」エントリを追加することができます。
複数のアプリケーションを読み込むには、アプリケーションノード(固有の名前を持つ)を追加します。
そのうちの1つにアプリケーションの名前をつけて デフォルトのアプリケーションとすることが出来ます(この例では、「NameServer」)。
デフォルトのアプリは、不明なアプリケーションへの接続を試行するクライアント用のフォールバックです。
PhotonServer.config で設定されていないアプリケーションは 読み込まれないためデプロイする必要はありません。
アプリケーションが設定ファイルに含まれているが、ファイルが不足している場合にはPhotonは起動せずログに問題を出力します。
例:
XML
<!-- Defines which applications are loaded on start and which of them is used by default. Make sure the default application is defined. -->
<!-- Application-folders must be located in the same folder as the bin_Win64 folders. The BaseDirectory must include a "bin" folder. -->
<Applications Default="NameServer">
<Application
Name="Master"
BaseDirectory="LoadBalancing\Master"
Assembly="Photon.LoadBalancing"
Type="Photon.LoadBalancing.MasterServer.MasterApplication">
</Application>
<Application
Name="Game"
BaseDirectory="LoadBalancing\GameServer"
Assembly="Photon.LoadBalancing"
Type="Photon.LoadBalancing.GameServer.GameApplication">
</Application>
<Application
Name="NameServer"
BaseDirectory="NameServer"
Assembly="Photon.NameServer"
Type="Photon.NameServer.PhotonApp">
</Application>
</Applications>
各アプリケーションには、クライアントが接続時に使用するための名前が割り当てられます。
アプリケーションノードがサポートする属性は以下のとおりです:
- BaseDirectory: アプリケーションが存在するフォルダを定義します。
「\bin」フォルダに名前はつけませんが、慣習から名前を予期します。 - Assembly: アプリケーションの「.dll」の名前です。
- Type: アプリケーションの「main」クラス(Photon.SocketServer.Application から派生)。
- ApplicationRootDirectory:
- PassUnknownAppsToDefaultApp: 未知のアプリケーション名が指定されたときに true にすると、 デフォルトのアプリケーションが使用されます。falseの場合、これは致命的なエラーとなり接続が切断されます。デフォルトはfalseです。
- SharedDirectory:「共有」されたアセンブリを格納するために使用される。
BaseDirectoryの下に配置されます。 - SharedDirIsExeDir:
- StartTimeoutMilliseconds: アプリケーションが起動しない場合、Photonはシャットダウンします。設定された時間内にアプリケーションが起動しない場合、Photonはシャットダウンします。
0 = タイムアウトは適用されません。 - StopTimeoutMilliseconds: アプリケーションが起動しないとPhotonはシャットダウンします。設定された時間内にアプリケーションが停止しない場合、Photonはシャットダウンします。
0 = タイムアウトは適用されません。
リスナー
これらは、マシン上のエンドポイントをプロトコル、IP、ポートごとに設定します。 複数リスナーの種類を定義可能です。
いくつかのIP/ポートの組み合わせを開くことで、同じ種類の複数のリスナーを定義できます。
共通の設定
これらの属性は、複数のタイプのリスナー間で共有されます。
- Name: リスナーの任意の名前。
- IPAddress: デフォルトのIP 0.0.0.0により、Photonはローカルで利用可能な任意のIP上でリッスンします。
ここで、複数IPをともなうマシンは正しいものを定義する必要があります。
ワイルドカードIPを置き換えることで、Photonは特定のIPアドレスのみを開きます。注:IPに結びついたライセンスを使用している場合には、このIPを設定済みのリスナーで設定する必要があります。 - Port: リッスンするポート番号。
- IPAddressIPv6: 例:リッスンするIPアドレス。2001:db8:a0b:12f0::1 or :: リッスンするIPアドレス。
- ListenBacklog: リスナーバックログキューのサイズ。
これは同時に確立できる接続の数に影響します。したがって、たとえば 151 クライアントが完全に同時に接続しようとした場合、最後の1つは拒否される可能性があります。
それぞれの接続確立の試行にはほとんど時間がかからず、いったん接続が確立されると、その接続は制限に影響されないことに注意してください。
したがって、この値を10に設定しても、10以上のクライアントが同時に接続を試みない限り 、10,000の同時アクティブ接続を持つことができます。 - Disabled:このリスナーが無効であるかどうかを定義します。このリスナーが無効であるかどうかを定義します。
- AppDataInactivityTimeout: 低レベル(ネイティブコード)のキープアライブPINGとは対照的に、アプリケーション(マネージドコード)がデータを取得しない場合のタイムアウトです。
- Access-Control-Allow-Origin:
- MaxMessageSize:
- MaxInboundMessageSize: このリスナーを通じてサーバーが受信するメッセージの最大バイト数を決定します。
メッセージがMaxInboundMessageSizeの制限を超えた場合、クライアントはサーバーから切断されます。
デフォルトは、MaxMessageSizeの設定値です。- MaxOutboundMessageSize:このリスナーを通じてサーバーから送信されるメッセージの最大バイト数を決定します。
メッセージがMaxOutboundMessageSizeの制限を超えた場合、クライアントはサーバーから切断されます。
デフォルトは、MaxMessageSizeの設定値です。 - InactivityTimeout:サーバーが応答のないピアを切断するまでの時間です。
"0 "の値は、タイムアウトがないことを意味します。
単位はミリ秒です。 - DisableNagle:接続にNagleのアルゴリズムが使用されているかどうかを判断します。
trueに設定すると、Nagleは無効になり、送信用のTCPデータは、TCPスタックに到達するとすぐに送信されます。
falseに設定されていると、Nagleは動作しており、TCPスタックは送信データをより少ないデータグラムにまとめようとします。
この設定を true にすると、送信されるデータグラムの数は増えますが、TCP 接続のレイテンシが少し改善されるかもしれません。
- MaxOutboundMessageSize:このリスナーを通じてサーバーから送信されるメッセージの最大バイト数を決定します。
- ListenBacklog:リスニングバックログキューのサイズです。
これは、同時に確立できる接続の数に影響します。例えば、151のクライアントが全く同時に接続を試みた場合、最後の1つが拒否される可能性があります。
なお、各接続確立の試みにはほとんど時間がかからず、いったん接続が確立されると制限の影響を受けません。
したがって、この値を10に設定しても、10以上の同時接続を試みない限り、10,000の同時アクティブ接続を維持することができます。 - Disabled: リスナーを非有効化する場合に定義します。
- RecvBufferSize: 受信データ用バッファのサイズです。
- SendBufferSize: 発信データ用バッファのサイズです。
TCPリスナーの設定
FlowControlMaxQueuedBytes: ピアが送信できるデータの最大量です。単位はバイトです。この量のデータが送信されると、以降のデータはすべてキューに入れられます。これは、オペレーティングシステム独自のバッファとしてTCP Windowsを考慮しています。
DisableNagle: Nagle のアルゴリズムが接続で使用されているかどうかを決定します。
trueに設定すると、Nagleは無効になり、送信TCPデータはTCPスタックに到達するとすぐに送信されます。
falseに設定された場合、Nagleは動作中で、TCPスタックは送信データをより少ないデータグラムにまとめることを試みます。
この設定をtrueにすると、送信されるデータグラムの数が増える代わりに、TCP接続のレイテンシーが少し改善されるかもしれません。InactivityTimeout: サーバーが応答しないピアを切断するまでの時間。
「0」はタイムアウトなしを意味します。単位はミリ秒です。LoggingEnabled: このリスナーのログが有効かどうかを定義します。
HttpListener
v5では、WebSocketListenerはHttpListenerによって設定され、PeerType
をWebSocket
に指定します。
XML
<HTTPListeners>
<HTTPListener Name="MyListenerNameShowsUpInPerfMon"
IPAddress="0.0.0.0"
IPAddressIPv6="::"
Port="80"
OverrideApplication = "WebSocketEchoApp"
InactivityTimeout="5000"
DisableNagle="true"
Secure = "true"
PeerType="Simple|Reliable|WebSocket|WebRTC"
MaxUriLength="255"
MaxHeaderLength="255"
MaxHeaders="20"
PermittedOrigins="photonengine.com, myawesome.game, etc."
MaxInboundMessageSize="10000"
MaxInboundMessageQueueSize="50000"
MaxOutboundMessageSize="10000"
MaxOutboundMessageQueueSize="50000"
Ping="false"
WebHook="false"
NoCache="true">
<StandardHeaders>
<StandardHeader Name="X-Blah" Value="X-BlahValue"/>
<StandardHeader Name="X-Blah2" Value="X-Blah2Value"/>
</StandardHeaders>
<Routing>
<Route Url="/"/> <!-- If present this is a wildcard match for ANY url not specified -->
<Route Url="/photon/m" Ping="true" WebHook="true" PeerType="Simple"/>
<Route Url="/photon/g" PeerType="Reliable"/>
<Route Url="/photon/g1" OverrideApplication="HttpApp1" PeerType="Websocket"/>
<Route
PermittedOrigins="*"
Url="/photon/g2"
InactivityTimeout="12000"
MaxInboundMessageSize="10000"
MaxInboundMessageQueueSize="50000"
MaxOutboundMessageSize="10000"
MaxOutboundMessageQueueSize="50000"
OverrideApplication="HttpApp2"/>
</Routing>
</HTTPListener>
この概念は、アプリケーションごとにリスナーを設定し、必要に応じてエンドポイントごとに追加のルートや追加のヘッダーを設定するというものです。
設定されたルートは、ベースとなるリスナーの設定を継承することも、オーバーライドすることもできます。
HttpListenerノード固有の属性です:
- RouteCounters:
true
またはfalse
- MaxUriLength: URIの最大長。
- MaxHeaderLength: リクエストヘッダーの最大長。
- MaxHeaders: リクエストヘッダーの最大数。
- MaxKeepAliveTime: キープアライブ接続に許容される最大時間です。
- MaxKeepAliveRequests:
- CloseDelayMilliseconds: 接続を閉じるまでの遅延時間。
Routeノード固有の属性です:
- SubProtocols: WebSocketピアタイプの場合のみ。
- PingEvery: このエンドポイントにpingを送信する頻度。
WebSocketピアタイプのみ。
"Ping"がtrue
であることが必要です。
HttpListenerとRouteノードで共有される属性です:
- Name: リスナーまたはルートの名前。
- PermittedOrigins: 許可されたドメイン。v5 BETAでは"Access-Control-Allow-Origin"と呼ばれていたもので、同名のHTTPレスポンスヘッダーを設定します(CORS)。
- Ping: このエンドポイントをpingする必要があるかどうかを
true
またはfalse
で示します。 - WebHook: このエンドポイントをWebHookにするかどうかを
true
またはfalse
で示します。 - Url: このエンドポイントのURL。
注:デフォルトでは、ルートレベルのWindowsパフォーマンスカウンターは、単一のルートを持つHTTPリスナーには作成されません。
##ランタイムノード
使用するPhoton Runtime Assemblyを定義します。
XML
<Runtime
Assembly="PhotonHostRuntime, Culture=neutral"
Type="PhotonHostRuntime.PhotonDomainManager"
UnhandledExceptionPolicy="TerminateProcess">
</Runtime>
- UnhandledExceptionPolicy ("例外処理"を参照してください)
マクロ
パスのマクロ
パスの設定を簡単にするために、最も重要なフォルダのマクロを用意しました。
[EXE]
:サーバの実行ファイル "PhotonSocketServer.exe "が格納されているフォルダ。[CONFIG]
: サーバで使用される設定ファイルが格納されているフォルダ。[DEPLOY]
:[CONFIG]
の親フォルダ、つまり[CONFIG]\...
です。[CERTS]
:デフォルトの "CertificatePath "の値:[EXE]\certs
。
マクロを使って相対パスを形成することができます。
マクロは、サーバー起動時にアンマネージドなPhotonSocketServerのログファイルに記録されます。
Plain Old Text
22572: 16:13:36.098 - Config File: D:\ExitGames\SDKs\Server\Photon-OnPremises-Server-Classic-SDK_v5-0-12-24441-RC1\deploy\bin_Win64\PhotonServer.config
22572: 16:13:36.098 - Config|INFO| Adding config path macro: "[CONFIG]" - "D:\ExitGames\SDKs\Server\Photon-OnPremises-Server-Classic-SDK_v5-0-12-24441-RC1\deploy\bin_Win64"
22572: 16:13:36.098 - Config|INFO| Adding config path macro: "[DEPLOY]" - "[CONFIG]\.."
22572: 16:13:36.098 - Config|INFO| Adding config path macro: "[EXE]" - "D:\ExitGames\SDKs\Server\Photon-OnPremises-Server-Classic-SDK_v5-0-12-24441-RC1\deploy\bin_Win64"
22572: 16:13:36.098 - Config|INFO| Adding config path macro: "[CERTS]" - "[EXE]\certs"
マクロは、PhotonServerインスタンスの設定により、明示的なパスで上書きすることができます。
PathMacro_EXE
PathMacro_CERTS
カウンターマクロ
ルートレベルのカウンター名には以下のマクロを含めることができます:
[ADDRESS]
: IPアドレス 例: 192.168.0.1.[PORT]
: ポート番号 例 8080.[FULL_ADDRESS]
: IPアドレスおよびポート: 192.168.0.1:8080.[ENDPOINT]
: エンドポイントからの名前[PARENT]
: エンドポイントまたはParentCounters=""からの名前.
管理されたSocketServerの設定
PhotonSocketServerに関するいくつかの設定は、アプリケーションレベルで行うことができます。
これは、どのようなサーバーアプリケーションでも、アプリケーションのコンフィギュレーションファイルに、以下のようにオプションの<SocketServer>
ノード/エレメントを追加することで可能です(例では、各設定のデフォルト値を含んでいます)。
XML
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<Photon>
<SocketServer
SecurityProtocol = "Tls12|Tls13"
Protocols = "GpBinaryV16,GpBinaryV18,Json"
MessageRateLimit = "5000"
MessageDataRateLimit = "2147483647"
MaxMessageSizeLimit = "512000"
LogGuardOn = "true"
OnlyLogLimitsViolations = "true">
<S2S
RpcProtocol = "GpBinaryV18"
UseInitV3 = "false"
/>
</SocketServer>
</Photon>
</configuration>
SecurityProtocol
:サーバーが使用するTLSのバージョンを定義します。
現在はTLS1.2とTLS1.3が標準となっているため、デフォルト値は推奨されるより安全なものとなっています。
必要な場合のみ変更してください。
可能な値Ssl3|Tls|Tls11|Tls12|Tls13
.
これは、.NETのSystem.Net.ServicePointManager.SecurityProtocol
を設定します。プロトコル
:このサーバーアプリケーションで使用できるデータシリアライズプロトコルを定義します。MessageRateLimit
: ピアごとに1秒間に許可される受信メッセージの最大数を指定する。
デフォルトは5000です。MessageDataRateLimit
:バッファリングされた受信データについて、ピアごとに1秒間に許容される最大サイズを指定します。
デフォルトは2147483647(int.MaxValue
)です。MaxMessageSizeLimit
: 着信メッセージに許容される最大サイズです。
デフォルトは512000です。LogGuardOn
: スパムの記録に対するガードを有効または無効にします。OnlyLogLimitsViolations
: 制限に違反したときにどのような措置を取るかを定義します。RpcProtocol
: サーバー間の通信に使用されるデータシリアライズプロトコル。UseInitV3
: サーバー間の通信にInitRequestバージョン3を使用するかどうか。