unix 계열에서는 쓰레드 위주의 설계가 잘못된 것일까요?
물론 사용하는 OS, cpu type등등 시스템 환경과 프로젝트 요구정의에 따라 다양한 구현방법들이 있겠지만 저의 경우를 예로 들어서 말씀을 드리겠습니다.
저는 주로 windows 에서 프로그래밍을 했습니다. 그래서 멀티 쓰레드식의 프로그래밍에 익숙해있었습니다. 특히 이번에는 웹서버 처럼 무수히 많은 외부 커넥션을 처리하는 서비스를 제작했는데 역시 멀티 쓰레드방식으로 구현해서 만들었습니다. (미리 쓰레드풀을 만들고(200개-400개) 소켓커넥션해서 처리하는 방식, 로그도 각 쓰레드 마다 많이 남길정도로 i/o 사용 활발합니다.)역시나 퍼포먼스에서 기대한만큼 결과가 나왔습니다. (클라이언트역시 제가 만들었습니다.)
그러나 이것을 sparc solaris 에서도 런칭해야 하는 이유로 똑같은 방식으로 설계를 가져갔습니다. 헌데 성능차이가 기대이하더군요... 200만원도 안하는 컴퓨터에서의 성능이 1000만원 넘는 sparc (그것도 2cpu 인데)에서는 전혀 아니더군요...
그래서 혹시나 cpu 때문이 아닐까 의심이 들어서 x86 solaris 를 부랴부랴 설치하고 실행해봤으나 결과는 더 안좋았습니다.
solaris 에서는 제가 만든 데몬이 쓰레드를 많이 사용해서 그런지(locking 도 많이 합니다.) kernel 자원을 90%이상 차지합니다.
저의 설계방식이 잘못됬다고 판단하고 있습니다. 과연 다량 소켓커넥션 서버는 멀티쓰레드를 지향하면 안되는 건가요? 그렇다면 다른 방법은 무엇이 있을까요? 10k problem 를 주제로 검색도 많이 해보았으나 내공이 적은 저에겐 너무 추상적이구요 실제적으로 예를 들어서 얘기를 해주셨으면 합니다.
혹시 라이브러리의 문제는 아닌가요?저도 잘 모르는 주제인데 함부로
혹시 라이브러리의 문제는 아닌가요?
저도 잘 모르는 주제인데 함부로 답글을 단 건 아닌지 걱정되네요. :-)
죄송...
quid pro quo
잘모르긴하지만 unix 계열에선 select , kqueue , poll
잘모르긴하지만 unix 계열에선 select , kqueue , poll , epoll 계열을 쓰는걸로 알고 있습니다..
( 머냐고 물으신다면 검색을 해보시라고 밖에는 -_- )
------------------------------------------------------------------------------------------------
Life is in 다즐링
Windows계열이었다면 IOCP쓰는 게 정답인데 그냥 1소켓당 1쓰레드
Windows계열이었다면 IOCP쓰는 게 정답인데 그냥 1소켓당 1쓰레드로 하셨나보군요.
쓰레드갯수가 많아지면 Context Switch 등의 오버헤드가 커지므로 좋지 않습니다.
결국 asynchronous로 가야하구요.. POSIX의 aio나 각 유닉스별 전용 I/O들을 찾아보시기 바랍니다.
[quote="skjk"]Windows계열이었다면 IOCP쓰는 게 정답인
물론 맞습니다만 한가지 source 를 가지고 unix 계열과 windows 플래폼에서 런칭해야 했기에 플래폼 의존적인 방식은 가급적 피하다보니 그렇게 되었습니다. 저도 IOCP 를 생각 안한것은 아니거든요
저도 질문하신 분과 비슷한 것 만든적 있고, 비슷한 고민도 많이 해 봤습
저도 질문하신 분과 비슷한 것 만든적 있고, 비슷한 고민도 많이 해 봤습니다.
아마, 질문하신 분도 나름대로 생각을 가진채 다른 분들의 의견을 듣고 싶어서
그랬지 않나 싶습니다.
최소한 linux에서는 제대로 돌아갔다면, 로직 자체가 잘못되지는 않는 것 같습니다.
특정 함수의 동작이나 성능이 리눅스랑 달라서 그렇지 않을까 생각되는데요..
필요없다고 생각되는 부분은 제거하고 테스트 해 보는 것이 어떨까요? 처음에는
로그 부분.. 그 다음에는 lock 하는 부분.. 반드시 lock해야 하는 부분도 있지만,
dual cpu 아니면 lock 안해도 그럭저럭 돌아가는 경우도 많더군요.
제가 만들었던 놈은 io 처리가 주 임무인 프록시 비슷한 놈 이었습니다. 여러 os를
염두에 두어서 one client-one thread 방식이었고, 쓰레드 풀 도 없이 그냥 구
현 했습니다. 테스트 해 보니까 쓰레드 수백개 생겨도 원하는 성능은 나왔습니
다. 워낙 열악한 환경이 어서 정확한 테스트는 아니었지만요..
실전에서도 web server, db server가 동시에 돌아가는 상황에서 쓰레드가
100여개 정도 생겨도 별 문제 없었습니다. cpu가 제온 두개이고, web과 db가
그다지 많이 부하를 받는 상황은 아니었지만요.. 참, os는 w2k server입니다.
서버 프로그램이라면 최소의 자원으로도 잘 돌아가게 만드는 것이 중요하기는
한데.. 요즘 서버가 워낙 빵빵한 것도 많이 나와서.. ^^; 쓰레드 방식으로
할때 context switch에 대한 부담 보다는, 쓰레드로 인한 자원의 한계 때문이
다른 방식으로 눈이 가더군요..
문제의 원인이 저도 무척이나 궁금합니다!! :o