SlideShare uma empresa Scribd logo
1 de 18
Baixar para ler offline
R2 Feedback

  작성자 : 정진욱
최종수정일 : 2013.01.11
1. Worker Thread와 Logic Thread의 운용



일반적으로 접속 혹은 접속종료를 감지하거나 패킷을 받는 일을 하는 스레드를
워커스레드라고 하고 받은 패킷을 처리하는 일을 하는 스레드를 로직스레드라
고 한다.

게임의 설계에 따라서 워커스레드가 로직처리까지 한다거나 로직스레드를 하나
만 둔다거나 로직스레드를 다수로 운용하거나 하는 여러가지 방법이 있다.
Model 1
 Worker Thread    Queue    Logic Thread




  로직스레드없이 워커스레드에서 로직까지 처리하는 방법.
컨텍스트 스위칭이 적어서 잘 구성하면 최고의 성능을 낼수 있지만
네트워크 처리와 로직 처리에 대한 구분을 할 수 없어서 모듈화에는
               좋지 않다.
Model 2
Worker Thread    Queue    Logic Thread




         로직스레드 하나로 처리하는 방법.
    로직 처리시에 따로 lock을 걸지 않아도 되기 때문에
             협업에 유리한 구조
Model 3
Worker Thread    Queue    Logic Thread




 로직스레드 다수로 처리하는 방법. 로직스레드가 다수 이므로
         lock정책을 잘 수립해야 한다.
Model 4
Worker Thread    Queue    Logic Thread




    3번 모델에서 큐를 여러개 두는 방식으로 변형된 방법.
그럼 R2는 어떤 모델일까?
“ Model 1 + Model 3 ”
   Model 1 : 처리 시간이 적은 것은 워커스레드에서 바로 처리(Common TR)

Model 3 : 처리시간이 느린 것은 큐를 통해 로직스레드에서 처리(Non-Common TR)

데드락의 위험성은 존재하지만 시스템에 맞게 적절한 튜닝(스레드 개수 조절)을 통한

                  성능 향상을 할 수 있다.
TR 처리
              Worker
       IOCP                              CTroc   Queue   DB Thread
              Thread




                       Accept



TR송신                    [Common TR]




                       [Non-Common TR]
2. 병렬 프로그래밍 활용

멀티 코어 CPU가 발전하는 만큼 이를 쉽게 사용할 수 있게 해주는 라이브러리
들도 발전하고 있다.

                OpenMP TBB PPL

이들 라이브러리를 이용하면 직접 스레드를 관리하거나 분배하는 수고 없이
수월하게 병렬 처리를 할수 있도록 도와준다.




       “ R2프로젝트에 적용해보자 ”
OpenMP 적용 – BMP파일 병렬로드


OpenMP는 컴파일러 지시자만으로서 블록을 멀티 스레드로 작동하게 할 수 있다.

               #pragma omp parallel

물리적 CPU개수만큼 스레드를 만든다.
OpenMP 적용 – BMP파일 병렬로드




                        단위(초)

            디버그   릴리즈
OpenMP 적용   75     4
   기존       213    11
TBB Container 성능비교

현재 프로젝트에서 사용하는 FnlApi::CQueue 와 성능비교

성능 테스트 방법은 N개의 스레드에서 동시적인 push와 N개의 스레드에서 동
시적인 pop으로 동시성 위주의 테스트

             tbb::concurrent_bounded_queue

- 최대 크기가 정해져 있는 큐
- push 함수는 큐가 꽉 찬 경우, 블로킹된다.
- try_pop 말고도 블로킹되는 pop 함수가 있다.
- size 함수가 음수를 리턴할 수 있으며, 이는 대기 중인 pop 함수 호출의 갯수
를 의미한다.
- abort 함수를 통해 대기 중인 push, pop 함수를 취소시킬 수 있다. (예외 발
생)
TBB Container 성능비교
TBB Container 성능비교




                                                                        단위(nsec)

          Container                    디버그                     릴리즈
                                Push         6552042    Push         4524029
tbb::concurrent_bounded_queue
                                Pop          6708043    Pop          3432022
                                Push         52728338   Push         43992282
       FnlApi::CQueue
                                Pop          16848108   Pop          7800050
3. ETC


소스를 분석 할때 서버와 클라이언트간에 어떤 패킷이 오고 가는지 흐름을 알고
싶을때가 있다. Visual Studio 출력창에 패킷 로그를 남겨서 빨리 알아낼수 있
다.
CTrLogFilter Class
감사합니다.

Mais conteúdo relacionado

Mais procurados

송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
devCAT Studio, NEXON
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
KyeongWon Koo
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
devCAT Studio, NEXON
 
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
devCAT Studio, NEXON
 

Mais procurados (20)

송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
 
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
[야생의 땅: 듀랑고] 서버 아키텍처 - SPOF 없는 분산 MMORPG 서버
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
 
LockFree Algorithm
LockFree AlgorithmLockFree Algorithm
LockFree Algorithm
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬[0903 구경원] recast 네비메쉬
[0903 구경원] recast 네비메쉬
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
Windows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCPWindows Registered I/O (RIO) vs IOCP
Windows Registered I/O (RIO) vs IOCP
 
게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가
 
TBB 소개
TBB 소개TBB 소개
TBB 소개
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
NDC14 - Rx와 Functional Reactive Programming으로 고성능 서버 만들기
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
[야생의 땅: 듀랑고] 서버 아키텍처 Vol. 2 (자막)
 
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
 
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
GPGPU(CUDA)를 이용한 MMOG 캐릭터 충돌처리
 

Semelhante a R2서버정진욱

Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
Byeongsu Kang
 
병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임
codenavy
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
흥배 최
 

Semelhante a R2서버정진욱 (20)

Kubernetes
Kubernetes Kubernetes
Kubernetes
 
[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영[215]네이버콘텐츠통계서비스소개 김기영
[215]네이버콘텐츠통계서비스소개 김기영
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
Exploring Deep Learning Acceleration Technology Embedded in LLMs
Exploring Deep Learning Acceleration Technology Embedded in LLMsExploring Deep Learning Acceleration Technology Embedded in LLMs
Exploring Deep Learning Acceleration Technology Embedded in LLMs
 
Concurrent programming
Concurrent programmingConcurrent programming
Concurrent programming
 
병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임병렬 프로그래밍 패러다임
병렬 프로그래밍 패러다임
 
7가지 동시성 모델 - 6장. 순차 프로세스 통신
7가지 동시성 모델 - 6장. 순차 프로세스 통신7가지 동시성 모델 - 6장. 순차 프로세스 통신
7가지 동시성 모델 - 6장. 순차 프로세스 통신
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
 
동시성 프로그래밍 하기 좋은 Clojure
동시성 프로그래밍 하기 좋은 Clojure동시성 프로그래밍 하기 좋은 Clojure
동시성 프로그래밍 하기 좋은 Clojure
 
Kubernetes in action
Kubernetes in actionKubernetes in action
Kubernetes in action
 
Oop design principle SOLID
Oop design principle SOLIDOop design principle SOLID
Oop design principle SOLID
 
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
 
Thread programming
Thread programmingThread programming
Thread programming
 
Lock free queue
Lock free queueLock free queue
Lock free queue
 
Linux reversing study_basic_4
Linux reversing study_basic_4Linux reversing study_basic_4
Linux reversing study_basic_4
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
 
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
 

R2서버정진욱

  • 1. R2 Feedback 작성자 : 정진욱 최종수정일 : 2013.01.11
  • 2. 1. Worker Thread와 Logic Thread의 운용 일반적으로 접속 혹은 접속종료를 감지하거나 패킷을 받는 일을 하는 스레드를 워커스레드라고 하고 받은 패킷을 처리하는 일을 하는 스레드를 로직스레드라 고 한다. 게임의 설계에 따라서 워커스레드가 로직처리까지 한다거나 로직스레드를 하나 만 둔다거나 로직스레드를 다수로 운용하거나 하는 여러가지 방법이 있다.
  • 3. Model 1 Worker Thread Queue Logic Thread 로직스레드없이 워커스레드에서 로직까지 처리하는 방법. 컨텍스트 스위칭이 적어서 잘 구성하면 최고의 성능을 낼수 있지만 네트워크 처리와 로직 처리에 대한 구분을 할 수 없어서 모듈화에는 좋지 않다.
  • 4. Model 2 Worker Thread Queue Logic Thread 로직스레드 하나로 처리하는 방법. 로직 처리시에 따로 lock을 걸지 않아도 되기 때문에 협업에 유리한 구조
  • 5. Model 3 Worker Thread Queue Logic Thread 로직스레드 다수로 처리하는 방법. 로직스레드가 다수 이므로 lock정책을 잘 수립해야 한다.
  • 6. Model 4 Worker Thread Queue Logic Thread 3번 모델에서 큐를 여러개 두는 방식으로 변형된 방법.
  • 7. 그럼 R2는 어떤 모델일까?
  • 8. “ Model 1 + Model 3 ” Model 1 : 처리 시간이 적은 것은 워커스레드에서 바로 처리(Common TR) Model 3 : 처리시간이 느린 것은 큐를 통해 로직스레드에서 처리(Non-Common TR) 데드락의 위험성은 존재하지만 시스템에 맞게 적절한 튜닝(스레드 개수 조절)을 통한 성능 향상을 할 수 있다.
  • 9. TR 처리 Worker IOCP CTroc Queue DB Thread Thread Accept TR송신 [Common TR] [Non-Common TR]
  • 10. 2. 병렬 프로그래밍 활용 멀티 코어 CPU가 발전하는 만큼 이를 쉽게 사용할 수 있게 해주는 라이브러리 들도 발전하고 있다. OpenMP TBB PPL 이들 라이브러리를 이용하면 직접 스레드를 관리하거나 분배하는 수고 없이 수월하게 병렬 처리를 할수 있도록 도와준다. “ R2프로젝트에 적용해보자 ”
  • 11. OpenMP 적용 – BMP파일 병렬로드 OpenMP는 컴파일러 지시자만으로서 블록을 멀티 스레드로 작동하게 할 수 있다. #pragma omp parallel 물리적 CPU개수만큼 스레드를 만든다.
  • 12. OpenMP 적용 – BMP파일 병렬로드 단위(초) 디버그 릴리즈 OpenMP 적용 75 4 기존 213 11
  • 13. TBB Container 성능비교 현재 프로젝트에서 사용하는 FnlApi::CQueue 와 성능비교 성능 테스트 방법은 N개의 스레드에서 동시적인 push와 N개의 스레드에서 동 시적인 pop으로 동시성 위주의 테스트 tbb::concurrent_bounded_queue - 최대 크기가 정해져 있는 큐 - push 함수는 큐가 꽉 찬 경우, 블로킹된다. - try_pop 말고도 블로킹되는 pop 함수가 있다. - size 함수가 음수를 리턴할 수 있으며, 이는 대기 중인 pop 함수 호출의 갯수 를 의미한다. - abort 함수를 통해 대기 중인 push, pop 함수를 취소시킬 수 있다. (예외 발 생)
  • 15. TBB Container 성능비교 단위(nsec) Container 디버그 릴리즈 Push 6552042 Push 4524029 tbb::concurrent_bounded_queue Pop 6708043 Pop 3432022 Push 52728338 Push 43992282 FnlApi::CQueue Pop 16848108 Pop 7800050
  • 16. 3. ETC 소스를 분석 할때 서버와 클라이언트간에 어떤 패킷이 오고 가는지 흐름을 알고 싶을때가 있다. Visual Studio 출력창에 패킷 로그를 남겨서 빨리 알아낼수 있 다.