从wrk迁移至k6:参数对应关系及测试方法适配问询
wrk 迁移至 k6 的参数对应及完整测试示例
参数对应关系
直接对应wrk参数的k6配置项整理如下:
-d 1m(测试时长):k6options.duration: '1m'-c 256(总HTTP连接数):k6options.http.maxConnections: 256--timeout 30s:k6options.http.timeout: '30s'-R 16000(每秒总请求数):k6options.rps: 16000-q(静默模式):k6 执行时加--quiet参数
注:wrk的-t(线程数)在k6里没有直接对应——k6基于JS单线程模型,不需要手动指定OS线程数,你可以通过调整vus(虚拟用户数)配合rps来模拟相近的并发压力。
完整k6测试脚本
import http from 'k6/http'; import { open } from 'k6/fs'; // 读取请求文件,处理成请求列表 const requestsFile = open('./requests.reqs', 'r'); // 拆分每行并过滤空行,适配你的请求文件格式 const requests = requestsFile.split('\n').filter(line => line.trim() !== ''); export const options = { duration: '1m', // 对应wrk的-d 1m,测试持续1分钟 rps: 16000, // 对应wrk的-R 16000,每秒发送16000次请求 http: { timeout: '30s', // 对应wrk的--timeout 30s,请求超时时间30秒 maxConnections: 256, // 对应wrk的-c 256,总HTTP连接数限制为256 connectionReuse: true, // 保持连接复用,和wrk默认行为一致 }, // 如果需要调整虚拟用户数来配合压力控制,可以解开下面的注释 // vus: 100, }; export default function () { // 循环取请求,文件读完就从头开始,直到测试结束 const currentReq = requests[__ITER % requests.length]; if (currentReq) { // 假设你的requests.reqs每行是接口路径,比如/api/get-data // 如果是完整HTTP请求格式(含方法、headers、body),需要额外解析调整 const fullUrl = `http://localhost:8080${currentReq}`; http.get(fullUrl); // 根据实际请求方法改成post/put等 } }
执行说明
运行脚本的命令对应wrk的调用方式:
k6 run --quiet script.js
--quiet参数对应wrk的-q,会减少日志输出,只保留核心测试结果。
如果你的requests.reqs里是完整的HTTP请求(比如包含POST /api/user HTTP/1.1、请求头、请求体),需要额外解析每行内容,拆分出请求方法、路径、headers和body,再调用http.request()方法发送,示例片段如下:
// 假设每行是完整请求,拆分示例(需根据实际格式调整) const [methodPath, ...headersBody] = currentReq.split('\n'); const [method, path] = methodPath.split(' '); const headers = {}; let body = ''; let isBody = false; for (const line of headersBody) { if (line.trim() === '') { isBody = true; continue; } if (isBody) { body += line; } else { const [key, value] = line.split(': ', 2); headers[key] = value; } } http.request(method, `http://localhost:8080${path}`, body, { headers });
内容的提问来源于stack exchange,提问作者Omer Ratsaby
相关产品推荐
相关产品推荐

