SlideShare una empresa de Scribd logo
1 de 99
Descargar para leer sin conexión
Thread Blocking Is Evil
    게임네트웍컴포넌트팀
        김준현
Thread
Blocking
Non-Blocking
      &
순차적 코드 작성
Why does
Multi-Thread
  matter?
“The Free Lunch
   is OVER.”


                Herb Sutter
             December 2004
Clock speed
Execution optimization
Cache
Hyperthreading
Multicore
Cache
Write Multithreaded
    Application
MULTI
THREAD
CONCURRENCY
하지만
현실은?
줄을 서서
기다린다
도대체

왜?
Thread
Blocking
Starvation



             Deadlock
Starvation
Task A           Task B
1: Lock          1: Sleep 1msec
2: Sleep 2msec
3: Unlock
Deadlock
 Hold & Wait
Thread A                         Thread B
1A: Lock                         1B: Lock
2A: Request                      2B: Send Response
3A: Wait for Response            3B: Unlock
4A: Do something with Response
5A: Unlock
Thread A                         Thread B
1A: Lock                         1B: Lock
2A: Request                      2B: Send Response
3A: Wait for Response            3B: Unlock
4A: Do something with Response
5A: Unlock
My
Problem
로비-룸 형태의
 게임을 제작
Remote Procedure Call
처리 로직을 함수 단위로
짜기 때문에 개발이 쉽다
방 입장 RPC          인증 RPC
Game Client              Room            Lobby
Game Client                 Room               Lobby

              방 입장 RPC 호출

                                   인증 RPC 호출

              방 입장 RPC                                 인증 RPC
               처리 로직                                   처리 로직
                                   인증 RPC 반환



              방 입장 RPC 반환
Game Client                 Room               Lobby

              방 입장 RPC 호출

                                   인증 RPC 호출

              방 입장 RPC                                 인증 RPC
               처리 로직                                   처리 로직


                                   인증 RPC 반환


              방 입장 RPC 반환
Game Client                  Room               Lobby

               방 입장 RPC 호출

                                    인증 RPC 호출



              Lobby 응답 지연
               방 입장 RPC                                 인증 RPC
                처리 로직                                   처리 로직


                                    인증 RPC 반환


               방 입장 RPC 반환
Game Client                  Room               Lobby

               방 입장 RPC 호출

                                    인증 RPC 호출



              Lobby 응답 지연
               방 입장 RPC                                 인증 RPC
                처리 로직                                   처리 로직



Room서버 throughput
               방 입장 RPC 반환
                                    인증 RPC 반환




     저하
악의 축은?
Game Client                 Room               Lobby

              방 입장 RPC 호출

                                   인증 RPC 호출

              Thread
              Blocking             인증 RPC 반환



              방 입장 RPC 반환
RPC의 태생적 한계
처리 로직을 함수 단위로
짜기 때문에 개발이 쉽다
처리 로직을 함수 단위로
짜기 때문에 찢을 수 없다
RPC::Result* JoinRoom(…)
{
   …
   RPC::Result answer = RPC::SyncCall(“VerifyLobbyUserToken”, …);
   ….
   return result;
}
우리가 원하는 것
RPC의 장점인
순차적 코드 작성

Non-Blocking
가능한 해결책은?
RPC 이원화
방 입장 요청 RPC                 인증 요청 RPC
Game Client                        Room                      Lobby

              방 입장 응답 RPC                 인증 응답 RPC
Non-Blocking O
                     방 입장 요청 RPC                 인증 요청 RPC
Game Client                        Room                      Lobby

              방 입장 응답 RPC                 인증 응답 RPC




                 순차적 코딩 X
RPC 이원화
Thread Pool 분리
Room
              방 입장 RPC            인증 RPC
Game Client              TP#1              Lobby

                         TP#2
              기타 RPCs
순차적 코딩 O
                             Room
                방 입장 RPC            인증 RPC
Game Client                TP#1              Lobby

                           TP#2
                기타 RPCs




              Non-Blocking X
Thread Pool 분리
이대로 끝인 거야?
Solution
Asynchronous
Programming
Request(callback, …)
Pros:
Non-Blocking
Cons:
Can’t Write Sequential Code
Can’t Use Stack Variable
Can’t Split Programming Construct
…
어렵다!
이대로 끝인 거야?
Coroutine
Similar to Thread
Line of Execution
Stack
      &
Local Variable
But
Non-preemptive
Instruction:
Yield
Yield Break
Resume
Coroutine을
제공하는 언어는?
C#
      Erlang
      Haskell
JavaScript(since 1.7)
        Lua
        Perl
 Python(since 2.5)
       Ruby
         …
C++은?
손수 구현해야 한다
Windows: Fiber

Linux:
getcontext/setcontext
makecontext
swapcontext
Asynchronous
Programming
      +
  Coroutine
Non-Blocking
      &
순차적 코드 작성
Solution
   for
Starvation
Task A           Task B
1: Lock          1: Sleep 1msec
2: Sleep 2msec
3: Unlock
Task A                                 Task B
Thread A                               1: Sleep 1msec
1: Create & Resume   Coroutine
                     2: Request Lock
                     3: Yield          Non-Blocking
Thread A‟
4: Resume
                     5: Sleep 2msec
                     6: Yield Break
7: Unlock
                                Sequential
                                  Code
Solution
    for
Deadlock
 Hold & Wait
Thread A                         Thread B
1A: Lock                         1B: Lock
2A: Request                      2B: Send Response
3A: Wait for Response            3B: Unlock
4A: Do something with Response
5A: Unlock
Thread A                                    Thread B
1A: Lock                                    1B: Lock
2A: Create & Resume     Coroutine           2B: Send Response
                        3A: Request         3B: Unlock
                        4A: Yield           Non-Blocking
5A: Unlock
Thread A‟
(invoked by response)

6A’: Lock
7A’: Resume
                        8A’: Do something
                        with response
                        9A’: Yield Break
10A’: Unlock
                                Sequential
                                  Code
Solution
    for
My Problem
Game Client                 Room               Lobby

              방 입장 RPC 호출

                                   인증 RPC 호출

              Thread
              Blocking             인증 RPC 반환



              방 입장 RPC 반환
룸 Thread       로비 서비스
1R: 인증 요청      1L: 인증 요청 처리
2R: 인증 응답 대기   2L: 인증 응답 보내기
3R: 방 입장 처리
룸 Thread                                   로비 서비스
1R: Create & Resume     Coroutine          1L: 인증 요청 처리
                        2R: 인증 요청          2L: 인증 응답 보내기
                        3R: Yield          Non-Blocking
룸 Thread‟
(invoked by response)

4R’: Resume
                        5R’: 방 입장 처리
                        6R’: Yield Break


                                Sequential
                                  Code
Request & Wait

Request & Yield
RPC의 장점인
순차적 코드 작성

Non-Blocking
Coroutine
(Fiber)
                                      User-mode Scheduling
                                    Kernel-mode Scheduling
Thread




            CPU   CPU   CPU   CPU
RPC
Coroutine
                              Execution
  Pool
                             Thread Pool



            RPC Task Queue



             Network I/O
             Thread Pool
Network I/O             RPC Task             RPC Execution                                      Coroutine
      Thread                Queue                  Thread                                            Pool
Network
 Event             task
                 enqueue                task
                                      dequeue
                                                                   acquire coroutine
                                                                                       coroutine
                                                                     RPC
                                                          start    Execution



                                                          yield return
Network          resume
 Event             task               resume
                 enqueue
                                        task
                                      dequeue
                                                          resume



                                                           yield break

                                                                   release coroutine                           pooling
Network I/O             RPC Task             RPC Execution                  RPC Execution                  Coroutine
      Thread                Queue                 Thread 1                       Thread 2                       Pool
Network
 Event             task
                 enqueue                task
                                      dequeue
                                                                   acquire coroutine
                                                                                               coroutine
                                                                     RPC
                                                         resume    Execution



                                                          yield return
Network          resume
 Event             task               resume
                 enqueue
                                        task
                                      dequeue
                                                                           resume



                                                                         yield break

                                                                                          release coroutine               pooling
RPC::Result* JoinRoom(…)
{
   …
   RPC::Result answer = RPC::SyncCall(“VerifyLobbyUserToken”, …);
   ….
   return result;
}
RPC::Result* JoinRoom(…)
{
   …
   RPC::Result answer = RPC::SyncCallYield(“VerifyLobbyUserToken”, …);
   ….
   return result;
}
T
P
S


    쓰래드 갯수
Wrap-up
“The free lunch
  is OVER.”
   Write Multithreaded
        Application
       CONCURRENCY
Thread Blocking is Evil

  Starvation   Deadlock
Asynchronous
Programming
      +
  Coroutine
Non-Blocking
      +
    Writing
Sequential Code
Request & Wait

Request & Yield
Inspired by
  Jeffrey Richter
 ‘Simplified APM With
The AsyncEnumerator’
완벽함이란
더 이상 추가할 것이 없을
때가 아니라
더 이상 버릴 것이 없을
때 완성된다.
        „성당과 시장‟에서

Más contenido relacionado

Más de NAVER D2

[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기NAVER D2
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep LearningNAVER D2
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applicationsNAVER D2
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingNAVER D2
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지NAVER D2
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기NAVER D2
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화NAVER D2
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)NAVER D2
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기NAVER D2
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual SearchNAVER D2
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화NAVER D2
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지NAVER D2
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터NAVER D2
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?NAVER D2
 
[231] Clova 화자인식
[231] Clova 화자인식[231] Clova 화자인식
[231] Clova 화자인식NAVER D2
 
[232]TensorRT를 활용한 딥러닝 Inference 최적화
[232]TensorRT를 활용한 딥러닝 Inference 최적화[232]TensorRT를 활용한 딥러닝 Inference 최적화
[232]TensorRT를 활용한 딥러닝 Inference 최적화NAVER D2
 
[222]누구나 만드는 내 목소리 합성기 (부제: 그게 정말 되나요?)
[222]누구나 만드는 내 목소리 합성기 (부제: 그게 정말 되나요?)[222]누구나 만드는 내 목소리 합성기 (부제: 그게 정말 되나요?)
[222]누구나 만드는 내 목소리 합성기 (부제: 그게 정말 되나요?)NAVER D2
 
Old Version: [211] 인공지능이 인공지능 챗봇을 만든다
Old Version: [211] 인공지능이 인공지능 챗봇을 만든다Old Version: [211] 인공지능이 인공지능 챗봇을 만든다
Old Version: [211] 인공지능이 인공지능 챗봇을 만든다NAVER D2
 
[241] AI 칩 개발에 사용되는 엔지니어링
[241] AI 칩 개발에 사용되는 엔지니어링[241] AI 칩 개발에 사용되는 엔지니어링
[241] AI 칩 개발에 사용되는 엔지니어링NAVER D2
 
[246]QANet: Towards Efficient and Human-Level Reading Comprehension on SQuAD
[246]QANet: Towards Efficient and Human-Level Reading Comprehension on SQuAD[246]QANet: Towards Efficient and Human-Level Reading Comprehension on SQuAD
[246]QANet: Towards Efficient and Human-Level Reading Comprehension on SQuADNAVER D2
 

Más de NAVER D2 (20)

[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 
[231] Clova 화자인식
[231] Clova 화자인식[231] Clova 화자인식
[231] Clova 화자인식
 
[232]TensorRT를 활용한 딥러닝 Inference 최적화
[232]TensorRT를 활용한 딥러닝 Inference 최적화[232]TensorRT를 활용한 딥러닝 Inference 최적화
[232]TensorRT를 활용한 딥러닝 Inference 최적화
 
[222]누구나 만드는 내 목소리 합성기 (부제: 그게 정말 되나요?)
[222]누구나 만드는 내 목소리 합성기 (부제: 그게 정말 되나요?)[222]누구나 만드는 내 목소리 합성기 (부제: 그게 정말 되나요?)
[222]누구나 만드는 내 목소리 합성기 (부제: 그게 정말 되나요?)
 
Old Version: [211] 인공지능이 인공지능 챗봇을 만든다
Old Version: [211] 인공지능이 인공지능 챗봇을 만든다Old Version: [211] 인공지능이 인공지능 챗봇을 만든다
Old Version: [211] 인공지능이 인공지능 챗봇을 만든다
 
[241] AI 칩 개발에 사용되는 엔지니어링
[241] AI 칩 개발에 사용되는 엔지니어링[241] AI 칩 개발에 사용되는 엔지니어링
[241] AI 칩 개발에 사용되는 엔지니어링
 
[246]QANet: Towards Efficient and Human-Level Reading Comprehension on SQuAD
[246]QANet: Towards Efficient and Human-Level Reading Comprehension on SQuAD[246]QANet: Towards Efficient and Human-Level Reading Comprehension on SQuAD
[246]QANet: Towards Efficient and Human-Level Reading Comprehension on SQuAD
 

A4 thread blockingisevil