2013-05-07 4 views
8

Google soy 템플릿을 사용 중이며 서버 측 렌더링 솔루션과 클라이언트 측 렌더링 솔루션을 모두 개발했습니다. 성능 테스트를 사용하여 벤치마킹하려고합니다. 클라이언트 측 부분을 벤치마킹하면서 응답 시간이 인 을 계산하기 위해 모든 javascript 작업이 수행 될 때까지 기다리고 싶습니다.PhantomJS를 통한 성능 테스트

아래에서 시도했지만 제 목적을 해결하지 못했습니다.

  • PhantomJS 단일 페이지에 액세스하고 페이지에 필요한 정보를 조회 지원하지만 동시 연결
  • Nodeload
  • 을 시뮬레이션 할 수있는 옵션을 제공하지 않습니다이며, 서버로드 테스트 할 수있는 기능을 제공하지만,하지 않습니다 페이지에서 정보를 검색하는 옵션이 있습니다.

로드 테스팅과 페이지 스크래핑을 수행하는 데 사용할 수있는 다른 프레임 워크가 있습니까?

답변

11

PhantomJS (및 SlimerJS)로 할 수 있습니다. 각 요청마다 새로운 page 인스턴스를 만듭니다. 아래 스크립트는 전체 예제입니다. (경고 : 페이지가 다른 많은 리소스를 요청할 경우 매우 자세한 내용입니다.) 왼쪽의 숫자는 스크립트가 시작된 후 밀리 초입니다.

내 컴퓨터에서 example.com은 localhost를 가리키며 병목 현상은 Apache입니다. 예 : N = 30으로 실행하면 약 5 초가 걸립니다. 그런 다음 즉시 다시 실행하면 0.75 초가 걸립니다 (충분한 Apache 인스턴스가 이미 스핀 업 되었기 때문에). N = 100으로 시도했을 때 약 12 ​​초가 걸렸고 불쌍한 노트북에 막대한 부하를주었습니다.

브라우저의 6 연결 제한에 맞지 않고 100 개의 모든 연결이 동시에 실행되고 있음을 증명하기에 충분했습니다. 아직 충분히 병렬 적이 지 않다면 bash 스크립트를 사용하여 8 개의 PhantomJS 인스턴스 (8 코어 있다고 가정)를 시작하십시오. 참고 : 모든 페이지 인스턴스가 브라우저 캐시를 공유하고 있습니다. 그래서 저는 jQuery에 대한 단일 요청을 봅니다.

똑같은 스크립트가 SlimerJS에서 실행되지만 동작은 매우 다릅니다. 거기에 보이는 것처럼 각 인스턴스를 시작하는 데 더 많은 오버 헤드가 있지만 더 중요한 것은 각각 자체 디스크 캐시가 있다는 것입니다. 그래서 테스트 시간에는 JQuery 용 Google CDN에 대한 30 건의 요청이 포함되었습니다.

(요구 PhantomJS 캐시를 공유하지 구성 할 수 있습니다, 또는 내가 오프 손 모르는로 SlimerJS는, 아마도, 다른 StackOverflow의 질문해야 할 수 있습니다. 경우)

/** 
* This calls N instances of URL in parallel 
*/ 
var url = "http://example.com/"; 
var N = 30; 

var cnt = 0; 

function onResourceReceived(response) { 
    console.log((Date.now() - startTime) + ':' + response.stage + ':' + response.url); 
} 

function onResourceRequested(requestData, networkRequest) { 
    console.log((Date.now() - startTime) + ':Request:' + requestData.url); 
} 

function onCompletion(status) { 
    ++cnt; 
    console.log((Date.now() - startTime) + ':COMPLETE(' + cnt + '):' + status + ':' + this.url); 
    if (cnt >= N) phantom.exit(); 
} 

var startTime = Date.now(); 
for (var i = 0; i < N; i++) { 
    var page = require('webpage').create(); 
    page.onResourceReceived = onResourceReceived; 
    page.onResourceRequested = onResourceRequested; 
    page.open(url + "?i=" + i, onCompletion); //Append i to allow tracking 
} 
+2

'아직 충분히 병렬 적이 지 않다면, bash 스크립트를 사용하여 PhantomJS의 8 인스턴스를 시작하십시오. 나는 [parallel] (https://www.gnu.org/software/parallel)와 함께 phantomjs를 사용합니다. /) 3 개의 다른 resolutins에있는 많은 사이트들을 긁어 모으거나 스크린 샷을 찍으려고합니다. 그래서 만약 당신이 bash 방식으로 간다면, 평행을 고려하십시오. – birdspider

0

는에서보세요 LoadBooster (https://www.loadbooster.com). PhantomJS/CasperJs를 사용하여 테스트를 배포합니다. PhantomJS/CasperJS는 모든 페이지를 구문 분석하고 렌더링하며 클라이언트 측 스크립트를 실행합니다. PhantomJS/CasperJS 접근 방식은 복잡한 AJAX 무거운 웹 2.0 응용 프로그램을 지원하는 테스트 시나리오를 작성하는 것이 더 쉽습니다.

면책 조항 : 나는 LoadBooster에서 일합니다.