dhaldo2002
89
2020-12-06 23:49:34 작성 2020-12-06 23:54:15 수정됨
1
115

Netty 이벤트 이벤트 루프 작업중 ContextSwtich 관련하여 질문 올립니다.


안녕하세요 네티 책을 보다 궁금하여 질문을 남기게 되었습니다.

책을 보다보니 네티는 주어진 자원으로 최적의 효과를 내게 고성능 서버 프레임 워크라는걸 봤습니다.

책을 보다 궁금한것이 생겨 글을 남깁니다.

네티는 멀티 쓰레드 방식이 아니라 ContextSwtich적다는 이야기를 들은거 같은데..

왜 적은지에 대해 제가 이해한게 맞는 부분인지 체크를 부탁 드리겠습니다.


전제는
1. BossEventGroup(1) WorkerEventGroup(1) 가정 한다.

2. 데이터 베이스 작업은 3초 정도 걸린다.

3. 요청은 두개의 채널만 있고  각 채널이름은 ChannelOne ChannelTwo만 있다는 가정

4. 두채널 모두 같은 서비스 로직을 작업한다

쓰레드는 bossGroup,WorkerEventGroup 2개만 사용한다 했을때입니다.

아래는 시나리오 입니다.

1. Channel(Socket)들은 클라이언트들의 개별 요청이 들어온다.

    ChannelOne ChannelTwo 두개 요청이 온다. 

2.첫번째 ChannelOne은 WorkerEventGroup에서 받은 WorkerEventLoop에서 비지니스 로직을 작업 한다.

3. ChannelOne은 WorkerEventLoop에서 작업을 하다가 데이터 베이스 요청 관련 작업을 하게 되면  데이터 베이스요청을 보낸다.

4. ChannelOne 작업은 데이이터 베이스 데이터 요청을 보내고 그 작업은 IO 작업이기 때문에 CPU를 사용하지 않기 때문에 CPU를 사용 하지 않는다.

5. 사용하지 않는 CPU는 다른 Channel(ChannelTwo)에서 들어온 이벤트 곧 이벤트 큐에 적재 되어 있는 이벤트를 처리한다.

6. ChannelTwo는 데이터 베이스 요청 작업을 보내고 그리고 ChannelOne 데이터베이스 작업이 완료되어

데이터를 받는다.

7. WorkerEventLoop는 ChannelTwo 데이터를 받는동안 ChannelOne에 들어온 나머지 작업후 응답을 보내고 나머지 ChannelTwo에도 나머지 작업후 응답을 보낸다.

위와 같은 시나리오 때문에 네티가 ContextSwitching 비용이 적은게 맞을까요??

 부탁드리겠습니다. 감사합니다.. 



0
  • 답변 1

  • esrse
    1k
    2020-12-07 01:45:10 작성 2020-12-07 01:46:50 수정됨

    네. 여러개의 IO를 동시에 처리해야되는 상황을 예를 들어서 설명을 하셨는데요, 그런 상황에서 asynchronous 한 태스크를 병행으로 처리하는 것이 context switching을 줄이고 컴퓨팅 자원을 효율적으로 사용하는 방법입니다.

    컨텍스트 스위칭이란 운영체제 개념이고요, 여러개의 프로세스 또는 쓰레드들이 번갈아가면서 CPU를 사용할 수 있게, 컨텍스트를 바꿔주는 개념입니다. 여기서 컨텍스트란, 기본적으로 CPU에 내장돼 있는 register를 뜻합니다. 1개 코어에는 프로세스 또는 쓰레드가, 동시에 하나만 동작할 수 있습니다. 그리고 그것들은 register에 의존을 해서 동작을 합니다. 그것들이 CPU timeslice를 다 써버리면, 운영체제는 이제 다른 프로세스/쓰레드가 CPU를 사용할 수 있도록 해줘야 하는데, 그러기 위해서는 일단 방금 timeslice를 다 써버린 프로세스/쓰레드가 사용하던 레지스터를 어딘가에 저장을 시켜두고, 다른 프로세스/쓰레드가 사용했던 레지스터값을 불러와서 실제 CPU의 register에 로드시키고 그 프로세스/쓰레드한테 제어권을 넘기는 거죠.

    만약에 하나의 프로세스/쓰레드가 synchronous IO를 처리하도록 설계돼있다면, 여러개의 IO를 동시에 하기 위해서는 멀티프로세스/멀티쓰레드 전략을 취해야 합니다. (IO multiplexing 방법도 있지만, 설명을 간략히 하기 위해 이건 일단 논외로..)

    만약 1000개의 네트워크 연결을 동시에 처리해야된다면 1000개의 프로세스/쓰레드가 필요한 거죠. 이런경우 운영체제는 계속 프로세스/쓰레드를 교체해줘야 합니다. 이 작업은 공짜가 아니며, 매우 짧은 시간이긴 하지만, 시간을 소모합니다. 그러나 IO가 매우 빈번하다면 그 횟수가 엄청나게 많아져서, 결국에 사람이 체감할 정도로 길어지는 문제가 있습니다.

    asynchronous IO를 활용한다면, 프로세스 또는 쓰레드를 시스템에 CPU 코어개수만큼 구동시킵니다. 그리고 한 프로세스/쓰레드에서 여러개의 비동기 IO를 처리하죠. 여러개의 IO를 처리하는 일은 프로세스/쓰레드 안에 있는 event loop 스케줄러에서 담당하게 됩니다. 즉 운영체제 레벨에서 컨텍스트 스위칭이 불필요하게 된 것이죠. 컨텍스트 스위칭 비용을 절약할 수 있으므로, 효율적이며, 동시에 처리해야되는 IO 개수가 많을수록 그 효과는 커집니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.