增加测试-2
This commit is contained in:
@@ -246,7 +246,13 @@ const prepParams = buildSignedParams(appKey, {
|
||||
certActualStartTime: Date.now(),
|
||||
certActualEndTime: Date.now() + 30 * 24 * 60 * 60 * 1000,
|
||||
}, signMethod)
|
||||
await post('/send-code', prepParams, {})
|
||||
const prepResult = await post('/send-code', prepParams, {})
|
||||
if (prepResult.data?.result === 1) {
|
||||
console.log(` 数据准备完成 (${prepResult.ms}ms)`)
|
||||
} else {
|
||||
console.log(` ⚠ 数据准备失败: result=${prepResult.data?.result} error_msg="${prepResult.data?.error_msg}" (${prepResult.ms}ms)`)
|
||||
console.log(` 请确认服务端已配置正确的 appKey/signSecret 且未触发限流`)
|
||||
}
|
||||
|
||||
for (const endpoint of endpointsToTest) {
|
||||
console.log('')
|
||||
@@ -256,16 +262,21 @@ for (const endpoint of endpointsToTest) {
|
||||
console.log('╚══════════════════════════════════════════════════════╝')
|
||||
|
||||
const result = await runLoadTest(endpoint, targetTps, testDuration, loadTestOid)
|
||||
console.log(` 实际 TPS : ${result.actualTps.toFixed(1)}`)
|
||||
console.log(` 成功 TPS : ${result.successTps.toFixed(1)} (业务 result=1)`)
|
||||
console.log(` 总请求数 : ${result.totalReqs}`)
|
||||
console.log(` 成功数 : ${result.successes}`)
|
||||
console.log(` 失败数 : ${result.failures}`)
|
||||
console.log(` 业务成功 : ${result.successes}`)
|
||||
console.log(` 业务失败 : ${result.bizErrors}${result.bizSample ? ` (示例: ${result.bizSample})` : ''}`)
|
||||
console.log(` 被限流 : ${result.rateLimited}`)
|
||||
console.log(` 平均耗时 : ${result.avgMs.toFixed(1)} ms`)
|
||||
console.log(` P50 : ${result.p50Ms.toFixed(1)} ms`)
|
||||
console.log(` P95 : ${result.p95Ms.toFixed(1)} ms`)
|
||||
console.log(` P99 : ${result.p99Ms.toFixed(1)} ms`)
|
||||
console.log(` 最小耗时 : ${result.minMs.toFixed(1)} ms`)
|
||||
console.log(` 最大耗时 : ${result.maxMs.toFixed(1)} ms`)
|
||||
|
||||
if (result.rateLimited > result.totalReqs * 0.1) {
|
||||
console.log(` ⚠ 注意: ${((result.rateLimited / result.totalReqs) * 100).toFixed(0)}% 请求被限流,建议调高 KUASHOU_INDUSTRY_RATE_LIMIT_MAX`)
|
||||
}
|
||||
}
|
||||
|
||||
console.log('')
|
||||
@@ -315,10 +326,12 @@ async function runLoadTest(
|
||||
duration: number,
|
||||
oid: string,
|
||||
): Promise<{
|
||||
actualTps: number
|
||||
successTps: number
|
||||
totalReqs: number
|
||||
successes: number
|
||||
failures: number
|
||||
bizErrors: number
|
||||
bizSample: string
|
||||
rateLimited: number
|
||||
avgMs: number
|
||||
p50Ms: number
|
||||
p95Ms: number
|
||||
@@ -326,13 +339,14 @@ async function runLoadTest(
|
||||
minMs: number
|
||||
maxMs: number
|
||||
}> {
|
||||
const interval = Math.max(1, Math.floor(1000 / tps))
|
||||
const totalRequests = Math.min(tps * duration, 10000)
|
||||
const latencies: number[] = []
|
||||
let successes = 0
|
||||
let failures = 0
|
||||
let bizErrors = 0
|
||||
let rateLimited = 0
|
||||
let bizSample = ''
|
||||
const startedAt = Date.now()
|
||||
const deadline = startedAt + duration * 1000
|
||||
const intervalMs = Math.max(1, Math.floor(1000 / tps))
|
||||
|
||||
const worker = async () => {
|
||||
while (Date.now() < deadline) {
|
||||
@@ -360,17 +374,30 @@ async function runLoadTest(
|
||||
}
|
||||
|
||||
const params = buildSignedParams(appKey, bizParams, signMethod)
|
||||
const { ok, ms } = await post(`/${endpoint}`, params, { oid })
|
||||
const { ok, data, ms } = await post(`/${endpoint}`, params, { oid })
|
||||
|
||||
latencies.push(ms)
|
||||
if (ok || (endpoint === 'destroy-code' && ms < 500)) {
|
||||
|
||||
if (ok) {
|
||||
successes++
|
||||
} else if (data?.error_msg && String(data.error_msg).includes('频繁')) {
|
||||
rateLimited++
|
||||
} else if (data?.result === 4010003 && String(data?.error_msg || '').includes('频繁')) {
|
||||
rateLimited++
|
||||
} else if (data?.result != null && data?.result !== 1) {
|
||||
bizErrors++
|
||||
if (!bizSample) {
|
||||
bizSample = `result=${data.result} "${data.error_msg}"`
|
||||
}
|
||||
} else {
|
||||
failures++
|
||||
bizErrors++
|
||||
if (!bizSample) {
|
||||
bizSample = `HTTP ${ms}ms ${JSON.stringify(data).slice(0, 100)}`
|
||||
}
|
||||
}
|
||||
|
||||
const elapsed = Date.now() - startedReq
|
||||
const sleep = interval - elapsed
|
||||
const sleep = intervalMs - elapsed
|
||||
if (sleep > 0) {
|
||||
await delay(sleep)
|
||||
}
|
||||
@@ -384,10 +411,12 @@ async function runLoadTest(
|
||||
latencies.sort((a, b) => a - b)
|
||||
|
||||
return {
|
||||
actualTps: successes / Math.max(1, (Date.now() - startedAt) / 1000),
|
||||
successTps: successes / Math.max(1, (Date.now() - startedAt) / 1000),
|
||||
totalReqs: latencies.length,
|
||||
successes,
|
||||
failures,
|
||||
bizErrors,
|
||||
bizSample,
|
||||
rateLimited,
|
||||
avgMs: avg(latencies),
|
||||
p50Ms: percentile(latencies, 50),
|
||||
p95Ms: percentile(latencies, 95),
|
||||
|
||||
Reference in New Issue
Block a user