Determining the Universal Scalability Law's coefficient of performance

If you’re familiar with Neil Gunther’s Universal Scalability Law, you may have heard it said that there are two coefficients, variously called alpha and beta or sigma and kappa. There are actually three coefficients, though. See?

\[ C(N) = \frac{N}{1 + \sigma(N-1) + \kappa N (N-1)} \]

No, you don’t see it – but it’s actually there, as a hidden 1 multiplied by N in the numerator on the right-hand side. When you’re using the USL to model a system’s scalability, you need to use the C(1), the “capacity at one,” as a multiplier. I call this the coefficient of performance. It’s rarely 1; it’s usually thousands.

To illustrate why this matters, consider two systems’ throughput as load increases:

coefficient of performance

The green line and the blue line are both linearly scalable systems. Add twice the concurrency, get twice the throughput. But the slope of the lines is different. The blue system can do twice as much work as the green system, even though it’s no more scalable.

To model the USL, you need to determine C(1) by measuring the system under test. In my experience with real systems running in production, mostly MySQL servers, this is not simple. You can’t just say “let’s quiet the web app down, I want to load it with exactly one user for a few minutes and measure how fast it runs.” Instead, you get a bunch of samples from production traffic, and you derive the throughput at concurrency=1 from that.

The result goes into the numerator as a multiplier of N, although it’s usually omitted when the USL formula is shown.

If you’re interested in learning more, I wrote an ebook about the Universal Scalability Law.

See Also

I'm Baron Schwartz, the founder and CEO of VividCortex. I am the author of High Performance MySQL and lots of open-source software for performance analysis, monitoring, and system administration. I contribute to various database communities such as Oracle, PostgreSQL, Redis and MongoDB. More about me.