Upload
hyun-jik-bae
View
2.256
Download
5
Embed Size (px)
DESCRIPTION
스마트폰 온라인 게임에서 서버,네트워크 프로그래밍 관련해서 고려해야 할 것들
Citation preview
스마트폰 온라인 게임에서 고려해야 할 것들
넷텐션배현직
대표적 이슈들• 폰 하드웨어• 무선 네트워크• 멀티플랫폼• 서버의 역할• 클라우드 서버
모바일• 게임 출시 경험이 몇차례 있는 모바일 게임
업체들은 , 생각보다 성능에 목숨거는 분위기• 어머님 , 아버님은 폰 안바꿈• 카톡만 되면 됨
처리 성능• 10 년전 데스크탑 성능• 그러나 더 악조건
• iPhone 4S 의 전체 메모리는 512MB• 그 중에서 실제 사용가능한 프로세스
메모리는 ?• iOS 7 50~200MB• iPhone 5S 에서 iOS 8 업그레이드 후 잔여
공간이 700 에서 500MB 로 하락 !
• 메모리 모자라면 PC 는 ? 한편 모바일은 ?
• 60Hz 만 충족시킨다고 ok? 배터리는 ?
• 하이엔드 경험을 위해 60Hz 강행• 배터리 아끼기 위해 15Hz 로 다운• 멀티스레드 싫어함 & 소켓 버퍼 커야
네트워크의 고약한 점• 긴 하위호환성의 문제• 사람 피를 완전히 바꾸는 것만큼 어려움• 유선 네트워크보다 무선 네트워크가 물리학상으로도 훨씬 더 불안정
3G
• RTT 50~100ms• 위치 이동 안해도 20% 까지 패킷로스 증가
3G
• 에이… LTE 나온지가 벌써 3 년 지났어요 !
78.4
21.6
3GLTE
2013 년 조사 결과
Wifi 자체가 일으키는 패킷 드랍과 딜레이
UDP 의 레이턴시 vs. TCP 의 레이턴시
TCP on packet drop
• 무선 통신의 높은 레이턴시와 패킷 드랍율 • TCP 는 쉽게 retransmission 랙이
발생함
• 결론 : UDP 꼭 쓰세요
20~200ms
20%
20~200ms (80%)520~720ms (20%)
UDP only 면 충분 ?
• 기업 방화벽• 일부 wifi AP• 일부 3G/LTE 기지국
• 결론 : TCP 를 꼭 혼용하세요 ( 프라우드넷은 옛날부터 이미 ㅋ )
UDP vs. traffic conservation
• 무선 통신량 패킷 드랍율• 전파 혼잡 패킷 드랍율• 결국 한번 보낼 때 적게 패킷 보내야
• 결론 : UDP 패킷을 필요한 것들은 합쳐 보내세요• 그렇다고 너무 합치면 합침 대기 간격
(coalesce interval) 자체가 랙이 됨• RTO 에 비례해서 잡아야 ( 아니면 프라우드넷을… ㅋㅋ )
모바일에서 P2P
• 프라우드넷은 선 홀펀칭 후 릴레이 방식 게임 개발자는 그냥 항상 홀펀칭 된다는 가정하에 코딩 • 홀펀칭 대기 시간이 없어 개발은 편하지만 ,
안타깝게도 양쪽 다 LTE 인 경우 홀펀칭 안됨 • 하나 이상이 wifi 이면 85( 국외 )~95%( 국내 ) 지만
• 3G/LTE vs. Wifi• 게임 하다가 wifi 존에서 나간 경우• 게임 하다가 wifi 존에 도착한 경우• 게임 플레이하다 전화가 온 경우
MPTCP 가 뜰까 ?• 연결 유지 기능을 TCP stack 에 !• 거의 모든 라우터에서 TCP 타입 IP 패킷을 투과시킨다는 점을 착안• TCP option field hacking! 페이로드 손 안댐 ! 님좀짱 !• Proof of Concept (POC)
Wifi
MPTCP-aware Server
3G
• MPTCP in iOS7• Siri ( 검증중 ?)• 후퇴 가능한 프로토콜• 올리버 논문의 변경 없이 안착한다면 ?• 그렇지 않다면 ?
• SCTP, DCCP 혹은 기타는 안나오나 ?• 나온지 10 년이 넘었는데도 안착 못하는 이유
• 프라우드넷에서는 ?• P2P, C/S 모두 연결유지 기능 프로토타입 구현된 상태• 리눅스 포팅 끝나면 마무리 예정 ( 현재 일부 업체 임상실험 (…) 중 )• 기존 사용중 업체들에게는 무료로 업데이트될거임
멀티플랫폼
현재 지원중언어 네트워크 클라이언트 생성C++ CNetClient* a=Proud::CNetClient::Create();
C# NetClient a=new Nettention.Proud.NetClient();
UnrealScript a = class'NetClient'.static.Create();
Java NetClient a=new com.nettention.proud.NetClient();
플랫폼 네트워크 클라이언트 라이브러리Windows ProudNetClient.lib
iOS libProudNetClient.a
Android, NDK ProudNetClient.jar libProudNetClient.a
Unreal Engine 3 UnrealEngine3/Development/src/ProudNet/*.*
Unity Engine ProudNetClient.dll (Android, iOS 도 동일 )
• 짜증나더라도 , epoll, kqueue, simple poll 은• reactor 모듈로 , iocp 는 proactor 모듈로 이원화 후 • 제각각 케이스를 만들어야 성능에 유리 • syscall 과 1:1 대응하기 때문 . 모바일에서 성능에 중요한 요소임
언어 비동기 I/O API 이벤트 대기 함수Windows IOCP GetQueuedCompletionStatus
Android epoll epoll_wait
iOS kqueue kevent
Marmalade simple poll select
• Win32 API 쓰던 부분들 다 뜯어냄• #if 떡칠 최대한 모아놓고 거기서만 #if 떡칠• 제일 까다로왔던 부분은 의외로… string 부분임 -0-;
VC++, Marmalade Android, iOS
char Multibyte (3 개 국어 소화 불가능 )
UTF-8
wchar_t UTF-16 UTF-32 ( 메모리 너무 차지 )
• Mono ≠ .Net Framework• iPhone3GS, iPhone 4 에서 일으키는 문제• Mono Socket.Connect 함수의 버그
단일 서버
논리적 단일 서버
Web Application Server aka. WAS
• 클라이언트와 서버간 HTTP 로 통신• php, asp.net, node.js, java, …
클라 LB
php
php
php
MySQL
redis
redis
redis
클라우드 서버• 로드밸런서• 웹서버• 서버간 메모리
동기화 & 캐시• 백엔드 디비
장점• 빠른 개발• 손쉬운 클라우드 서버 인스턴싱• No down-time • 간편하게 scale out 가능• 연결 유지 불필요
단점• 랙• 스토리지 과부하
TCP synrelay write/ack
• 해킹된 클라
해킹된 판정 결과
• 많은 계층 • HAL-VM-Linux-Apache-PHP-…• 서버간 통신량• TIME_WAIT
• 플레이어간 상호작용에 하이젠버그
• 몇 단점에도 불구하고 장점이 매우 큼• 낮은 반응 속도 < 높은 안정성
• 비동기 멀티플레이 게임에서는 만족
decision making tree
비동기 멀티플레이
동기 멀티플레이 TCP, UDP
클라에서 플레이 판정
(빠른 반응성 , 서버 유지비 절감 )
서버에서 플레이 판정( 해킹 방어 ,
잠수함 패치 용이 )
HTTP
웹서버 + 프라우드넷• 이렇게 개발하는 경우• 처음에 웹서버로 개발하다가
중도에 필요해지는 경우 • 멀티플레이 , 서버사이드 게임판정
• 어떻게 같이 사용하는지• DB 를 매개채로 데이터 공유• 플러그인을 통해 서버간 통신
논리적 단일 서버• 우리의 DB cache 시스템으로 논리적 단일 서버를 이렇게 구축
게임DB
유저계정 DB
DB cache server
게임DB
유저계정 DB
DB cache server
게임DB
유저계정 DB
DB cache server
게임DB
유저계정 DB
DB cache server
게임서버
게임서버
게임서버
매핑 DB 매핑 DB
매핑 DB
클라
클라우드
클라우드 서버
3 6 9 12 18 240
5000
10000
15000
20000
25000
30000
35000
40000
45000
CCU
리얼 서버클라우드 서버
TCO 12
TCO 5.8
클라우드 서버에서• 점검 없이 서버 증감• 클라우드 서버에서 매핑 DB• 인스턴수 줄이면 마이그레이션 어쩔…• 매핑 DB=SPOF? 미러링하세요
실시간 멀티플레이는 ?Hypervisor
VMCPU
100%
VMCPU 20%
랙 유발
클라우드에서 프라우드넷의 성능• 모바일 게임 Fish Riots
라이브 서버• A???? US West• 7GB RAM, 4 CPU• Windows Server 2012• 화면에 최대 50 개의 타
플레이어가 보여짐 ( 일반적인 MMORPG 보다 2 배정도 부하를 줌 )
• 스트레스 테스트 클라이언트를 사용• No P2P
• 동시접속자 1112명에서 CPU 8~12% 사용• System process 는 약
6% 를 사용 ( 서버 반 클라 반 )
• 일반적인 서버의 한계 수위가 CPU 80% 인 점을 감안하면 , 최대 동시접속자 7000명 처리 가능
리얼 머신에서 처리 성능CPU Intel® Core™ i7-2600 CPU @
3.40GHz(4 코어 & 하이퍼스레딩 )
메모리 16.0GB
운영체제 Window 8.1 Pro K
시스템 종류 64 비트 운영체제 , x64 기반 프로세서
더미 클라이언트1000 개+
즉 , 80% 기준으로 동시접속자
20000명 처리
채팅 서버 머신당 동시접속자 6 만그것도 라이브 서비스에서
지금 프라우드넷은…• 온라인 게임 플레이에서는 자신있는데 ,• 실시간 멀티플레이• 서버에서의 게임플레이 판정
• 문제는 대부분의 모바일 게임이 오프라인이라는…
• 아무튼 , 방망이는 계속 깎습니다(새로운 종류의 방망이도 만드는 중 )
유니티 관련 세미나인데 유니티에 대한 얘기가 없네요 ?
프라우드넷 on 유니티
13 Unity-powered5 unkown
4 other engines