소켓 쓰레드 프로그램의 한계는???
글쓴이: antz / 작성시간: 수, 2004/02/25 - 2:24오후
안녕하세요.
데이터 건수는 2500만건 정도 되는 검색엔진이 있습니다.
응답시간이 index건수에 따라 달라지기는 하나,
많이 걸리면 3초정도 까지 걸립니다.
(참고로 3초가 걸리는 이유는 파일 입출력이 많아서 입니다.)
데이터 원활한 처리를 위해서 pthread pool을 사용했습니다.
저도 쓰레드에대한 정확한 지식이 없어서 답변을 확실히 하지 못했는데요.
쓰레드 pool의 thread 개수를 늘린다고 해도,
서버가 장비의 한계 때문에 요청에 대한 답변을 모두하지 못할겁니다.
예를 들어서 3초 걸리는 요청을 초당 10개씩 60초간 보낸다고 하면,
Quote:
(60X3) < (600개 요청 처리시간) < (10X60X3)
일것 같습니다.
이게 맞나요?
이문제에 대해서 요청을 초당 10개를 보내도 10개의 쓰레드가 있으면,
3초 정도 밖에 안걸린 거라고 말하고 있는데 이것에 대해서는 어떻게 생각
하나요?
제생각으로는 쓰레드가 일을 잘한다고 해도,
초당 10개를 보내면 15초 이상 걸릴것 같습니다. (3초 X 10개)
능력에 비해 많은 요청이 서버에 들어가면, Queue에 요청을
쌓아놓고, 일이 없을때 Queue를 처리 하는 방법을 생각해 보았습니다.
(요청을 무한으로 기다리는것이 아니기에 10초이상 사용자가 기다려주질 않을것 입니다.)
검색엔진의 성능을 얘기할때 한계가 있을것인데...
막무가내로 thread-pool의 개수를 늘리면 성능이 좋아진다고
얘기하는 사람에게 한계를 깨우쳐줄 좋은 조언을 듣고 싶습니다.
감사합니다.
Forums:
예전에도 한번 이 내용에 대해 나왔던것 같은데요..아뭏튼간에, 책
예전에도 한번 이 내용에 대해 나왔던것 같은데요..
아뭏튼간에, 책에서 본 내용을 인용해 봅니다.
쓰레드 장점중에 나온 내용인데요..
게시판을 뒤지면 쓰레드에 관해 토론한 내용들이 꽤 많습니다. 참조하세요..
이미 답변을 알고 계신거 같은데요...
본문 내용을 보면
종류 불문하고 3초면 기가시대에 엄청나게 느린겁니다. 대기 시간인 3초동안에 씨피유는 일을 하고 싶어도 할 일이 없는 상태일텐데, 여기다가 쓰레드를 더 추가해서 씨피유 파워를 더 뽑아낸다고 해도 성능이 좋아질 것 같지는 않네요.
일단 가장 중요한건 정말 병목지점이 파일입출력인가를 파악하는겁니다. 플랫폼이 뭔지 모르겠지만 VTune같은 툴을 이용해서 병목 지점을 정확히 파악을 하세요. 그리고 나서 방법을 찾아야 겠죠.
병목지점이 파일입출력이라면 쓰레드로는 해결이 불가능합니다. 더나은 디비나 파일구조, 적절한 캐쉬, 보다 나은 인덱싱방법등을 도입해야겠죠.
쓰레드 수가 많다고 더 많은 일을 할수 있는건 아닙니다. 최고의 효율은 processor 하나에 하나의 쓰레드가 블럭없이 100% 작동하는겁니다.
ps. 2500만건에 3초면 응답이 너무 긴것 아닌가요.. -_-;;
산넘어 산
답변감사드립니다. :D [quote="dudungsil"]ps.
답변감사드립니다. :D
맞는 말씀입니다.
혹시 VTune 과같이 비슷한 기능을하는 공개 툴 혹시 있을까요?
이쪽 일을 한지 이제 7개월정도 되었는데요.
처음 해보는걸 혼자하려니 힘든게 사실입니다.
3초 걸리는걸 잡아야하긴 하겠는데... 설계부터 다시해야할것 같구요.
테스트도 어떻게 하는게 정석인지 잘모르겠습니다.
혹시 쓰레드 소켓에서 소켓 정보가 잘못되는 경우를 방지하기 위한 방법이 있나요?
쓰레드 소켓 서버에서 받는 부분과 보내는 부분이
복잡해서 위와 같이 함수로 두었거든요.
잘 동작하다가도 클라이언트에서 recv 에러가 나고,
소켓이 ESTABLISHED 됩니다. (먹통이 되버립니다.)
Recv 는 비교적 간단하나,
Send의 경우 복잡한 작업을 하고 보냅니다.
(3분이 걸릴때도 있습니다.)
답변 부탁드리겠습니다.
Lum7671's Weblog
참조
흠..
혹시 쓰레드상에서 블럭을 방지 하실려면 지금 C로 하는지 C++로 하시는지 모르겠지만
C++이시면 try catch로 잡으셔도 됩니다.
try
{
}
catch( ... )
{
}
흠 gcc에서 catch( ... ) 지원하는지 모르겠군요 ^^:
아니시면
try
{
}
catch( std:exception e )
{
std:: cout << e.what() << std::endl;
}
그럼
Re: 참조
catch(...) 은 표준으로 알고 있습니다 :?
gcc는 2.XX에서는 형편없을 정도 였는데 [네임 스페이스도 제대로 구분 못하더군요]
3.2 이상에서는 거의 완벽하게 표준을 준수하는듯 보이네요
승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스
profiler
윈도우쪽으로 좀 기울은 프로그래머라 *닉스 계열의 프로파일러는 잘 모르겠군요. 작성하신 내용으로 볼때 그리 복잡한 프로파일러가 필요하지는 않을것 같은데요.
간단하게 직접 작성을 하셔도 될겁니다. 윈도우같은 경우는 QueryPerformanceCounter API 같은걸 쓰기도 하고 RDTSC같은 x86 명령어를 이용하기도 합니다. Query...는 윈도우 API라 못쓸테고 RDTSC는 인텔 플랫폼이라면 사용 가능할것이고, 다른 플랫폼에도 비슷한 명령어가 있을겁니다. 일반 타임은 단위가 너무 커서 제구실을 못하니 좀 신경 써서 작성을 하시면 간단한 프로파일러는 만들수 있습니다.
프로파일러를 처음 만들어 보신다면 전체 실행 시간, 특정 함수가 잡아 먹은 총시간 정도만 연산을 해도 원하시는 바를 충분히 이룰수 있을겁니다.
혹, 리눅스+인텔CPU라면 리눅스용 VTune 평가판으로 한번 시도를 해보세요.
http://www.intel.com/software/products/vtune/vlin/
산넘어 산
댓글 달기