使用PhantomJS进行性能测试

Sri*_*sha 8 load-testing node.js phantomjs

我正在使用Google大豆模板,并开发了服务器端和客户端渲染解决方案.我想使用性能测试对它们进行基准测试.在对客户端部分进行基准测试时,我想等到执行所有javascript操作以计算实际响应时间.

我曾在下面试过,但它没有解决我的目的.

  • PhantomJS支持访问单页并查询页面上所需的信息,但不提供任何模拟并发连接的选项
  • Nodeload提供了加载测试服务器的能力,但没有任何选项可以从页面中检索信息.

是否还有其他框架可用于执行负载测试以及页面抓取?

Dar*_*ook 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上运行,但行为完全不同.启动每个实例似乎有更多的开销,但更重要的是每个实例都有自己的磁盘缓存.所以我的测试时间涉及到Google CDN for JQuery的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
}
Run Code Online (Sandbox Code Playgroud)

  • `如果这仍然不够平衡,请使用bash脚本启动,比如8个PhantomJS实例,我使用phantomjs和[parallel](https://www.gnu.org/software/parallel/)来在3个不同的resolutins中截取/截取一堆网站,所以如果你采用bash方式,请考虑并行. (2认同)