파일 다운로드 서버 구현시...
글쓴이: mg2000 / 작성시간: 목, 2010/02/18 - 9:40오전
안녕하세요.
제가 요즘 소켓쪽으로 이것 저것 해보는중인데요.
그냥 작은 데이터를 주고 받을때는, 필요한 데이터만 주고 받고 나서 연결을 끊어버리면, 서버에 사용자가 수백명이 몰려도 그럭저럭 쓰레드를 10개 정도 띄워놔도 딱히 별 문제가 없었는데요.
문제는 파일을 주고 받으려니, 클라이언트당 1~2초씩 걸려버리게되면, 10명만 몰려도 쓰레드를 10개 다 쓰고 있어서, 다른 사용자 작업을 처리 못해주게 되네요.
무턱대고 쓰레드를 클라이언트 수만큼 늘리는 것도 좋은 방법은 아닌것 같고...
이런 상황을 대처할만한 요령(?) 같은게 있을까요?
Forums:
스레드는 가급적
스레드는 가급적 적게 만드시고 한 스레드에서 여러 사용자의 입출력을 처리 하도록 구성하시면 됩니다.
물론 소켓은 비동기모드로 작동 시켜야합니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
그렇다 한다면...
파일을 한번에 다 보내주지말고, 사용자 별로 돌아가면서, 쪼개서 보내줘야 하는걸까요?
epoll 이 답안이 될듯
epoll 이 답안이 될듯 합니다.
emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇 개 안돼요~
http://xenosi.de/
https://xenosi.de/
epoll이 좋다는 얘기는 들었습니다만...
제가 리눅스뿐만 아니라 다른 유닉스에서도 개발해야하는지라... ㅠ.ㅠ
epoll을 쓰더라도 클라이언트에게 작업을 나눠주는건 직접 구현해야 하는 것 아닌가요?
libevent같은 거 쓰시면
libevent같은 거 쓰시면 되긴하는데, "다른" 유닉스가 어떤 애들이냐에 따라서 성능차이는 심하게 날 수 있습니다. 쓰레드 scalability도 제대로 된 async도 없는 경우면 힘듭니다. 플랫폼 영향없이 어느정도 scalable하려면 프로세스 여러개 만든후 fd들을 여러 뭉치로 나눠서 select로 보면 되는데 이것도 그래봤자라서 애초에 타겟 플랫폼을 정하고 어떤 기능이 있는지 알아보고 시작하시는 게 좋습니다.
근데 어느 정도 성능이 필요한건가요? 어지간하면 그냥 단순하게 만들어도 별 문제는 없을겁니다.
HP-UX에서 만들 생각인데요.
AIX나 솔라리스 포팅도 염두해 둬야 하고...
수백명 정도는 동시에 다운로드(또는 업로드) 가능하게 만들어야 해서 고민이네요...
일단은 단순하게 만들어서 테스트를 좀 해봐야 할듯..
수백명 정도면
수백명 정도면 concurrency가 문제가 될 일은 없고 그냥 프로세스를 수백개를 만들어서 해도 됩니다. IO 병목이 주요 문제일 거 같은데 이런 경우에 async로 만들면 오에스 별로 aio 지원 범위나 방법이 다른 경우가 많기때문에 굉장히 골치 아플 수 있습니다. 데이터셋 크기와 기대 대역폭에 따라 다르겠지만 시피유가 사용량이 문제가 될 이유는 없을 것 같습니다.
이거 예전엔
이거 예전엔 그랬는데 요즘엔 꼭 그렇진 않습니다. epoll로 async로 하나 클라이언트마다 쓰레드 하나씩 붙이나 성능 차이 사실상 없습니다. 유일하게 문제가 될 수 있는 부분이 스택의 어드레스스페이스와 메모리 사용량인데, 이것도 왠만한 경우에 크게 문제가 될 정도는 아니고, 극단적인 경우에도 조금 조심해서 코딩하고 파라미터 맞춰주면 괜찮습니다. 아이들 세션들이 많으면 걔네들 모니터링하는데는 epoll 쓰는 게 좋겠지만 적어도 리눅스에서 성능상의 이유로 일반적으로 쓰레드를 가급적 적게 만들 이윤 없습니다.
댓글 달기