Government · Elections

Three million hits in one night, on infrastructure we run.

Public election information for Anderson County, Tennessee. Quiet for eleven months, then a few hours carrying more traffic than the rest of the year — on a night when being unreachable is not a performance problem, it is a public trust problem. We have run it since 2012, across 23 election cycles, without losing a night.

25–30k
Visitors on an election night
2.5–3.5M
Hits across the same night
~100
Requests per visitor — people refresh
23
Election cycles since 2012

The traffic shape

Eleven quiet months, then four hours.

This is the whole engineering problem in one picture. Nobody schedules an election night’s curiosity, so the capacity has to be there before anyone asks for it.

Hourly hit volume across an election day Volume stays near 20,000 to 85,000 hits per hour through the day, rises sharply after polls close at 8pm, peaks around 640,000 hits in the 9pm hour, then falls away by 1am. Full figures are in the table below.0200k400k600k~640k hits9pm — results posting6a — 20,000 hits7a — 35,000 hits8a — 45,000 hits9a — 50,000 hits10a — 55,000 hits11a — 55,000 hits12p — 60,000 hits1p — 60,000 hits2p — 65,000 hits3p — 70,000 hits4p — 85,000 hits5p — 120,000 hits6p — 180,000 hits7p — 260,000 hits8p — 520,000 hits9p — 640,000 hits10p — 430,000 hits11p — 200,000 hits12a — 90,000 hits1a — 40,000 hits6a9a12p3p6p9p12a1a
Totals are actual; the hourly curve illustrates the shape. Visitor and hit totals are measured. The hour-by-hour distribution is a characterization of a typical election night — polls close at 8pm Eastern and results post through the evening — scaled to sum to 3,080,000 hits, inside the measured range. It is not an analytics export.
View the figures as a table
Illustrative hourly hit volume, election day
HourHits
6a20,000
7a35,000
8a45,000
9a50,000
10a55,000
11a55,000
12p60,000
1p60,000
2p65,000
3p70,000
4p85,000
5p120,000
6p180,000
7p260,000
8p520,000
9p640,000
10p430,000
11p200,000
12a90,000
1a40,000
Total3,080,000

Why roughly a hundred requests per visitor is the interesting number

Divide the hits by the visitors and you get roughly a hundred requests each. That is not a hundred images on a page — it is people reloading. Somebody watching a close race refreshes the same results page every minute or two for an hour, and every one of those reloads is a request somebody has to answer.

Which is exactly why caching is the lever rather than a bigger server. If the results page is generated once and then served from cache to everyone who asks in the next sixty seconds, that hundred requests costs almost nothing. If it is regenerated from the database each time, the same night takes the site down.

The failure mode is not lost revenue

A store that is briefly slow loses a sale, which is measurable and recoverable. Public election information that cannot be reached on election night produces a different problem: people conclude something is being withheld. The stakes are reputational and civic, not commercial, and they do not get a second attempt.

That is the reason for the change freeze, the load test, and having somebody actually watching. Not because the technology demands it, but because the consequences of getting it wrong are not the kind you can apologize for afterwards.

Most of this is not about elections

The same shape shows up in Smoky Mountains tourism — a holiday weekend behaves remarkably like a results night — and in any ticket release, seasonal booking window, or product launch. We wrote the general version up in keeping an election site up on election night.

The IT side

What running it actually involves.

We host it, and have since 2012

Not a site we built and handed to somebody else’s server. For fourteen years we have run the infrastructure, which means capacity for the night is our decision to get right rather than a request we file with a vendor.

Caching does the heavy lifting

Every anonymous visitor asking for the same results page is answered from cache rather than by regenerating it. Short TTLs so returns still update, stale-while-revalidate so nobody waits on a regeneration, and cache-key discipline so a stray query string cannot fragment it.

Capacity added before, not during

Scaled out horizontally ahead of the night, with health checks that test a real page rather than an open port. Provisioning under load is how a bad night becomes a worse one.

Change freeze and load testing

No deployments the week of. Realistic traffic generated against the real pages beforehand, so the ceiling is found while there is still time to raise it.

Someone watching, live

Monitoring that pages a person, running on Pingura — the monitoring platform we build and sell. On these nights the difference between a two-minute problem and a two-hour one is whether anybody was looking.

Backups, patching, certificates

The unglamorous year-round work. A TLS certificate expiring in October is a preventable November outage, and it is tracked rather than remembered.

Start here

Got a date on the calendar that has to hold?

Election night, a ticket release, a seasonal peak. We would rather plan it months out than hear about it the week of.