1. Mental Model: Where Time Goes
Every request a client makes crosses several layers, and load testing is really about finding which layer breaks first as concurrency rises. Draw this stack mentally before touching a tool:
Client Server
|--DNS lookup-------------------------------------------------|
|--TCP handshake (SYN, SYN-ACK, ACK)---------------------------|
|--TLS handshake (ClientHello...Finished)----------------------|
|--Request sent (serialize + write to socket)-------------------|
| [network transit: propagation + queueing delay] |
| [server accept()]|
| [thread/goroutine pickup]|
| [business logic + I/O]|
| [DB / cache / RPC] |
| [serialize response] |
| [network transit back] |
|--Response read + deserialize----------------------------------|
A load test result of "p99 = 800ms" is meaningless until you know which segment dominates. The rest of this guide gives you the vocabulary and tools to decompose that number.