이번 파트에서는 Photon Server의 구성 파일과 디렉터리 구조 및 이들의 설정 방법과 이러한 설정으로 가져올 수 있는 변화에 대해 알아보겠습니다. 서버에서 실행되고 있는 응용프로그램 설치 위치, 상이한 TCP/UDP 포트 설정 방법, 전송 데이터 버퍼 용량 변경 방법, Timeout 유형의 시간 설정 및 오류 발생 시 처리 검사 등등도 함께 말이죠.
본 파트에서 언급되는 데이터 파일 모두 Photon Server SDK 설치 목록 내 deploy 하단에서 찾아볼 수 있습니다!
아래 주제로 들어가기 전에 이전에 언급했던 응용프로그램 소개 편을 참고해주세요. 참고하고 나면 본 파트 내 일부 단어와 설명을 좀 더 쉽게 이해할 수 있습니다!
Photon Server SDK(Part 1) — Applications
서버 및 응응프로그램(Applications) 디렉터리 구성
deploy 디렉터리 하위 경로에 bin_Win32, bin_Win64와 같은 몇 가지 버전의 Photon Server 메인 프로그램이 존재합니다. 우리는 이러한 디렉터리를 바이너리 폴더(Binaries-folders)라 부르며, 편역/조합해 놓은 서버 메인 프로그램(PhotonServer.exe) 및 관리 프로그램(PhotonControl.exe), 기본 디렉터리를 기본적으로 설치합니다.
64bit PhotonServer, PhotonControl 프로그램 위치 디렉터리
Photon 규격 내 조건으로 서버에 실행되고 있는 프로그램별 배치 장소 조건은 반드시 이러한 Binaries-folder 디렉터리 서브와 동일해야 합니다. 내부에 구축한 LoadBalancing(서버에 실행되는 응용프로그램)과 같이 deploy 디렉터리 서브에 설치하고, 조합한 dll 파일은 반드시 bin 서브 디렉터리에 설치해야 합니다. 예: LoadBalancing/GameServer/Bin
응용프로그램 LoadBalancing 위치: deploy/LoadBalancing/GameServer/Bin/
bin_tools 디렉터리에도 일부 유용한 도구가 내장되어 있습니다.
- Baretail:
실시간 운영 정황 로그 파일 저장 도구 사용(무료 버전) PhotonControl실행을 시작하면 해당 도구를 호출해 일부 최신 서버 및 응용프로그램의 실시간/과거 로그 기록을 조회해 볼 수 있습니다. - Photon Dashboard:
해당 서비스로 일부 서버 작동 시 성능 데이터 자료를 수집 및 집중시키고 매우 편리한 방식을 제공해 네크워크상에 표시할 수 있는 아주 유용한 서브 기능 중 하나입니다. - Perfmon:
일부 서버 운영 시 데이터를 파일에 보관할 때, PerfMon 카운터 레코더 리스트가 존재하게 됩니다. (하단의애플리케이션 노드에서 다시 설명 예정) - Stardust:
Windows 명령열 테스트 프로그램은 주로 많은 클라이언트를 시뮬레이션함과 동시에 서버 연결 시 사용해 목적 서버에 약간의 부하가 생길 수 있습니다. 이전의 Test 클라이언트 연결 테스트소개에서 사용방법을 확인할 수 있습니다.
홈페이지에서 다운로드한 Server SDK 4.x 버전을 설치하고 나면 deploy와 같은 라인의 디렉터리에서 src-server 디렉터리를 볼 수 있습니다. 해당 경로 내부에는 일부 Photon에 내장된 응용프로그램 소스 코드가 입력되어 있습니다. 예시: CounterPublisher, Lite, Loadbalancing, MmoDemo, Policy 등. 이러한 소스 코드를 변환한 응용프로그램과 Photon Server 관련 설정 모두 Photon 설정 파일에서 편집합니다. 계속해서 자주 사용하는 일부 설정을 소개하겠습니다.
서버 구성 파일: PhotonServer.config
Photon 서버에서, 가장 메인 구성 파일은 PhotonServer.config로, 가장 세세한 매개 변수 설정은 홈페이지 기초자료설명을 클릭해 참고할 수 있습니다! SDK 설치 후, 버전 별 Binaries-folder에도 관련된 설정 파일(config 파일)이 해당 디렉터리에 존재합니다. XML 형식으로, 메인 기능은 서버에 실행할 응용프로그램 매개 변수, 연결 매개 변수, IP 위치 설정 및 성능 관련 설정 수치를 설정하는 것입니다. 게임과의 논리 및 매개 변수는 아무 상관이 없습니다.
해당 설정 파일 내 기본으로 설정된 수치는 Photon Server가여러 핵심 설정에서 잘 실행될 수 있도록 보장하기 때문에, 일반 규격 기기도 부하 부담 없이 지탱할 수 있습니다. 일반 프로세스로 말하자면, 매개 변수를 변경해 성능을 조정할 필요가 없습니다. 이어서 일부 가장 많이 사용하는 노드 설정에 대해 알아보겠습니다.
애플리케이션 노드
config 설정 파일 내 해당 노드에서는 Photon Server 부팅 시 로딩해야 할 애플리케이션을 정의해놓았습니다. 애플리케이션 노드에는 여러 애플리케이션 진입점을 정의할 수 있습니다.
아래 예시처럼 명칭, 디렉터리 및 유형 등등 Lite 애플리케이션 한 개를 정의해보았습니다.
<Applications Default="Lite">
<! -- Lite Application -->
<Application
Name="Lite"
BaseDirectory="Lite\Lite"
Assembly="Lite"
Type="Lite.LiteApplication"
EnableAutoRestart="true"
WatchFiles="dll;config"
ExcludeFiles="log4net.config">
</Application>
<! -- 다른 애플리케이션-->
</Applications>
<Application
...
>
</Application>
- Name:클라이언트를 서버에 연결할 때 사용하는 애플리케이션은 이곳에서 지정한 앱 명칭입니다. 따라서, 애플리케이션마다 앱별 식별 이름을 가지게 됩니다.
- BaseDirectory: 응용프로그램 설치한 기본 디렉터리 위치, \bin 내 경로 별도로 명기할 필요 없어 편리합니다. 단, 실제 경로에서는 bin 이 해당 디렉터리 서브에 존재해야 합니다.
- Assembly: 응용프로그램.dll 명칭
- Type: 애플리케이션의 메인 유형 별 명칭, Photon.SocketServer.Application main class를 이어갑니다.
- EnableAutoRestart: 응용프로그램을 설정 시 Photon 서버에서 자동으로 재부팅되는지 여부.
- WatchFiles: 어떤 파일을 모니터링할 때, 변화가 있어야만 자동으로응용프로그램이 재부팅됩니다.
- ExcludeFiles: 모니터링이 불필요한 파일. (응용프로그램 재부팅 방지)
Photon이 가진 특수 기능으로, 개발자의 편리한 응용프로그램 개발을 위해, 프로그램 자동 재부팅을 도와줍니다. 이 기능의 원리는 이미 로딩한(플레이 사용자 존재) 응용프로그램을 Shadow Copy해 모니터링하는 파일을 개발자가 변경할 때, Photon 서버에서 바로 10초 후 새로운 응용프로그램 인스턴스(instance)를 재부팅하고, 기존 네트워크상의 클라이언트도 끊어지지 않고, Shadow Copy 인스턴스와 연결을 유지합니다. 새로 추가된 네트워크상의 클라이언트는 새로 추가된 인스턴스 게임 로직을 사용하게 됩니다. 이러한 기능으로 프로그램이 업데이트되어도, 사용자 모두가 강제 재부팅 없이 업데이트할 수 있습니다.
여러 응용프로그램을 로딩하려면, 애플리케이션 노드 추가 재설정을 진행해야 합니다. 식별 이름의 고유값을 기억해야 합니다. 이 중 "기본"으로 설정할 수 있는 응용프로그램이 있습니다. 클라이언트를 연결할 때 사용하나, 제공한 이름이 틀릴 경우 Photon 서버에서 자동으로 클라이언트를 해당 기본 응용프로그램에 연결합니다.
PhotonServer.config 설정 파일에 기록한 응용프로그램이 없을 경우, 서버에 로딩되지 않고, 배치할 필요도 없습니다. 설정 파일 내 한 응용프로그램을 설정했으나, 해당 경로가 잘못되었거나 파일을 찾지 못할 경우, Photon 서버에서 해당 프로그램을 부팅하지 못합니다. 따라서 후속 검사의 편리를 위해 해당 프로그램의 이름을 로그 파일에 기록해두어야 합니다.
UDPListeners 및 TCPListeners 노드
해당 노드는 바로 Photon 서버를 사용하려는 기기에 연결하는 엔드포인트입니다. 양자 모두 사용할 수 있거나 하나만 사용할 수 있습니다(UDP만 사용하는 것과 같음).
기본 설정 IP: 0.0.0.0으로, Photon 서버가 사용할 수 있는 로컬 위치를 모니터할 수 있습니다. 지정 수치를 설정하면 특정 IP 위치 및 포트 번호만 모니터합니다! 또한, 여러 모니터링을 원하는 UDPListener 및 TCPListener 노드를 정의할 수 있어, 여러 IP/포트 조합을 활성화할 수 있습니다. 아래 샘플과 같이 두 번 그룹의 UDP 모니터링 노드 설정을 활성화했습니다.
UDPListener 및 TCPListener 노드마다 OverrideApplication 또는 DefaultApplication 수치 설정이 가능합니다. 작용은 다음과 같습니다.
- OverrideApplication: 해당 코드의 클라이언트와 연결하면 해당 지정 이름을 가진 응용프로그램과 연결되기 때문에 클라이언트가 연결하고자 하는 것은 관여하지 않아도 됩니다.
- DefaultApplication: 호환성 매개 변수로, 클라이언트에서 지정한 응용프로그램을 찾지 못했을 경우, 이것의 기본 응용프로그램과 연결하게 됩니다.
<UDPListeners>
<UDPListener
IPAddress="0.0.0.0"
Port="5055"
OverrideApplication="Master">
</UDPListener>
<UDPListener
IPAddress="0.0.0.0"
Port="5056"
OverrideApplication="Game1">
</UDPListener>
</UDPListeners>
Unity 기본 포트(Port) 번호 변경
Unity 에서 상응하는 마스터 애플리케이션의 기본 포트 번호는 5055입니다. 게임 서버 포트 번호는 5056 + 5057입니다. 이 기본 수치를 변경하고 싶다면 어떻게 처리해야 할까요?
가장 먼저, PhotonServer.config 설정 파일의 아래 노드에서 포트 번호부터 변경합니다! 🐶
<UDPListeners>
<UDPListener
IPAddress="0.0.0.0"
Port="5055"
OverrideApplication="Master">
</UDPListener>
<UDPListener
IPAddress="0.0.0.0"
Port="5056"
OverrideApplication="Game1">
</UDPListener>
<UDPListener
IPAddress="0.0.0.0"
Port="5057"
OverrideApplication="Game2">
</UDPListener>
</UDPListeners>
이어서, /deploy/Loadbalancing/GameServer1 및 /GameServer2에서 GamingUdpPort 번호를 변경합니다.
변경 예시:
<setting name="GamingUdpPort" serializeAs="String">
<value>5056</value>
</setting>
우리 클라이언트의 수치를 새로 변경한 마스터 서버 포트에 변경한 후, Photon 서버를 다시 부팅하면 됩니다! 🙃
TCPSilverlightListeners 및 TCPFlashListeners 노드
두 번째 노드는 일반적으로 말해 사실상 삭제할 수 있는 그리 필요하지 않은 노드입니다… 단, Silverlight 개발이나 Flash 관련 게임 개발에 있어선 매우 중요한 부분입니다!! 이 두 클라이언트 쪽 플랫폼 모두 서버에서 Policy File에 응답해야 합니다. 단, 웹사이트와Photon 서버 도메인이 동일하다면, 두 번째 노드를 설정할 필요가 없습니다!
Timeout Settings 오버 타임 설정
두 매개 변수가 응답하지 않은 UDP 클라이언트에 오버타임 설정 가능: Minimum Timeout 및 Maximum Timeout. 예시:
<LoadBalancing
MaxMessageSize="512000"
MaxQueuedDataPerPeer="512000"
PerPeerMaxReliableDataInTransit="51200"
PerPeerTransmitRateLimitKBSec="256"
PerPeerTransmitRatePeriodMilliseconds="200"
MinimumTimeout="5000"
MaximumTimeout="30000"
DataSendingDelayMilliseconds="50"
AckSendingDelayMilliseconds="50"
DisplayName="LoadBalancing (MyCloud)">
...
</LoadBalancing>
한 엔드포인트에서 UDP로 연결한 경우, 기존에 연결한 가장 짧은 응답 대기 시간, MinimumTimeout(1,000분의 1초로 표시)이 분리됩니다. 연결이 끊어지기 전의 타임은 연결별 엔드포인트의 RoundTripTime(RTT) 과거 기록과 변화 추이에 따라 결정되기 때문에 과거 좋은 RTT가 존재했다면 비교적 빨리 단절되어 UDP 전송 효율이 좋아지게 됩니다.
TCP 연결 방법은 TCPListener 및 TCPPolicyListener의 InactivityTimeout로 설정(모두 동일하게 PhotonServer.config 내 설정)합니다. 기본 설정 시간은 5초(5000ms)입니다. 만약 한정 시간내 요청한 신호가 도착하지 않았을 경우, 연결 시간 초과(Time out)로 닫히면서 종료됩니다. 따라서, 클라이언 에서 규칙적으로 ping 신호를 서버로 송출해야만 TCP가 끊기지 않게 할 수 있습니다.
마찬가지로, 우리도 게임이 어떻게 설계되었는지 보면서 얼마나 빠르게 해야 하고 어느 정도까지의 지연을 받아들 수 있는지 살펴봐야 하는데 클라이언트-서버 간에 반드시 동일한 time out 시간이 존재할 것입니다!
Send Delay 및 Ack Delay
상단의 샘플 설정 내 존재하는 별개의 특수 매개 변수 : DataSendingDelayMilliseconds 및AckSendingDelayMilliseconds의 속성 수치는 효율과 최소 응답 시간을 절충해 이끌어낸 것입니다. 전송 및 응답 시간 지연 모두 약간의 지연이 발생하나, 네트워크 대역폭 사용을 감소할 수 있습니다. 이런 작은 기다림조차도 서버에서 일부 명령(cmd)을 수집해야 하고 해당 정보를 종합해 한 번에 패킷으로 전송해야 합니다. Send 지연은 서버 무언가 전송하려고 할 때 촉발되며, ack 지연은 신뢰할 만한 데이터가 들어올 때(reliable data) 발생합니다.
위의 설정을 예시로, 기본수치가 50(ms)이라 한다면 적어도 대략 50ms의 왕복 소요 시간이 발생함을 발견하게 됩니다. 설령 클라이언트와 서버를 동일 기기에서 테스트한다 해도 동일하게 적용됩니다. 따라서 게임 설계 시, 상이한 수치로 테스트해야만 게임에 비교적 적합한 조건 포인트를 찾을 수 있습니다!
처음부터 여기까지 모두 보셨다면 Photon Server SDK 설치 후의 디렉터리 구조와 초기 구성에 대해서 어느 정도 이해하셨을 것입니다. 간단하죠?
이후로 예를 들어, 안전성 문제를 고려하고 있는 상황에서 다른 TCP/UDP의 IP/포트를 변경하거나 설정하고 싶다거나, 프로그램 전송 효율을 높여 비교적 적합한 완충 구역의 규모를 변경하고 싶다거나, 이러한 여러 설정 모두 PhotonServer.config에서 매개 변수와 함께 합리적으로 수정 및 테스트할 수 있습니다. 아주 편리하겠죠! 👍
이후 고급 문서에서도 계속해서 서버 설정 구성 파일 내 다른 세부적인 설정 내용이 언급되오니 계속해서 읽어주세요~
댓글
댓글 0개
댓글을 남기려면 로그인하세요.