[Netty] select, poll, epoll

** 네트워크 IO는 본질적으로 파일디스크립터(FD)에 대한 작업.

1. select
특징으로는

  • 등록된 file descriptor를 하나하나 체크를 해야하고 커널과 유저 공간 사이에 여러번의 데이터 복사가 있음.
  • 관리 file descriptor 수에 제한이 있음.
  • 사용 쉽고 지원 OS가 많아 이식성 좋음.

file descriptor를 하나 하나에 체크하기 때문에 O(n)의 계산량이 필요합니다. 따라서 관리하는 file descriptor의 수가 증가하면 성능이 떨어진다.
또한 관리 수가 한정되어 있기 때문에 그 수를 초과하면 사용할 수 없다.

 

사용자가 selector.selectedKeys ()를 호출하면 운영 체제는 모든 소켓을 검색하여 시스템 커널에서 사용자의 메모리로 복사합니다. 연결 수가 증가하면 순회 및 복제 시간이 선형 적으로 증가하고 메모리 소비가 증가합니다.

Java NIO selector

 

스크린샷 2018-11-09 오후 10.52.52.png

 

 

Selector라는 클래스가 가지고 있는 Key에 대한 I/O 이벤트를 감시하고 있으며, Accept, Read, Write, Connection Closed 와 같은 이벤트를 감시해서 non-blocking하게 동작한다.

 

스크린샷 2018-11-05 오후 10.23.24

위 예제처럼 Selector를 open하고 ServerSocket을 configureBlocking(false)로 주게 되면 non-blocking하게 동작하게 된다.
while(true) 안에서는 selector.select(); 가 호출되고 있는데, 이 부분에서 이벤트가 발생한 채널의 Event가 잡히게 되고
selectedKeys()로 이벤트가 발생한 key들의 리스트를 받아올 수 있다.
key에서는 Socket 클래스를 얻을 수 있으며 이를 통해서 I/O를 처리하면 된다.
위 구조로 변경을 하게 되면 over-head는 많이 줄게되나, CPU를 효율적으로 사용할 순 없다.
왜냐면 non-blocking으로 동작하게 되므로 하나의 Thread에서 Network I/O 및 소켓관리를 다 해야 하기 때문이다.
CPU 코어수가 늘어날 수록 위와같은 구조는 비효율을 보일 수 있다.

 

 

2. poll
poll은 거의 select와 동일하지만 다음과 같은 차이가 있다.

  • 관리 file descriptor 무제한.
  • 좀더 low level의 처리로 system call의 호출이 select보다 적음. 이식성 나쁨.
  • 접속수가 늘어나면 오히려 fd당 체크 마스크의 크기가 select는 3bit인데 비해, poll은 64bit정도이므로 양이 많아지면 성능이 select보다 떨어짐.

3. epoll
linux커널 2.6.x이상 버전에만 지원되고 특징은 다음과 같다.

  • 관리 fd의 수는 무제한.
  • select, poll과 달리, fd의 상태가 kernel 에서 관리하므로 상태가 바뀐것만을 직접 통지 , fd_set 복사가 필요없음.
  • 일일이 fd 세트를 kernel 에 보낼 필요가 없음.
  • kernel이 fd를 관리하고 있기 때문에 커널과 유저스페이스 간의 통신 오버헤드가 대폭 줄어듬.

epoll 모드는 활성 부분만을 염두에두고 순회 및 복사 작업을 줄입니다.

Netty 프로그래밍에서 select를 epoll로 전환하는 것이 편리합니다.

코드에서 수정할 수있는 장소는 두 곳입니다. NioEventLoopGroup이 EpollEventLoopGroup으로 바뀝니다. NioServerSocketChannel이 EpollServerSocketChannel로 바뀝니다.

 

 

 

 

** 출처 **

1. socket, file descripter

http://luckyyowu.tistory.com/71

http://dev-ahn.tistory.com/96

2. linux epoll

PPT참고

epoll%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%9C%20%EB%B9%84%EB%8F%99%EA%B8%B0%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D.pdf에 액세스하려면 클릭하세요.

 

3.개념

https://blog.rapid7.com/2016/07/27/what-exactly-is-an-event-loop/

springboot_eventloop

1. select , epoll 차이

http://ozt88.tistory.com/21

http://gompangs.tistory.com/105

http://ozt88.tistory.com/21?category=123069

 

댓글 남기기