2012-11-01 4 views
2

파이썬과 플라스크 프레임 워크를 사용하여 웹 응용 프로그램을 작성하고 mod_wsgi를 사용하여 Apache에서 설정했습니다. 오늘 JMeter를 사용하여이 애플리케이션에서 일부 부하 테스트를 수행했습니다. 하나 개의 웹 URL의 경우 : 내가 요청을 보내는 데에만 1 개 스레드를 설정스트레스 상황에서 웹 요청 성능이 매우 좋지 않습니다.

  • , 응답 시간은 200 밀리 내가 더에 요청, 응답 시간 증가를 보낼 수있는 20 개 개의 동시 스레드를 설정

  • 4000ms (4s). 이것은 받아 들일 수 없다!

나는이 문제를 찾기 위해 노력하고있어, 그래서 나는 술병의 before_request와 teardown_request 방법으로 시간을 기록했다. 요청을 처리하는 데 걸리는 시간이 10ms를 약간 넘는 것으로 나타났습니다.

이 URL 처리기에서 앱은 MySQL 데이터베이스에서 일부 SQL 쿼리 (약 10 개) 만 수행하며 특별한 것은 없습니다.

웹 서버 또는 프레임 워크 구성에 문제가 있는지 테스트하려면 동일한 플레인 응용 프로그램에서 Hello라는 또 다른 메서드를 작성하여 문자열 만 반환하면됩니다. 그것은 부하를 완벽하게 수행하며, 응답 시간은 13ms이며 20 스레드 동시성을가집니다.

로드 테스트를 수행 할 때 내 서버에서 '최상위'를 실행합니다. 약 10 개의 아파치 스레드가 있지만 CPU는 주로 유휴 상태입니다.

지금 제 재능이 끝났습니다. 요청이 순차적으로 수행 되더라도 성능이 크게 떨어지지 않아야합니다 ... 내 생각에 내가 알지 못하는 일부 대기열이 있으며 요청 처리 외에 오버 헤드가 있어야합니다.

웹 응용 프로그램의 성능을 튜닝 한 경험이있는 경우 도와주세요!

mod_wsgi에 관해서는
<IfModule mpm_worker_module> 
    StartServers   4 
    MinSpareThreads  25 
    MaxSpareThreads  75 
    ThreadLimit   64 
    ThreadsPerChild  50 
    MaxClients   200 
    MaxRequestsPerChild 0 
</IfModule> 

, 나는 (다음 줄을 주석에 의해) 오프 WSGIDaemonProcess 터닝 시도 : 아파치 구성에 대한

편집

, 나는 MPM 작업자 모드 구성을 사용 성능은 동일하게 보입니다.

# WSGIDaemonProcess tqt processes=3 threads=15 display-name=TQTSERVER 
+1

오랜 시간이 걸리는 SQL 쿼리가 확실하지 않습니까? 대부분의 시간 인덱싱에서는 열을 사용하고 쿼리 수정을 수정하면 속도 문제가 발생합니다. – inhan

+0

그러나 요청 처리 (모든 SQL 실행 포함)는 약 10ms 후에 완료됩니다. 나는 나머지 시간에 어떤 일이 일어나는지 궁금합니다 - 3900ms 이상. – NeoWang

+0

작업자 MPM의 경우 데몬 모드와 크게 다르지는 않지만 사용자가 거기에서 인용 한 내용에 따라 데몬 모드를 실행하고 있는지 여부는 알 수 없습니다. http://blog.dscpl.com.au/2012/10/why-are-you-using-embedded-mode-of.html –

답변

1

축하합니다! 사용자가 아닌 성능 문제를 발견했습니다!

웹 응용 프로그램의 성능 문제를 분석하는 것은 일반적으로 어렵습니다. 움직이는 부분이 너무 많고 실행 중에 응용 프로그램 내부를 보는 것이 어렵 기 때문입니다.

설명하는 동작은 일반적으로 병목 리소스와 관련되어 있습니다. 이는 특정 리소스가 계속 유지 될 수없는 경우 발생하며 응답 시간이있는 "하키 스틱"곡선으로 이어지는 경향이있는 요청을 대기열에 넣습니다 이 리소스가 유지할 수없는 지점에 도달하면 응답 시간이 매우 빠르게 증가합니다.

20 개의 스레드가 동시에 발생하는 경우 페이지에 많은 부하가 발생하지 않는 한 그렇게하는 것이 좋습니다.

처음 시작하는 곳은 TOP입니다 - CPU가 낮을 때, 메모리, 디스크 액세스 등 무엇을하고 있습니까? 데이터베이스가 동일한 시스템에서 실행되고 있습니까?그렇지 않다면 TOP는 데이터베이스 서버에서 무엇이라고 말합니까?

어리석은 하드웨어가 아니라고 가정하면 다음으로 가장 큰 문제는 해당 페이지의 데이터베이스 액세스입니다. 원하는 모든 것이 하나의 레코드 일 때 하나의 쿼리가 문자 그대로 전체 데이터베이스를 반환 할 수 있습니다 (이것은 ORM 솔루션을 사용하는 비교적 일반적인 패턴입니다). 그것은 당신이 묘사하는 행동으로 이어질 수 있습니다. 플라스크 로깅 프레임 워크를 사용하여 데이터베이스 호출 (시작, 끝, 반환 된 레코드 수)을 기록하고 거기에 이상을 찾습니다.

데이터베이스의로드가 잘되면 프레임 워크 또는 응용 프로그램 코드 중 하나입니다. 다시 말하지만, 코드의 로깅 구문을 사용하여 개별 코드 블록의 실행 시간을 추적하고 사냥을 계속하십시오.

매력적이지 않고 지루할 수 있습니다. 살고 있다!

0

새로운 유물을 사용하여 병목 현상이 어디인지 확인하십시오. 내 이야기에 병목 현상을 식별하는 그것의 개요와 설명을 참조하십시오 : 당신이 할 수있는 당신이 아파치 prefork의 또는 노동자 MPM을 사용하고 있는지

http://lanyrd.com/2012/pycon/spcdg/

또한 원래의 질문을 수정하고 사용중인 mod_wsgi에 구성을 추가, 플러스 비 최적의 무언가를 거기에서하는 것.

관련 문제