Performance Engineering and System Design Handbook
Appendix A — Symbols, Units, and Magnitudes
Use the handbook's house notation for time, bytes, rates, concurrency, latency distributions, capacity laws, and dimensional checks.
This appendix is the handbook’s quantitative interface. Use it when writing an estimate, reviewing an equation, labeling a chart, or comparing measurements. The job is not to make notation impressive. It is to make boundaries, dimensions, populations, and conversions difficult to lose.
House policy
- Write a number with a unit:
12 ms,40 MB/s,2.4 CPU-ms/request. - Use SI decimal prefixes for rates and network quantities unless a cited interface explicitly defines otherwise.
- Use
Bfor byte andbfor bit.MB/sandMb/sdiffer by a factor of eight before prefix conversion. - Use
kB,MB,GB, andTBfor powers of 1,000 bytes; useKiB,MiB,GiB, andTiBfor powers of 1,024 bytes. - Put a space between value and unit in prose and tables. Treat
%as the conventional exception. - Name the population and boundary for rates and distributions.
p99 = 80 msis incomplete without operation, outcome, interval, and measurement boundary. - Preserve source-unit precision during calculation; round only the presented decision value.
- Never convert a dimensionless ratio into a duration, rate, or capacity without another dimensional term.
Case matters. m is the SI prefix milli; M is mega. ms is millisecond; Ms is megasecond. In this book, spell out ambiguous quantities when typography or tooling can erase case.
Decimal and binary prefixes
| Prefix | Symbol | Factor | Byte example |
|---|---|---|---|
| kilo | k | 10^3 |
1 kB = 1,000 B |
| mega | M | 10^6 |
1 MB = 1,000,000 B |
| giga | G | 10^9 |
1 GB = 1,000,000,000 B |
| tera | T | 10^12 |
1 TB = 1,000,000,000,000 B |
| kibi | Ki | 2^10 |
1 KiB = 1,024 B |
| mebi | Mi | 2^20 |
1 MiB = 1,048,576 B |
| gibi | Gi | 2^30 |
1 GiB = 1,073,741,824 B |
| tebi | Ti | 2^40 |
1 TiB = 1,099,511,627,776 B |
1 MiB / 1 MB = 1.048576. Do not label 1,048,576 bytes “1 MB” in a memory calculation and then compare it directly with a decimal storage or network figure. State the conversion.
A link advertised as 10 Gb/s carries a nominal raw bit rate of 10 × 10^9 b/s. Dividing by 8 b/B gives 1.25 × 10^9 B/s = 1.25 GB/s before protocol overhead, framing, retransmission, contention, and implementation limits. It is not 10 GB/s and it is not a measured application goodput claim.
Time units
| Unit | Symbol | Seconds | Common use |
|---|---|---|---|
| nanosecond | ns | 10^-9 s |
instruction and local-memory-scale mechanisms |
| microsecond | μs | 10^-6 s |
short runtime, device, and network operations |
| millisecond | ms | 10^-3 s |
request, queue, storage, and network latency |
| second | s | 1 s |
rates, deadlines, recovery intervals |
| minute | min | 60 s |
rollouts and short operational windows |
| hour | h | 3,600 s |
capacity and incident windows |
| day | d | 86,400 s |
retention and demand planning |
Use μs in typeset prose and us only where source code or tooling cannot represent μ. Convert before adding: 800 μs + 2.4 ms = 0.8 ms + 2.4 ms = 3.2 ms. A timestamp is not a duration; subtract timestamps under an explicit clock and time-base policy before assigning a duration unit.
Core symbols
Symbols are local contracts. Define them again when a chapter changes meaning or population.
| Symbol | Meaning | Typical unit |
|---|---|---|
λ |
arrival rate offered to a boundary | requests/s |
λ_a |
admitted arrival rate | requests/s |
X |
throughput: completed work rate under the stated outcome definition | operations/s |
G |
goodput: correct, useful completion rate | correct results/s |
L |
average number of units in a defined system or queue | requests (count) |
W |
average time a unit spends in that same boundary | s/request, usually written s |
S |
service time per visit | s/visit |
D_r |
service demand on resource r per useful unit |
resource-s/result, B/result, I/O/result |
C |
concurrency: in-flight units within a boundary | requests (count) |
m |
number of equivalent servers or parallel slots | count |
U_r |
utilization of resource r over an interval |
dimensionless, often % |
Q |
queue depth excluding active service unless stated | requests (count) |
A |
amplification factor, output work divided by useful input work | dimensionless |
Concurrency is a count, not a rate. Throughput is a rate, not a count. Service time is active work at a resource; response time can include queueing, coordination, and downstream waits. Utilization is scoped to a resource and interval; fleet-average utilization does not describe the busiest core, shard, or quota.
For a stable single resource with compatible units, a useful demand estimate is:
U_r ≈ X × D_r
If X = 2,000 result/s and D_CPU = 2.5 CPU-ms/result, then:
2,000 result/s × 0.0025 CPU-s/result = 5 CPU-s/s
The demand is approximately five fully busy cores before headroom and imbalance. Writing 5 CPU-s/s during the audit shows why the result becomes a core-equivalent count.
Throughput and goodput
Use throughput X only after defining what completion means. Use goodput G when useful correctness must be distinguished from attempts or nominal completions.
attempt rate = first attempts + retry attempts + hedged attempts
G = correct terminal outcomes / interval
retry amplification A_retry = total attempts / first attempts
An API can report X = 1,200 responses/s while G = 900 correct results/s if errors, stale results, duplicates, or invalid partial responses are counted as completions. For storage, distinguish logical accepted bytes/s, durable useful bytes/s, physical device bytes/s, and replicated network bytes/s.
Latency distributions
Let T be a random variable for a precisely defined latency population. Write:
F_T(t) = P(T ≤ t)for its cumulative distribution;q_p(T) = inf{t : F_T(t) ≥ p}for quantilep;p50,p95,p99, andp99.9as readable quantile labels when the population is already clear;E[T]for the expectation, not “the p50 average.”
Attach operation, outcome, boundary, interval, and state: “successful admitted search, edge acceptance to final byte, p99 over five minutes, release R17, Zone A nominal.” Do not average host percentiles to obtain a fleet percentile. Merge raw observations or merge a distribution data structure with known aggregation semantics. Quantiles do not add: the p99 of A + B is not generally p99(A) + p99(B), especially when paths overlap or are correlated.
Formula cards and validity limits
Little’s Law
For a stable system over a compatible observation period:
L = λW
The same boundary must define L, λ, and W. If λ = 3,000 request/s and allowed average queue time is W = 0.2 s, then L = 600 requests. This is an average relationship, not a tail guarantee or a proof that 600 queued requests fit memory.
Bandwidth-delay product
BDP = bandwidth × round-trip time
At 10 Gb/s and 20 ms:
10 × 10^9 b/s × 0.020 s = 200 × 10^6 b = 25 MB
About 25 MB must be in flight to fill that idealized path. Protocol windows, loss, congestion control, directionality, application behavior, and overhead limit transfer.
Speedup
For fraction P of original elapsed time improved by factor s, the Amdahl-style bound is:
speedup = 1 / ((1 - P) + P/s)
If 30% of elapsed time becomes twice as fast, the bound is 1 / (0.70 + 0.15) ≈ 1.176, or about 17.6% overall speedup under the stated decomposition. The formula does not include queue migration, changed load, parallel overhead, correctness risk, or a new bottleneck.
Amplification
A_read = physical or downstream reads / useful logical reads
A_write = physical bytes written / durable logical bytes
A_space = physical retained bytes / logical retained bytes
A_net = network bytes / useful payload bytes
A_retry = attempts / first attempts
The numerator and denominator must share an interval and workload boundary. An amplification below one can be valid for compression or deduplication if the quantities are named accurately; it is not automatically an error.
Dimensional-analysis audits
Retention
Mercury’s modeled write payload is:
1,800 request/s × 0.14 write/request × 2,400 B/write × 86,400 s/day × 30 day
= 1.568 × 10^12 B ≈ 1.568 TB
Requests, writes, seconds, and days cancel. The result excludes indexes, replication, metadata, compaction, compression, deletion lag, and growth. Apply each as a named factor or separate term rather than hiding them in “headroom.”
Queue-age bound
3,000 request/s × 0.200 s = 600 requests
If someone instead multiplies by 200 ms without converting, the numeric result 600,000 carries request·ms/s, exposing the error. Units are executable skepticism.
Worker capacity
Forty-eight equivalent workers with 12 ms/job mean:
48 worker × 1,000 ms/s ÷ 12 worker-ms/job = 4,000 job/s
This is a modeled service bound. It assumes independent equivalent workers, adequate upstream/downstream capacity, a representative service-time population, and no coordination or scheduling loss.
Magnitudes without false constants
An order of magnitude is a scale used to reject impossible models, not a timeless latency table. Hardware, topology, runtime, payload, power state, concurrency, and software version can move a measurement substantially. Write 10^-3 s to compare millisecond-scale work with 10^-6 s microsecond-scale work; do not claim a named storage or network operation always takes either value.
For external magnitudes, record date, environment, version, operation, payload, access pattern, concurrency, distribution, and evidence type. Appendix D owns maintained measured ranges. This appendix owns only the unit language used to express them.
Field check
Before accepting a quantitative claim, ask:
- Are value, unit, population, boundary, interval, and operating state named?
- Are decimal bytes, binary bytes, bits, and bytes distinguished?
- Do numerator and denominator describe compatible work?
- Do dimensions cancel to the claimed result?
- Is the statistic a mean, quantile, rate, count, or ratio—and is it labeled correctly?
- Are throughput and correct goodput separated when failures or retries matter?
- Are formula conditions and transfer limits stated?
- Can the arithmetic be reproduced without reading intent into an unlabeled number?
If any answer is no, repair the quantitative interface before debating the architecture.
Once the interface is sound, the next risk is inferential: a correctly labeled sample can still misrepresent its population. Use the probability and statistics reference to choose a summary, uncertainty method, and comparison that preserve the sampling structure behind the numbers.
Sources and evidence scope
- BIPM, The International System of Units (SI Brochure), 9th edition is authoritative for SI units, symbols, prefixes, and writing conventions. The handbook’s application to software populations is an editorial policy layered on SI.
- NIST SP 330, The International System of Units (SI) is the United States edition of the SI Brochure and supports the decimal unit conventions used here.
- NIST, “Prefixes for binary multiples” records the IEC-defined
Ki,Mi,Gi, and related binary prefixes and their factors. Storage devices, operating systems, APIs, and user interfaces may report units inconsistently, so inspect the actual interface. - John D. C. Little, “A Proof for the Queuing Formula: L = λW” establishes the queueing relationship and its conditions. This appendix uses it as a scoped average law, not a percentile bound.
- The Mercury conversions and examples are modeled teaching calculations. Run
examples/performance-engineering-system-design-handbook/part-01/design-loop-and-units/verify.mjsfor arithmetic consistency; the verifier supplies no empirical hardware or production evidence.
Continue reading
Full table of contents