در تست عملکرد مستمر، خطر فقط کندبودن سیستم نیست؛ مقایسهٔ نامعتبر هم خطر است. Candidate ممکن است میانگین ۱۸۰ میلی‌ثانیه، نرخ خطای ۰٫۵٪ و Gate سبز داشته باشد، اما Baseline روی Build، Environment، Workload، Data یا Telemetry دیگری اجرا شده باشد. در این حالت عدد دقیق است، ولی پاسخ پرسش Regression را نمی‌دهد.

این راهنما تست عملکرد را به چند Stage ثابت یا فهرست ابزار تبدیل نمی‌کند. یک Performance Evidence Ladder می‌سازد که از Question و Workload شروع می‌شود، Subject/Environment/Measurement را قفل می‌کند، Baseline و Candidate را فقط در شرایط قابل‌مقایسه می‌سنجد و نتیجه را با عدم‌قطعیت به Decision می‌رساند. هدف، بازخورد مناسب در زمان مناسب است؛ نه ادعای ظرفیت Production، رعایت SLO یا «عملکرد برتر» از یک Run آزمایشگاهی.

مسیر کوتاه: Performance feedback در هشت گام

گامپرسشخروجی
QuestionRegression، Budget، Capacity یا Diagnosis؟Claim boundary
Scenarioکدام journey/operation و success؟Scenario contract
WorkloadArrival، rate، mix، duration و state چیست؟Workload model
Subjectکدام Build/Artifact/config/data؟Immutable identity
MeasureDuration از کجا تا کجا و Error چیست؟Metric semantics
CompareBaseline و Candidate قابل‌مقایسه‌اند؟Comparability verdict
DecideAbsolute/relative/tail/uncertainty rules چیست؟Regression decision
LearnProduction signal چه چیزی را اصلاح می‌کند؟Feedback/next experiment

Continuous Performance Testing چیست؟

تست عملکرد مستمر یک Test type تازه نیست. روشی برای توزیع سؤال‌های عملکردی در چرخهٔ تغییر است: بررسی سریع Algorithm یا component، مقایسهٔ API/service، آزمایش system/workload، و مشاهدهٔ محدود Production. هر لایه Fidelity، هزینه، سرعت و Claim متفاوت دارد. «مستمر» نیز لزوماً به معنی اجرای هر تست روی هر Commit نیست؛ Trigger باید متناسب با Risk، تغییر، هزینه و Feedback deadline باشد.

سطحسؤال مناسبسرعت تقریبیClaim ممنوع
Microbenchmarkپیاده‌سازی محلی کندتر شد؟سریعLatency کاربر/Capacity
Component/APIService در Workload کنترل‌شده Regression دارد؟میانهEnd-to-end SLO
SystemJourney و dependencyها زیر بار چگونه‌اند؟کندترProduction equivalence
Capacity/Stressکجا Saturation/Failure transition رخ می‌دهد؟پرخرجظرفیت قطعی آینده
Production observationکاربر/traffic واقعی چه signalی دارد؟مداومآزمایش کنترل‌شده بدون confounder

انواع Load، Stress، Spike، Endurance، Scalability و Capacity و طراحی پایهٔ آنها در راهنمای جامع تست عملکرد آمده است. این صفحه فقط اتصال لایه‌ها به CI/CD و Comparability را مالک است.

مالکیت این مقاله: Performance Evidence Ladder

Risk / User Journey / Performance Question
  -> Scenario + Workload Contract
  -> Subject + Environment + Dataset
  -> Instrumentation + Metric Semantics
  -> Repeated Baseline and Candidate Runs
  -> Comparability Audit
  -> Absolute + Relative + Tail + Error + Resource Rules
  -> PASS | REGRESSION | REVIEW | INVALID
  -> Authorized Decision / Exception / Rerun
  -> Production Feedback / Model Revision

اول سؤال را مشخص کنید؛ یک Run پاسخ همه‌چیز نیست

Question typeBaselineخروجیمحدودیت
RegressionBuild قبلی در Context همسانDelta/uncertaintyنه SLO یا Capacity
Absolute budgetRequirement/Policywithin/outside budgetRequirement adequacy جداست
CapacityWorkload/scale modelsaturation envelopeتقاضای آینده نامطمئن
Scalabilityچند resource levelresponse curveextrapolation محدود
Diagnosisknown symptom/runhypotheses/evidenceCause قطعی نیست
SLO validationSLI/SLO spec و traffic scopebounded evidenceآزمایشگاه جای production window نیست
performanceQuestion:
  id: Q-CHECKOUT-LATENCY-17
  type: REGRESSION
  subjectChange: C17 / B17
  scenario: SCN-CHECKOUT-17
  comparison: B16 vs B17 under same PERF contract
  primaryClaim: candidate p95 regression is within policy bound
  secondarySignals: p50, p99, business errors, throughput, saturation
  exclusions: production capacity, SLO compliance, user satisfaction
  decisionAudience: performance-risk-owner-a

Scenario فقط URL نیست

یک Scenario باید Actor، precondition، state، operation sequence، success oracle، error taxonomy، correlation، data lifecycle و cleanup داشته باشد. `POST /checkout` با status ۲۰۰ ممکن است business failure، duplicate order، reconciliation gap یا timeout پنهان داشته باشد. Latency موفق و ناموفق را کورکورانه مخلوط نکنید.

scenario:
  id: SCN-CHECKOUT-17
  actor: customer-syn
  precondition: cart with 3 synthetic items
  steps: create-order -> start-attempt -> callback-stub -> confirm
  success: order-confirmed with same correlation ID and ledger balance
  errors: transport | timeout | http-5xx | business-reject | client-cancel
  data: DATA-PERF-17
  cleanup: deterministic tenant reset
  exclusions: notification delivery, real PSP, production user

Workload Model: «۱۰۰ کاربر» کافی نیست

بعدپرسشنمونه
ModelOpen یا Closed؟open arrivals
Rateدرخواست/transaction در زمان؟100 request/s
Concurrencyورودی یا پیامد latency؟observed، نه fixed users
Mixسهم هر Journey/role/data؟70/20/10
Rampبار چگونه تغییر می‌کند؟2m linear
Warm-upکدام Window حذف/گزارش می‌شود؟5m excluded and retained
Steady windowچه مدت؟15m
Think timeDistribution چیست؟SCN-v4
Retry/timeoutچه کسی و چند بار؟generator off/service counted
StateCache/pool/queue شروع؟controlled warm state

در مدل Closed، کندشدن پاسخ می‌تواند نرخ درخواست را خودبه‌خود کم کند و overload واقعی را پنهان کند؛ در مدل Open، Generator باید rate را مستقل از response حفظ کند. هیچ‌کدام همیشه بهتر نیستند. Workload باید رفتار موردسؤال را مدل کند و limitation آن صریح باشد.

Subject Contract: دقیقاً چه چیزی سنجیده شد؟

هویتنمونهMismatch رایج
Source/Build/ArtifactC17/B17/sha256:ART17`latest` یا rebuild
ConfigCFG-PERF-7feature flag/pool متفاوت
DependenciesDEP-SNAP-17shared service drift
EnvironmentENV-PERF-7نام staging
Topology/resourcesTOPO-7/RES-7CPU limit/replica متفاوت
DatasetDATA-PERF-17حجم/cardinality/skew متفاوت
WorkloadWL-v4script یا mix متفاوت
GeneratorGEN-v3laptop یا image latest
TelemetryTEL-v5/MET-v3instrumentation drift

Environment برابر Production لازم نیست؛ Fidelity باید هدف‌دار باشد

محیط «دقیقاً مشابه Production» معمولاً ادعایی غیرقابل‌اثبات و پرهزینه است. برای Regression، ثبات و تقارن Baseline/Candidate ممکن است مهم‌تر از شباهت کامل باشد. برای Capacity، topology/resource/dependency fidelity اهمیت بیشتری دارد. برای user latency، network/client/cache/CDN fidelity مطرح است. Fidelity profile را بر اساس Question بسازید و Gapها را در Claim limit نگه دارید.

environmentProfile:
  id: ENV-PERF-7
  purpose: controlled regression comparison
  topology: TOPO-7
  resources: RES-7
  config/flags: CFG-PERF-7
  dependencies: local deterministic stubs + declared fidelity
  network: NET-PERF-2
  dataset: DATA-PERF-17
  isolation: tenant + namespace + quiet-window controls
  observability: TEL-v5
  gaps: no CDN, no multi-region, no real PSP, smaller dataset cardinality
  claimLimit: laboratory regression only

برای طراحی محیط و Drift/Fidelity، معماری محیط تست مدرن مرجع مستقل است. Container و IaC تکرارپذیری را کمک می‌کنند، اما noisy neighbor، hypervisor، kernel، clock، network و dependency behavior را خودکار یکسان نمی‌کنند.

Data واقعی لازم نیست؛ توزیع و state باید نماینده باشد

کپی Production می‌تواند PII، Secret، retention و مجوز را نقض کند و بازتولیدپذیری را نیز خراب کند. Data مصنوعی وقتی schema، cardinality، skew، hot/cold distribution، relationship، lifecycle و edgeها را مدل می‌کند ممکن است مناسب‌تر باشد. «حجم زیاد» بدون distribution و query/selectivity معنا ندارد.

بعد دادهثبت لازماثر عملکردی
Cardinalityrows/entities/keysindex/cache/plan
Distributionskew/hot setscontention/cache hit
Relationshipsfan-out/depthjoin/serialization
Statenew/aged/archivedquery path/storage
Payloadsize/encoding/RTLnetwork/parser/memory
Mutationwrite/read ratiolocks/queues
Privacysynthetic/masked controlssafe repeatability

Generator نیز System Under Observation است

اگر Generator CPU=۹۸٪ دارد، connection pool پر است یا ۴۵۰ request را drop کرده، بار اعلام‌شده به System نرسیده است. Generator version/image، location/network، time sync، resource saturation، achieved rate، dropped/late requests، queue lag، connection behavior و coordinated-omission handling را ثبت کنید.

Signal GeneratorGate نمونهاگر نقض شد
Achieved/target rate98..102%INVALID/REVIEW
Dropped requests۰ یا policy-boundنتیجه ناقص
CPU throttlingnonescale generator
Clock driftboundedtrace/latency نامعتبر
Network saturationbelow boundisolate/distribute
Internal queue lagbelow intervalcoordinated omission risk

Duration را از کجا تا کجا می‌سنجید؟

نام `response_time` مبهم است: قبل از ارسال byte نخست تا header؟ تا body کامل؟ شامل DNS/TLS/queue/retry/redirect؟ Client و server ممکن است boundary متفاوت داشته باشند. OpenTelemetry HTTP metric semantic conventions برای duration نام، نوع Histogram، واحد ثانیه و attributeهای مشترک پیشنهاد می‌دهد؛ اما شما همچنان باید client/server و end boundary را روشن کنید.

metricContract:
  id: MET-HTTP-DUR-v3
  name: http.client.request.duration
  unit: s
  instrument: Histogram
  start: before first request byte is sent
  end: after response body is fully read
  retry: each attempt measured; scenario outcome separately correlated
  attributes: method, route-template, status/error class, protocol, build
  cardinalityPolicy: no user/order/raw URL IDs
  buckets/schema: versioned and identical for comparison
  missing/overflow: reported, not dropped
  clock: monotonic duration source

Average دم latency را پنهان می‌کند

میانگین ۱۸۰ms می‌تواند در کنار p95=340ms و p99=610ms باشد. برای latency، distribution، count، errors و tail را نگه دارید. Median تجربهٔ معمول و percentile بالاتر دم را نشان می‌دهد، اما هیچ percentile واحدی کل شکل توزیع یا تجربهٔ همهٔ کاربران را نمایندگی نمی‌کند.

آمارکاربرددام
Meanهزینهٔ کل/برخی مدل‌هاپنهان‌کردن tail
p50حالت معمولنادیده‌گرفتن کاربران کند
p95/p99Tail behaviorSample/bucket/aggregation sensitivity
Maxبدترین مشاهدهoutlier/window sensitivity
Histogramشکل/aggregationresolution/bucket interpolation
Apdexthreshold summarythreshold/value assumptions

Percentileها را میانگین نگیرید

میانگین p95 دو Run یا دو Instance، p95 مجموع observations نیست. راهنمای رسمی Prometheus دربارهٔ Histogram و Summary صریحاً هشدار می‌دهد که averaging quantiles از Summary معنی آماری ندارد؛ Histogramهای سازگار را می‌توان بر اساس bucket count جمع و سپس quantile را تخمین زد. حتی آنجا هم bucket width و interpolation uncertainty باقی است.

BAD:  aggregate_p95 = average(run1.p95, run2.p95)

BETTER:
  assert compatible metric semantics + bucket schema
  merge observation counts / histograms
  report total N, run-level distributions and pooled estimate
  retain run-to-run variation
  if incompatible: DO_NOT_COMPARE / rerun

Error rate مخرج و Taxonomy می‌خواهد

۰٫۵٪ از چه چیزی؟ Attempt، request، transaction یا unique journey؟ آیا timeout، client cancel، business reject، 4xx، 5xx، retry و incomplete response در مخرج/صورت‌اند؟ اگر retry موفق، failure نخست را پنهان کند، latency و reliability هر دو دست‌کاری می‌شوند. Request outcome و business outcome را جدا، اما با correlation نگه دارید.

OutcomeRequest layerScenario layer
Transport failureERRORFAILED/RETRIED
TimeoutERROR + duration boundUNKNOWN/FAILED طبق oracle
HTTP 200 + rejectprotocol successbusiness failure
HTTP 503 then retry 200دو attemptsuccess-with-retry + total latency
Client cancelseparate classContext dependent
Duplicate confirmationممکن است ۲۰۰ باشدintegrity failure

Throughput بدون Offered load و Success بی‌معناست

Throughput باید achieved successful work در Window تعریف‌شده باشد و در کنار offered rate، attempts، rejected، timeout، retry و dropped generator reports بیاید. بالا رفتن throughput با افزایش failure یا کاهش payload/validation بهبود نیست. Concurrency نیز گاهی نتیجهٔ arrival rate×latency است، نه ورودی مستقل.

Resource utilization را با Saturation و Work وصل کنید

Signalچه می‌گوید؟چه نمی‌گوید؟
CPU utilizationزمان مصرف‌شده در Contextheadroom یا bottleneck قطعی
CPU throttlinglimit pressureتنها علت latency
Memory/RSS/heapfootprint/stateleak بدون trend/GC/context
Queue depth/agewaiting/saturation signalCause
Pool utilizationresource contentionبهینه‌بودن pool
GC pauseruntime stop signaluser impact بدون correlation
DB wait/lockdatabase contentionroot cause نهایی

Warm-up، Cache و JIT را پنهان نکنید

حذف Warm-up می‌تواند برای steady-state comparison منطقی باشد، اما باید Window حذف‌شده و دلیل آن گزارش شود. Startup/first-request نیز ممکن است Requirement مستقلی باشد. Cache prime، JIT compilation، connection pool، autoscaling، DNS/TLS و data page cache باید کنترل یا به‌عنوان Factor آزمایش شوند؛ نه اینکه با Run تکراری نامرئی شوند.

تکرار Run و عدم‌قطعیت

یک Run نقطه‌ای تحت noise می‌تواند مثبت یا منفی کاذب بسازد. تکرار، randomization/paired order، quiet window، raw distributions و run-level variation کمک می‌کنند. تعداد تکرار جهانی وجود ندارد؛ expected effect، variance، هزینه و Decision risk مهم‌اند. اگر Runها اختلاف غیرقابل‌توضیح دارند، نتیجه `REVIEW/INCONCLUSIVE` است، نه میانگین‌گیری برای سبزشدن.

طراحیمزیتریسک
Baseline سپس Candidateسادهtime drift/order effect
Paired alternating B/Cکاهش driftcache/carryover
Randomized orderکاهش bias ترتیبoperational complexity
Shared environment sequentialresource paritystate contamination
Parallel isolatedزمان کمترhardware/noisy-neighbor mismatch

Comparability Contract: پیش از محاسبهٔ Delta

comparability:
  question/scenario: same version
  baseline/candidate: immutable B16 / B17
  environment/topology/resources/config: same or modeled delta
  dependencies/dataset/state: same snapshots
  workload/arrival/mix/ramp/duration: same WL-v4
  generator/version/location/capacity: same GEN-v3
  telemetry/metric/buckets/unit/boundaries: same TEL-v5/MET-v3
  warmup/cache/retry/timeout/connection: same policies
  interference/time window: bounded and reported
  raw evidence: available for every Run
  result: COMPARABLE | CONDITIONALLY_COMPARABLE | NOT_COMPARABLE
  mismatchDisposition: model | exception | rerun

Absolute و Relative Rule را با هم نگه دارید

قاعدهمثال ساختگیفایدهدام
Absolutep95≤0.35sBudget مستقلCandidate بدتر ولی هنوز زیر سقف
Relativep95 regression≤8%حساس به تغییرBaseline بد/نویز
Tailp99≤0.65sدمSample/resolution
Errorbusiness error≤0.8%جلوگیری از fast failureTaxonomy/mخرج
Throughputachieved≥98% offeredبار واقعیgenerator saturation
Resourceno throttling/queue runawaySaturationfixed universal threshold
Uncertaintyrun disagreement→REVIEWضد false precisionReview debt

SLO، SLI و Test Threshold یکی نیستند

SLI تعریف indicator خدمت برای Population/Window/measurement مشخص است؛ SLO target آن indicator در یک Window و برای user/service scope است؛ Test threshold یک policy آزمایشگاهی برای Question محدود است. می‌توان آنها را مرتبط کرد، اما برابرگرفتنشان بدون traffic، measurement point، error budget، exclusion و production context نادرست است.

ArtifactSubject/WindowمثالAuthority
SLIservice population/timegood eligible requests / eligibleservice measurement owner
SLOproduction service/window99.9% over 28dservice/product governance
Test oracleRun/Build/Scenariop95≤0.35stest policy
Regression ruleB16 vs B17delta≤8%performance risk policy
Release decisionrelease/contextapprove/deferauthorized role

Fast feedback بدون تست همه‌چیز روی هر Commit

TriggerSuiteBudgetClaim
local/PR changed componentmicro/component smokeثانیه/دقیقهlocal regression signal
merge/mainAPI paired baselineدقیقهservice comparison
nightlybroader workload matrixده‌ها دقیقهtrend/interaction signal
release candidatesystem/load/endurance sliceساعتbounded release evidence
scheduled capacitystress/scaleپرخرجcapacity model update
canary/runtimesafe observationtraffic/window-boundproduction context signal

Change-based selection باید dependency graph و Risk را ببیند؛ docs-only و low-risk ممکن است Test نداشته باشند، اما applicability صریح لازم است. Scheduled suite نباید تنها محل کشف باشد؛ Result باید به Commit/Artifact و Owner برگردد.

نتیجهٔ Performance در Pipeline چه Outcomeهایی دارد؟

Outcomeمعنااقدام
PASSقواعد روی Evidence قابل‌مقایسه برآورده شدورودی تصمیم بعدی
REGRESSIONقاعده نقض شدdiagnose/fix/decision
REVIEWuncertainty یا اختلاف Runبازبینی/تکرار
INVALIDgenerator/telemetry/evidence خرابRun را استفاده نکنید
NOT_COMPARABLEBaseline/Candidate mismatchrerun/model/exception
NOT_APPLICABLEطبق policy و change scoperationale

Pipeline نباید خودش ادعای «SLO met»، «capacity safe» یا Release approval بسازد. این خروجی‌ها در گزارش وضعیت و تصمیم انتشار با سایر Evidence و Unknownها ترکیب می‌شوند.

آزمایش تکرارپذیر: میانگین ۱۸۰ms کافی است؟

Fixture ساختگی SYN-CONTINUOUS-PERFORMANCE-COMPARABILITY-01 Candidate با average=180ms و errorRate=۰.۵% دارد؛ Gate سطحیِ average<200ms/error<۱% نتیجهٔ `PASS` می‌دهد. ممیزی مستقل Question، Subject، Workload، Generator، Telemetry، Metric، aggregation، Rule و Evidence را بررسی می‌کند.

Fixture معیوب در برابر Contract

بعدContractDraft سبز
Question/ScenarioQ/SCN نسخه‌دارخالی/checkout
BuildB16/B17 immutableB15/B17-latest
Environment/DataENV7/DATA17 برابرENV5↔7/DATA-OLD↔17
WorkloadWL-v4 با arrival/rate/ramp۱۰۰-users و v2↔v4
Statewarmup/cache/retry/connection صریحخالی/unknown/default
GeneratorGEN-v3، ۴۱% CPU، zero droplaptop/latest، ۹۸%، ۴۵۰ drop
Telemetry/MetricTEL-v5/MET-v3/seconds/boundariesv3↔v5/response_time/ms
Aggregationmerge compatible histogramsaverage of p95s
Gate/Evidenceabsolute+relative+tail+uncertainty/rawaverage only/screenshot

خروجی Validator: ۴۴ Finding

fixture: SYN-CONTINUOUS-PERFORMANCE-COMPARABILITY-01
runtime: Node.js v26.7.0
superficial: PASS | avg=180ms | errorRate=0.5%

auditedDraft: HOLD
findings (44):
1 missing-or-wrong-performance-question
2 scenario-not-versioned
3 wrong-baseline-build
4 candidate-build-not-immutable
5 environment-not-versioned
6 baseline-candidate-environment-mismatch
7 dataset-unsafe-or-unversioned
8 baseline-candidate-dataset-mismatch
9 workload-not-versioned
10 baseline-candidate-workload-mismatch
11 arrival-model-missing
12 arrival-rate-missing
13 ramp-profile-missing
14 warmup-policy-missing
15 think-time-model-missing
16 retry-policy-implicit
17 cache-state-unknown
18 connection-reuse-unknown
19 generator-not-versioned
20 generator-version-unpinned
21 generator-saturated
22 generator-dropped-requests
23 telemetry-contract-missing
24 baseline-candidate-telemetry-mismatch
25 metric-semantics-unversioned
26 latency-start-boundary-missing
27 latency-end-boundary-missing
28 duration-unit-not-canonical-seconds
29 error-taxonomy-incomplete
30 business-success-rule-incomplete
31 percentiles-averaged-across-runs
32 resource-saturation-signal-missing
33 minimum-sample-rule-missing
34 tail-latency-rule-missing
35 absolute-budget-rule-missing
36 baseline-regression-rule-missing
37 uncertainty-policy-missing
38 pipeline-self-authorized-performance-claim
39 raw-measurements-missing
40 execution-manifest-missing
41 latency-distribution-evidence-missing
42 screenshot-only-evidence
43 test-result-overclaims-slo-and-capacity
44 incomparability-exception-or-rerun-missing

corrected: READY_FOR_REGRESSION_REVIEW | findings=0

نسخهٔ اصلاحی چه کرد؟

نسخهٔ اصلاحی Q/SCN، B16/B17، ENV7، DATA17، WL-v4، GEN-v3، TEL-v5 و MET-v3 را قفل کرد؛ arrival=۱۰۰ request/s، ramp/warm-up/steady/think/retry/cache/connection را صریح کرد؛ Generator را unsaturated و zero-drop نگه داشت؛ سه Run ۹۰هزار observation برای هر Build با Histogramهای سازگار ساخت؛ p50/p95/p99، error، throughput و saturation را ثبت کرد؛ و absolute/relative/tail/error/uncertainty rule داد.

`READY_FOR_REGRESSION_REVIEW` تنها یعنی Contract ساختاری کامل است. صحت اندازه‌گیری، نمایندگی Workload، استقلال noise، رابطهٔ علّی تغییر، تحقق SLO، Capacity Production، تجربهٔ کاربر، صرفه‌جویی هزینه یا Release readiness را اثبات نمی‌کند. Reviewer باید Raw evidence و limitation را ببیند.

Lab فارسی و آفلاین Performance

Lab یک Checkout کاملاً ساختگی و بدون شبکه است: Order، PaymentAttempt، PSP Stub، Callback، Ledger و Reconciliation. بار فقط روی سرویس‌های محلی با سقف resource و kill switch اجرا می‌شود. هیچ سایت، IP، شرکت، کاربر، پرداخت، بانک، PSP، Production یا سرویس ثالث هدف تست نیست.

کنترلقاعده
IdentityTenant/Order/Attempt/Event/Ledger/Run/Build جدا
MoneyIRR خیالی Canonical؛ تومان فقط View
Digits/RTLفارسی/عربی/لاتین و Unicode/bidi
TimeUTC instant + Asia/Tehran؛ جلالی فقط Presentation
Datasynthetic، deterministic، بدون PII
Networkdeny-all؛ local stub/registry/telemetry
Secretsبدون PAN/CVV2/OTP/cookie/token/credential
Safetyrate ceiling/resource quota/abort trigger
Claimبدون ادعای ظرفیت/بانکی/مالی/حقوقی/Production ایران

Workload ساختگی Checkout

JourneyMixData stateOracle
Create order45%۳ item syntheticunique order/correlation
Start attempt25%IRR amount viewone active attempt
Callback success15%stub committedconfirmed + ledger
Duplicate callback5%same event IDidempotent
Timeout/retry5%before/after fake commitbounded final state
Reconciliation5%late/reordered eventno unexplained delta

Production: مشاهده، آزمایش امن و مرز اخلاقی

APM/RUM/Telemetry دادهٔ traffic واقعی می‌دهند، اما تغییر workload، release mix، network، geography، device و incident confounder دارند. Canary می‌تواند exposure را محدود کند، نه اینکه risk را صفر یا آزمایش را کنترل‌شده کند. Synthetic traffic، load یا failure injection در Production فقط با authorization، blast-radius، abort، privacy، on-call و rollback صریح مجاز است. راهنمای تست Shift-right امن این حوزه را جداگانه مالک است.

Telemetry مشترک Test و Production؛ Semantics یکسان، Context متفاوت

بعدTestProduction
Trafficمدل کنترل‌شدهواقعی و متغیر
BuildCandidate/Baseline pinnedfleet/canary mix
Datasyntheticحساس/واقعی
Metric semanticsMET-v3همان semantic contract مطلوب
Labelsrun/scenario/buildservice/version/region؛ بدون high-cardinality PII
Claimbounded comparisonoperational SLI observation
FeedbackRegression/diagnosisSLO/model/incident/capacity

AI/ML در تحلیل Performance: پیشنهاد، نه Verdict

مدل می‌تواند anomaly candidate، change point، cluster یا correlation پیشنهاد دهد؛ اما Drift، seasonality، multiple comparisons، label leakage و missing telemetry مثبت کاذب می‌سازند. Model/version/features/training window/threshold/output/reviewer را ثبت کنید. AI نباید Raw PII/Secret بگیرد، Cause قطعی بسازد یا Gate/Release را بی‌بررسی تصمیم دهد.

نقش‌ها و حق تصمیم

قابلیتکارمرز
Developerinstrument/change/diagnosis/remediationBaseline را انتخاب گزینشی نکند
Performance specialistmodel/measure/experiment/reviewمالک انحصاری عملکرد نیست
Tester/QAscenario/oracle/evidence/comparabilitySLO/Release authority خودکار نیست
Platform/Opsenvironment/telemetry/resource/runtimeProduction ≠ test oracle قطعی
Product/Service ownerjourney/impact/SLO contextعدد دلخواه بدون measurement contract ندهد
Risk/Release ownerتصمیم boundedRegression evidence را تغییر ندهد

متریک‌های سلامت Capability و Countermetricها

متریکتعریفCountermetric
Comparable run ratecomparable / eligible comparisonsscope narrowing
Invalid run rategenerator/telemetry invalid / runsinvalids hidden as pass
Feedback timetrigger→reviewable evidence distributionskipped depth
Regression closureretested fixed / eligibleforeign-build closure
Model driftworkload/fidelity deltasconstant churn
Tail evidence completenesscompatible distributions / requiredhuge metric cost
Exception debtactive/expired incomparability exceptionsautomatic renewals
Production feedback linkagemodel updates with source / updatesPII/high cardinality

۳۰ ضدالگوی Continuous Performance Testing

  1. سرعت بازار به‌عنوان ضرورت جهانی
  2. تست دیرهنگام همیشه شکست‌خورده
  3. همهٔ Performance tests روی هر Commit
  4. Stage ثابت برای هر سازمان
  5. فهرست ابزار محبوب به‌جای سؤال
  6. ۱۰۰ user بدون arrival model
  7. Environment «دقیقاً Production»
  8. کپی Production بدون مجوز/توزیع
  9. Build/tag mutable
  10. Baseline قدیمی یا انتخاب گزینشی
  11. Workload/Data/Config متفاوت
  12. Generator laptop/latest
  13. Generator saturated و result سبز
  14. Dropped request پنهان
  15. response time بدون boundary
  16. ms/s mismatch
  17. Average تنها
  18. میانگین percentileها
  19. p95 بدون N/Histogram/schema
  20. Error rate بدون مخرج/taxonomy
  21. Fast failure به‌عنوان بهبود latency
  22. Retry پنهان
  23. Warm-up حذف‌شده و گزارش‌نشده
  24. Cache/JIT/state ناشناخته
  25. یک Run بدون uncertainty
  26. Screenshot dashboard به‌عنوان Evidence
  27. Threshold تست برابر SLO
  28. Pipeline برابر Release authority
  29. AI anomaly برابر Cause
  30. Test PASS برابر Capacity/SLO/کیفیت برتر

Pilot سی‌روزهٔ Performance Evidence Ladder

بازهکارExit محدود
روز ۱–۳Question/journey/risk/authorityClaim boundary
روز ۴–۷Scenario/Workload/Dataversioned contracts
روز ۸–۱۱Environment/Generator/Telemetryfidelity/gaps/safety
روز ۱۲–۱۵Metric/Error/Resource semanticsraw evidence schema
روز ۱۶–۲۰Repeated paired B/C runscomparability verdict
روز ۲۱–۲۴Absolute/relative/tail/uncertainty policyfixture-tested rules
روز ۲۵–۲۷CI trigger/report/ownerreviewable feedback
روز ۲۸–۳۰Production signal/model reviewnext gaps، no overclaim

چک‌لیست Audit یک مقایسهٔ Performance

  • Question/type/claim/audience/exclusions صریح‌اند.
  • Scenario/actor/state/steps/success/error/correlation/cleanup نسخه‌دارند.
  • Arrival model/rate/mix/ramp/warm-up/duration/think/retry/timeout ثبت‌اند.
  • Baseline/Candidate Build/Artifact immutable و مربوط‌اند.
  • Environment/topology/resource/config/dependency/data/state همسان یا delta مدل‌شده است.
  • Generator/version/location/capacity/clock/achieved rate/drop معتبر است.
  • Telemetry/instrument/version/metric/unit/start/end/buckets/labels ثابت‌اند.
  • PII/Secret/high-cardinality label وارد telemetry نشده است.
  • Error/business outcome/retry/timeout مخرج روشن دارند.
  • Raw observations، manifest، histograms و resource signals موجودند.
  • Average تنها نیست؛ count/distribution/p50/p95/p99/error گزارش شده است.
  • Percentileها میانگین نشده و Histogram schema سازگار است.
  • Runهای تکراری و variation/uncertainty حفظ شده‌اند.
  • Comparability پیش از Delta ارزیابی شده است.
  • Absolute/relative/tail/error/throughput/resource/uncertainty rules نسخه‌دارند.
  • INVALID/REVIEW/NOT_COMPARABLE به PASS نگاشته نشده‌اند.
  • Exception/Rerun scoped، owned و expiring است.
  • Result از SLO/Capacity/Production/Release/quality claim فراتر نرفته است.

نقشهٔ مطالعهٔ مرتبط

برای انواع و طراحی Load/Stress/Endurance به مقالهٔ جامع ۷۲۷، برای orchestration عمومی CI/CD به Continuous Testing، برای محیط به ۱۷۶۱، برای Production به ۸۴۲، برای تست تاب‌آوری و Recovery به تست تاب‌آوری و برای سیستم‌های آماری/غیرقطعی به Verdict آماری سیستم غیرقطعی مراجعه کنید.

پرسش‌های متداول

آیا باید تست بار را روی هر Commit اجرا کنیم؟

خیر. Trigger باید با Risk، change scope، هزینه و feedback deadline سازگار باشد. Micro/component smoke ممکن است روی PR مناسب باشد؛ paired API comparison روی merge؛ workload matrix شبانه؛ و system/endurance/capacity روی زمان‌بندی یا Release candidate. Applicability و چیزی که اجرا نشده باید صریح بماند.

آیا p95 بهتر از Average است؟

برای دیدن Tail اغلب مفیدتر است، اما جای کل distribution، count، error و Context را نمی‌گیرد. p95 به Population، Window، sample size، bucket resolution و aggregation وابسته است. percentileهای Run/Instance را میانگین نگیرید؛ Histogramهای سازگار و variation هر Run را نگه دارید.

آیا محیط تست باید دقیقاً مثل Production باشد؟

نه همیشه و «دقیقاً» معمولاً قابل‌اثبات نیست. Fidelity را بر اساس Question انتخاب کنید. برای Regression، محیط ثابت و متقارن مهم است؛ برای Capacity، topology/resources؛ برای user latency، network/client/CDN. Gapها را ثبت و Claim را محدود کنید؛ Container/IaC به‌تنهایی equivalence نمی‌سازند.

تفاوت Performance Test Threshold با SLO چیست؟

Test threshold قاعدهٔ یک Run/Build/Scenario آزمایشگاهی است. SLO هدف یک SLI برای service population و time window مشخص، معمولاً در Context عملیاتی است. می‌توان Threshold را از SLO و بودجهٔ معماری مشتق کرد، اما Test PASS به‌تنهایی SLO compliance یا error-budget health را ثابت نمی‌کند.

اگر Baseline و Candidate قابل‌مقایسه نباشند چه کنیم؟

نتیجه را `NOT_COMPARABLE` یا `REVIEW` کنید؛ تفاوت Environment/Data/Workload/Telemetry را مدل کنید یا هر دو Build را در Contract یکسان دوباره اجرا کنید. نسبت‌دادن Delta به کد، میانگین‌گیری یا Exception بی‌انقضا مناسب نیست. اگر mismatch ضروری است، Scope، uncertainty، owner و expiry آن ثبت شود.

جمع‌بندی: بازخورد سریع فقط با مقایسهٔ معتبر ارزش دارد

تست عملکرد در CI/CD وقتی به قابلیت تبدیل می‌شود که هر لایه سؤال و Claim محدود داشته باشد؛ Scenario/Workload/Build/Environment/Data/Generator/Telemetry ثابت و نسخه‌دار باشند؛ duration/error/throughput/resource معنا داشته باشند؛ Histogram و تکرار به جای Average تنها استفاده شود؛ Comparability قبل از Delta کنترل شود؛ و Gate عدم‌قطعیت را به REVIEW/INVALID تبدیل کند. این رویکرد می‌تواند بازخورد Regression را زودتر و قابل‌بازبینی‌تر کند، اما هزینه، SLO، ظرفیت Production، کیفیت یا Release را تضمین نمی‌کند.

دیدگاهتان را بنویسید