2011-12-09 2 views
1

스레드가 일종의 I/O 등을하지 않는 한 일반적으로 작업자 스레드의 수는 서버의 CPU 수와 같아야합니다 (내 경우 8입니다).C++ 웹 서버의 스레드 수를 결정하는 요인은 무엇입니까?

내 웹 서버 내 mysql 데이터베이스에서 광범위한 검색이 필요한 서비스를 제공하며 일부 쿼리는 최악의 경우 약 16 초가 걸립니다. 여기서 두 가지 질문이 있습니다. 1. 최적의 스레드 수를 어떻게 결정합니까? 2. 수천 명의 사용자를 시뮬레이트하고 수천 개의 요청에 대해 내 서버를 테스트하려면 어떻게해야합니까?

+0

"최악의 경우 _16 초?"평균? 클라이언트 수? – curiousguy

+0

@curiousguy 평균 5-6 초. 최소한 atleast 2000 클라이언트를 처리해야합니다. – Vink

답변

1

"스레드"의 정의에 따라 다릅니다.

스레드가 "차단 중"인 경우 ... 한 번에 하나의 클라이언트 만 처리하므로 8 스레드는 끔찍한 선택입니다. 작업자 스레드가 모두 비 블로킹 I/O를 수행하면 예를 들어 스레드 수를 CPU 수와 일치시키는 것이 좋습니다.

다른 고려 사항은 DB 호출이 비 차단인지 여부입니다. 나는 당신이 스크립팅을하고있는 언어 (또는 C++에서도 그렇게하고 있는가?)를 모르지만, 예를 들어 Mysql의 C 버전은 쿼리를 차단한다.

대규모 성능을 원하는 경우 NGiNX와 G-WAN을 살펴 보겠습니다.이 영역의 리더입니다.

http://nginx.org/

http://www.trustleap.com/

또한, 부하 테스트 : http://httpd.apache.org/docs/2.0/programs/ab.html 또는 http://www.hpl.hp.com/research/linux/httperf/

1

성능 측정과 마찬가지로 실제로 성능 테스트를 대신 할 수 없습니다. n * number of CPUs과 같은 이론적 인 측정을 고려해 볼 수 있습니다. n은 작은 상수이지만 경험적 검증을위한 대체재는 없습니다.

0

추가 참고 사항 몇 : 때문에 코어와 CPU 캐시 동기화의 비용의

, 그것은 만든다 귀하의 HTTP 작업자 스레드를 물리적 주소 인 CPU 코어 (하이퍼 쓰레기 무시).

또한, weighttp은 (Lighty는 팀에 의해 만들어진 다중 스레드 클라이언트)보다 더 많은 관련 인 (싱글 스레드) ApacheBench을 멀티 코어 서버를 테스트하기 :

  • 여러 스레드를 포화 수없는 클라이언트에 대한 하나 개의 단일 스레드 에 서버가 있습니다 (서버가 빠를 때).

당신은 30 개 이상의 웹 서버, 캐시 서버 및 응용 프로그램 서버를 테스트하는 데 사용 된이 공용 도메인 ab.c wrapperABweighttp에 's에 의해 주어진 결과를 비교할 수 있습니다.

보너스로 ab.c은 초당 요청 외에도 RAM 및 CPU 리소스 사용량을 수집합니다.

관련 문제