소켓 IO
MS의 IOCP 에 대해 관심이 많아서.. 자료를.. 읽다. 나름대로
생각을 정리해 봅니다.
흔히. 리눅스 서버에서 많이 쓰이는 non_block socket일 경우
해당 소켓을 read 할때 읽을 게 없다면 리턴하여 해당 프로세스가
다른 작업을 할 수 있게끔 하고.. 보통 해당 소켓을 loop로 감싸서
buf에 읽을 게 있는지 없는지 프로세스가. 주기적으로 체크를 합니다.
IOCP의 경우... 는 nonblock과 비슷 하지만....
해당 프로세스가.. loop로 감싸서 즉 주체가 되서 계속 buf에 읽을게
있나 물어보지 않고 IO 처리를 커널에 넘겨.. 버립니다. 그리고 읽을게 있을
땐 유닉스의 signal 같은.. event를 보내.. 읽을게 있으니 읽어라..
라고.. 보내줍니다.
해서.. 장점은.. 프로세스가.. loop를 돌며 물어보는.. 처리를 .. 안해도
되닌.. 성능의 장점이 있다 .. 라고 이해 했습니다.
유닉스의.. IO 모델로.. epoll도 있지만... 그것도...loop를 돌며 socket을
검사 합니다. 다중 소켓을 검사할때.. 검사하는 방법은 기존 select, poll 보다
효율적인. 검사로.. 빠른 성능을 내지만.. 이것또한.. 프로세스가.. non_block
일 경우.. loop를 돌며 계속 .. 검사해야 합니다.......
그럼.. 실제로.. IO 모델에 있어.. 소프트 웨어 적인 부분만 따진다면.. IOCP가
많이 좋은 걸까요?
^^
제가 알기로는 IOCP는 I/O Multiplexing 뿐만 아니라 (MS에서는 Overlapped I/O 라고 하는것 같아요~)
Thread Scheduling 까지 관여하는것으로 알고 있습니다.
즉, 요청되는 I/O의 양에 따라 실제로 동작하는 쓰레드를 유동적으로 관리합니다.
또한 Locality를 최대한 높이기 위한 부분도 있구요.
epoll의 경우에는 I/O Multiplexing 만을 하는것으로 알고 있습니다.
또한 Blocking Mode 아닌가요?^^ (잘몰라서..)
IOCP는 매우 안정적이고 일반적으로 성능이 좋은것으로 알려져 있죠.
주로 게임서버에서 많이 채택한다고 합니다.
제가 아는게 별로 없어서...
아는부분만 답변해보았습니다 :oops:
-----------
청하가 제안하는 소프트웨어 엔지니어로써 재미있게 사는 법
http://sozu.tistory.com
질문 하신분이 좀 오해를 하신게 아닌가 싶네요IOCP는 논블럭이
질문 하신분이 좀 오해를 하신게 아닌가 싶네요
IOCP는 논블럭이 아니라 비동기 처리입니다
논블럭과 좀 개념이 다른것으로 --;
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
예.. 맞습니다.. IOCP 는 비동기 입출력이죠....유
예.. 맞습니다..
IOCP 는 비동기 입출력이죠....
유닉스.. 에선.. aio_XX 가.. 비동기 입출력인데..
실제 많이 사용안하는 걸로 알고 있습니다.
대부분.. 그냥 논블럭으로. 처리를.. 하죠....
해서.. MS는.. 이미.. 검증된 비동기 입출력 IOCP를
이미 많은 게임 서버가. 사용하고 있습니다.
유닉스. 계열은. 아닌거 같구요.. 비동기는 아니지만.
epoll 이나. kqueue 로.. 성능을 업시키는거 같지만..
- - .. 전. 이렇게 이해하고 있습니다.. - -;;;;
“바람에게도 길은 있다. 나는 비로소 나의 길을 가느니. 길은 언제나 어디에나 있다.”
socket programming 이라면,edge-triggered
socket programming 이라면,
edge-triggered change notification + nonblocking I/O를 사용해서
처리할 경우와 잘 구성된 async io는 크게 성능 차이가 없을 것 같습니다.
iocp 의 어떤점이 epoll + nonblock 보다 성능상 나아 보이는지는 잘 모르겠지만,
제가 보기에는 거의 비슷한 구조 같습니다. (iocp는 잘 모르지만 비록 async io 인점만 제외한다면 말이지요.)
iocp 와 같은 형태를 원하신다면, RTS + thread 정도로 가능할 것 같습니다.
그리고 linux 의 경우 aio_read, aio_write는 현재 glibc에 구현되어 있고(있으나..?),
거의 사용되지 않고 있습니다. 이는 단순히 다른 thread에서 io를 처리하는 방식일 뿐입니다.
물론 kernel side에서 aio의 지원이 가장 좋습니다.
현재 linux 2.6에서 aio가 지원되고 있으며, 이는 local file에 한합니다. socket의 경우도 지원 예정이더군요.
그러나 제 생각에는 epoll + nonblock 보다 성능이 더 나아지지는 않을 것 같습니다.
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
EPOLL 이나 IOCP 모두 원리는 같다고 생각합니다.
둘다 비동기에다 버퍼를 커널모드에 등록하고(이 부분은 정확한지는 모르겠지만
일단 등록한 버퍼에다 바로 쓰지요.)
둘다 WORK THREAD모델을 써야 될듯 합니다.
지금 저도 IOCP모델은 만들어 봤고 EPOLL 모델을 만들고 있는데 EPOLL
도 시퀀스로 짜면 처리 하기 힘듭니다. ACCEPT 모듈과 클라이언트 와의
통신 모듈을 따로 처리 해야 될듯 합니다. IOCP처럼 EPOLL도 대기 모두가
있기 때문입니다. 물론 타임을 정해 줄수 있지만 효율적인 처리를 하기 위해서
서는 멀티 쓰래드 모델로 가야 된다고 생각합니다.
그리고 EPOLL은 SELECT 와 전혀 틀립니다. SELECT는 어떤 SOCKET 에서
발생했는지 알수가 없습니다. 하지만 EPOLL은 등록할 버퍼에 소켓 디스크립터
를 같이 멤버로 가지고 있기 때문에 알수가 있는것이고 FOR 문을 도는 것은
감지할 때 그만큼의 감지 일어난 갯수를 리턴해야 되기 때문에 당연히 처리
해줘야 되는 부분이라고 생각합니다. IOCP는 쓰래드 관리를 맡아서 해주니까
편한 점은 있죠. EPOLL은 저희가 구현 해야 될듯 하구요...
답변에서 틀린 점이 있으시면 가차 없이 태클 걸어주시기 바랍니다.
^___^;
^____^; 방가여
[quote]이것또한.. 프로세스가.. non_block 일 경우
non_block이 recv부분을 이야기 하시는건지?
그렇다면 제가 볼때 epoll이나 select가 포함될때는 별 의미가 없습니다.
어딘가 약간의 안좋은점을 내포하고 있다는 의미 같아서
그 의미가 궁금하네요 ^^;
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
[quote]IOCP처럼 EPOLL도 대기 모두가 있기 때문입니다
multiprocessor가 아닌 경우라면, 위의 경우에서 multithread model
그다지 효율적이지 않을 것 같습니다.
특히나 HTTP server와 같은 경우라면 acceptor 와 통신 부분을 따로 떼서
처리할 경우 extra context-switching을 유발하게 되어 성능상 제약을
주게 될 것 같습니다.
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
[quote]non_block이 recv부분을 이야기 하시는건지? 그
epoll 등의 readiness notification 사용하실 경우 nonblock을 사용하는
것은 의미가 있습니다.
실제로 kernel에서 notify가 오더라도 그 fd가 아직 readable 하지 않을 수도 있습니다.
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
[quote][quote][quote]인용: 이것또한.. 프로세스가.
무슨관계가 있다는건지 궁금하군요 :)
그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.
[quote]무슨관계가 있다는건지 궁금하군요 [/quote]ㅋㅋ
ㅋㅋ 저도 쓰고 나서.. 이 말슴이 아닐 수도 있겠구나 라고 생각했습니다.
단순히 그 상황에서, nonblock 이 의미가 없음을 말씀하시는 거라고 생각했었습니다. 죄송합니다.
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
음...
위에 분들 말씀처럼
non_blocking I/O
IO_multiplexing
signal-driven I/O
asynchronous I/O
모두 다릅니다. 특히 신호에 의한 입출력과 비동기와 비슷하면서도
다르죠. 입출력 동작의 시작과 완료시점에 대한 차이점으로 구분하는
걸로 알고 있습니다.
H/W가 컴퓨터의 심장이라면 S/W는 컴퓨터의 영혼이다!
제가 생각하기에는 pthread는 유저 쓰래드 입니다.
만약 pthread가 커널 쓰래드 라면 님 말씀대로 성능 향상이 적겠지만
pthread는 유저 쓰래드 입니다. 라이브러리가 스케줄링을 관리하죠.
그렇기 때문에 one cpu 라도 성능 향상이 된다고 생각합니다.
쓰래드 수가 너무 많으면 님 말씀대로 context switch 때문에 오히려 부하가
커질것이라는 것은 동감합니다. 하지만 cpu의 쓰래드 갯수 공식을 따르면
성능은 나아질 것이라 생각합니다.
그리고 accept가 넌블럭킹으로 처리하고 epoll도 타임아웃 처리를 하여
시퀀스로 돌릴수도 있지만 accept를 넌블럭킹으로 처리할려면 select나
시그널을 사용해야 합니다. 이 부하가 개인적으로 context switch 부하보다는
적다라고 생각됩니다.
^____^; 방가여
[quote]만약 pthread가 커널 쓰래드 라면 님 말씀대로 성능 향
user thread가 library scheduler를 갖는다는 보장이 있습니까?
posix thread 에 scheduler implementation의 정의가 있나요?
실제로 앞으로 linux thread를 dominant 할 것으로 생각되는(최소한 제 생각으로는),
NTPL 의 경우도 초기 initial draft에서는 M-N을 언급했었지만,
최종 design은 1-1 을 선택하고 있습니다.
그리고 이는 꽤 괜찮은 성능을보여주는 것도 사실입니다.
(물론 kernel의 성능향상도 포함됩니다. O(1) scheduler 같은 경우..)
그렇다고 하더라도 "제가 예로 든" 요청이 잦은 HTTP 서버 같은 경우라면,
extra context switching은 좋지 않다고 봅니다.
하나의 request에 대해 context switching이 없이 처리하는 것이 훨씬
나은 선택이라고 봅니다.
listener socket을 epoll에 넣으면 어떨까요?
간단한 논쟁이긴 하지만, 제 생각에는 single processor의 성능을
잘 발휘할 수 있는 것은 multi-thread가 아니라, async action을 잘 처리하는
single thread라고 봅니다. 이는 multi processor에도 마찬가지라고 봅니다.
processor 갯수 정도 만큼의 async action을 잘 처리하는 thread 가 서버에
적합하다고 생각합니다. 논란의 여지는 많겠지요 =)
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
Re: 제가 생각하기에는 pthread는 유저 쓰래드 입니다.
pthread는 쓰레드에 관한 인터페이스 일뿐, pthread가 커널 쓰레드인지 유저 쓰레드인지 보장해 주지 않습니다
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
오버헤드 구간이 다른건데...
어차피 어떤 형식을 쓰더라도 epoll이든 IOCP이든간에
서버모델에서 이들이 차지하는 오버헤드는 극히 작습니다.
또한 한 서버의 한 프로세스에서 일반적으로 몇천이상의 접속을 가져가는 것보다 프로세스를 쪼개는 것이 더 좋습니다.
따라서 어느것이 더 많은 오버헤드가 있다 없다라고 하는 것은 좀 논의 밖이 아닐까 생각됩니다. 사실 epoll정도 되면 속도면에서 그다지 손해보는 것은 거의 없습니다.
일반적으로 서버모델에서는 윗에 어떤 분도 말씀했듯이 접속을 받는 부분, accept 를 처리하는 부분, 실제 socket buffer 로부터 데이터를 읽어서 처리하는 부분을 보통 따로 떼어내어 멀티 쓰레드로 돌림으로서 지연을 최대한 줄이고, 데이터트랜잭션 처리구간을 조금이라도 빠르게 하는게 더 중요한게 됩니다. select네 poll이네 epoll, kqueue 냐? 혹은 MS의 IOCP 냐? 하면서 성능비교하는 것은 흥미위주일뿐 사실상 그게 주가 되지는 않습니다.
========================================
* The truth will set you free.
[quote]일반적으로 서버모델에서는 윗에 어떤 분도 말씀했듯이 접속을
적어도 select는 아닙니다. high request handling에는 적합하지 않습니다.
다른 것들의 성능 비교는 사실 큰 의미는 없다고 봅니다. 특히나 epoll 과 kqueue, iocp, rts 등은 말이죠.
Jeff Darcy의 high-performance server design에 대한 글에서의 인용입니다.
원문입니다. http://pl.atyp.us/content/tech/servers.html
I thought what I'd do was,
I'd pretend I was one of those deaf-mutes.. or should I?
댓글 달기