2011-04-22 9 views
3

내 설정은 django 1.3이고 우분투 10.04의 기본 mod_wsgi 및 apache 패키지입니다. 나는 내 개발 VM (오프 DEBUG 및 디버깅 도구 모음)를 내 응용 프로그램의 하나 개의보기를 테스트 :django 서버 속도 향상

ab -n 200 -c 5 http://127.0.0.1/ 

초당 4 개 요청을 얻었다. 이것은 느린 것처럼 느껴졌 기 때문에 디버깅 툴바가 8ms를 취하는 4 개의 쿼리를 가지고 있다고 알려주는 시점까지 쿼리, 사용 된 인덱스 등을 단순화했습니다. 동일한 테스트를 실행하면 초 당 8 건의 요청 만받습니다. CPU가 전체 시간에 100 % 인 것 같습니다. 이것은 현재 매우 단순한보기에 비해 상당히 느려 보이지만 저전력 VM입니다.

큰 ec2 인스턴스 (4CPU)를 시작하여 어떤 종류의 성능을 얻었는지 확인하고 해당 시스템 클래스에 들어가서 초 당 13 개의 요청 만 받는다는 것에 놀랐습니다. 어떻게 아파치/mod_wsgi의 구성을 변경하여이 클래스에서 더 많은 성능을 얻을 수 있습니까?

은 내가 prefork의 것이 아니라 노동자를 사용하고 생각 :

$ /usr/sbin/apache2 -l 
Compiled in modules: 
    core.c 
    mod_log_config.c 
    mod_logio.c 
    worker.c 
    http_core.c 
    mod_so.c 

내 근로자의 구성은 다음과 같습니다

<IfModule mpm_worker_module> 
    StartServers   2 
    MinSpareThreads  25 
    MaxSpareThreads  75 
    ThreadLimit   64 
    ThreadsPerChild  25 
    MaxClients   150 
    MaxRequestsPerChild 0 
</IfModule> 

내 WSGI 설정은 다음과 같이 :

WSGIScriptAlias//home/blah/site/proj/wsgi.py 
WSGIDaemonProcess blah user=blah group=blah processes=1 threads=10 
WSGIProcessGroup blah 

감사합니다 매우 많은 도움을!

참고 : 나는 다른 인스턴스에서 AB 테스트를 시도하고

답변

3

만들기 연결 유지 확인이 꺼져 같은 결과를 얻었다.

더 많은 프로세스와 단일 스레드 나는 CPU가 제한적인 요소 인 곳에서 더 나은 성능을 보았습니다. 시도하십시오 processes=4 threads=1.

+0

그럴 것 같았습니다. 이제 초당 21 건의 요청. 또한, 그 큰 ec2 인스턴스는 단지 2 물리적 인 CPU를 가지고 기억. 따라서 프로세스를 2로 설정하면 동일한 이점이 있습니다. 감사! – asciitaxi

2

mod_wsgi에 조정할 수있는 가장 좋은 방법은 그것을 사용하지 :)

우선이다 : 당신의 문제는 웹 서버입니다 생각하지 않는다 : 당신이 수백 요청을 얻을 수 있습니다 mod_wsgi에/s의. 캐싱 및 DB 연결 풀링을 사용하면 더 나은 결과를 얻을 수 있습니다. 포스트그레스를 사용한다면 pgpool II : http://pgpool.projects.postgresql.org/을 살펴보십시오.

그러나 wsgi 웹 서버에 대해 더 자세히 알고 싶다면이 멋진 벤치 마크 인 http://nichol.as/benchmark-of-python-web-servers을주의 깊게 읽으십시오.

비동기 근로자가 필요하지 않은 경우 gunicorn을 선택하는 것이 좋습니다. 설치가 매우 쉽습니다 (manage.py run_gunicorn으로 실행할 수 있습니다). 매우 빠릅니다. mod_wsgi가 cuprit가 아닌지 확인하려면, 시도해보십시오. gevent 또는 uWSGI를 사용하여 더 나은 성능을 원한다면.

그러나 웹 서버는 벤치 마크를 변경하지 않습니다. 4 req/s에서 4.01 req/s로 변경할 수 있습니다.

+0

감사합니다. @vad. 그것은 꽤 포괄적 인 기사입니다. 프로세스 수를 2로 변경하면 더 많은 성능을 얻을 수있을 것으로 보이지만, memcached는 실제 이득을위한 최선의 방법 일 것입니다. – asciitaxi

+0

그것은 단지 memcache가 아닙니다. DB 연결 풀링을 제안합니다. 쿼리에 8ms가 걸리지 만 DBMS 쿼리 시간의 합계 일뿐입니다. 연결/네트워크 시간을 고려하지 않습니다. – vad