You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在k6中获取内存占用、CPU利用率及渲染时间指标?代码问题排查

问题解答

一、获取k6测试的总内存占用量

k6提供两种方式获取内存占用数据:

1. 查看默认输出

运行测试时,k6会在终端默认输出测试汇总统计,其中包含vus_memory(单虚拟用户内存占用)和k6_process_memory(k6进程自身内存占用)指标,测试结束后会展示这些指标的平均值、最大值等统计值。

2. 自定义指标追踪内存

如果需要在脚本中更精细地监控内存,可以使用Gauge类型指标结合process.memoryUsage()API(k6支持Node.js的部分进程API):

import { Gauge } from 'k6/metrics';

// 定义自定义内存指标
const heapMemoryUsed = new Gauge('process_heap_memory_used');

export default function () {
  // 获取当前进程内存使用情况
  const memStats = process.memoryUsage();
  // 记录堆内存使用量(单位:字节)
  heapMemoryUsed.add(memStats.heapUsed);
}

运行测试后,自定义指标会和其他k6指标一起输出,你可以通过--out参数导出到Prometheus、InfluxDB等工具进行分析。

二、页面渲染时间获取与原有代码问题排查

原有代码的问题

你当前计算的renderTime = response.timings.duration - response.timings.waiting不是页面渲染时间,而是HTTP响应体的下载时间(从收到第一个字节到接收完所有响应数据的耗时)。k6的http模块仅处理HTTP请求/响应流程,不涉及浏览器页面渲染,所以无法通过这个方式获取渲染时间。

断言失败的原因大概率是这个下载时间确实超过了1000ms,你可以添加日志打印确认:

console.log(`Response body download time: ${renderTime}ms`);

正确获取页面渲染时间的方案

要获取真实的页面渲染时间,需要使用k6的browser模块(k6 v0.32.0及以上版本支持),模拟真实浏览器行为并读取浏览器的性能API数据:

import { browser } from 'k6/experimental/browser';
import { check } from 'k6';

export const options = {
  scenarios: {
    browser_test: {
      executor: 'shared-iterations',
      options: {
        browser: {
          type: 'chromium', // 使用Chrome内核浏览器
        },
      },
    },
  },
};

export default async function () {
  const page = browser.newPage();
  try {
    // 导航到目标页面,等待网络空闲(无请求持续500ms)
    await page.goto('https://example.com', { waitUntil: 'networkidle' });

    // 从浏览器中获取渲染相关性能指标
    const renderMetrics = await page.evaluate(() => {
      const timing = performance.timing;
      const paintEntries = performance.getEntriesByType('paint');
      
      return {
        // DOM内容加载完成时间
        domContentLoaded: timing.domContentLoadedEventEnd - timing.navigationStart,
        // 页面完全加载时间
        pageLoadTime: timing.loadEventEnd - timing.navigationStart,
        // 首次绘制时间
        firstPaint: paintEntries[0]?.startTime || 0,
        // 首次内容绘制时间
        firstContentfulPaint: paintEntries[1]?.startTime || 0,
      };
    });

    // 断言渲染时间指标
    check(renderMetrics, {
      'DOM内容加载耗时 < 1s': (m) => m.domContentLoaded < 1000,
      '页面完全加载耗时 < 2s': (m) => m.pageLoadTime < 2000,
      '首次绘制耗时 < 500ms': (m) => m.firstPaint < 500,
    });
  } finally {
    // 关闭页面释放资源
    page.close();
  }
}

注意:使用browser模块需要确保k6版本符合要求,且运行时需要有Chrome/Chromium浏览器环境。

内容的提问来源于stack exchange,提问作者yukta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:33:36