Glossary · J

Jitter

Variation in latency between packets or requests, and the deliberate randomization of retry and schedule timing.

By Obseria Editorial TeamUpdated

Definition

Jitter has two related meanings. In networking, jitter is the variation in delay between packets or requests, also called packet delay variation, which matters for real-time traffic such as voice and video. In distributed systems, jitter is deliberate randomness added to retry backoff or schedules so that many clients do not act at the same moment.

What jitter is

Jitter describes irregular timing. The word is used in two ways that engineers meet regularly, and they are worth keeping apart:

  • Network jitter is unwanted variation in latency. If packets arrive after 20 ms, 22 ms, 61 ms and 19 ms, the average looks fine but the spread disrupts real-time traffic.
  • Jitter in backoff and scheduling is wanted randomness. You add it on purpose so that retries, cron jobs or cache refreshes from many clients do not all happen at exactly the same time.

Both share the same idea: timing that varies around an expected value. One is a symptom to measure, the other a technique to apply.

Jitter in networks

In networking, jitter is formally called packet delay variation. IETF RFC 3393 defines IP packet delay variation as the difference in one-way delay between selected packets, and RTP (RFC 3550) specifies a smoothed interarrival jitter estimate that receivers report to senders. Typical causes are queueing in congested routers and switches, route changes, Wi-Fi retransmissions, competing bulk transfers and CPU contention on virtualized hosts.

Jitter matters most for real-time applications. Voice and video receivers use a jitter buffer that holds packets briefly to play them back evenly; when jitter exceeds the buffer, packets arrive too late and audio breaks up. For voice, a figure of around 30 ms is a widely cited guideline, but vendors and codecs differ. For request/response APIs, high jitter shows up as a wide gap between median and tail percentiles.

How to measure jitter

MethodWhat it shows
Mean absolute difference of consecutive delaysPacket-to-packet variation, close to the RTP definition
Standard deviation of latencyOverall spread around the mean
Gap between p50 and p99 latencyHow much worse the tail is than the typical case
Tools such as ping, mtr or iperf3 in UDP modeAd-hoc measurement along a path

Measure continuously from fixed vantage points rather than once during an incident, so you know what normal variation looks like.

Jitter in retries: exponential backoff

When a dependency fails, clients retry. With plain exponential backoff, every client that failed at the same moment waits 1 s, 2 s, 4 s and so on in lockstep, and each retry wave hits the recovering service at once. Adding jitter spreads those waves out. Marc Brooker's widely referenced AWS Architecture Blog article "Exponential Backoff And Jitter" compares variants:

  • Full jitter: sleep = random(0, min(cap, base * 2^attempt))
  • Equal jitter: half the backoff fixed, half random.
  • Decorrelated jitter: sleep = min(cap, random(base, previous_sleep * 3))

In his simulations, full and decorrelated jitter reduced total work and completion time markedly compared with no jitter. A simple implementation:

import random, time

def retry(call, attempts=5, base=0.1, cap=5.0):
    for attempt in range(attempts):
        try:
            return call()
        except TransientError:
            if attempt == attempts - 1:
                raise
            time.sleep(random.uniform(0, min(cap, base * 2 ** attempt)))

Combine this with a retry budget and a circuit breaker, so retries stop entirely when a dependency is clearly down, and honor server hints such as HTTP Retry-After from rate limiting.

Jitter in schedules

The same thundering-herd problem appears with schedules. If thousands of hosts run a cron job at minute 0, or every cache entry expires exactly one hour after a deploy, load spikes at that moment. Common remedies are a random splay before the job starts (systemd timers offer RandomizedDelaySec), randomized cache TTLs such as 60 minutes plus or minus 10%, and spreading polling clients across the interval. Prometheus applies the same idea to scraping by offsetting each target within the scrape interval. Jitter here does not change how much work is done, only when it happens, which is often enough to flatten a dangerous peak into a manageable plateau.

Common mistakes

Teams often monitor only average latency and miss jitter completely, retry without any randomness, or seed every client's random generator identically so the "jitter" is the same everywhere. Another mistake is treating all jitter as network jitter when the real cause is garbage collection pauses or CPU throttling on the host.

How Obseria helps

Obseria keeps full latency distributions from traces and metrics, so the spread between p50 and p99 is visible over time instead of hidden in averages. Network monitoring adds visibility into the network path, and synthetic checks from 50+ locations provide a stable outside-in reference for how response times vary by region.

Frequently asked questions

It depends on the application. For voice over IP, around 30 ms is a commonly cited guideline, though vendors and codecs differ. For APIs, judge jitter by its effect on tail latency and SLOs rather than by a fixed number.

Latency is how long a packet or request takes. Jitter is how much that time varies from one packet or request to the next. A link can have low average latency and still high jitter.

Without jitter, clients that failed together retry together, creating synchronized load spikes that can prevent a service from recovering. Random jitter spreads retries over time, reducing peak load and total work.

Full jitter is simple and performs well in most cases: wait a random time between zero and the capped exponential backoff. Decorrelated jitter is a good alternative. Always add a cap, a retry limit and respect for Retry-After headers.

Put these concepts into practice

Try Obseria free for 14 days, with OpenTelemetry and no proprietary agents.