如何在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
相关产品推荐
相关产品推荐

