Capacity planning for Erlang systems

This might be an open-ended question, but I’m interested in your approach to capacity planning for Erlang systems. (RAM, CPU, disk)

I’m particularly interested in this from the perspective of enabling users (of your Erlang system) to have an active role.
Users will, of course, know that capacity planning is essentially reasoning about resource usage as a function of load (input).

This will lead to the question of a “formula” that can be extrapolated. If I know what 1 TCP client will consume in resources, I understand what 100k clients will.

I prefer actual measurements to just giving receipts that might not even be usefully accurate. Something that:

  • Encourages small scale testing and drawing conclusions from that.
  • Allows non-Erlang users (end-users) to run those tests/measurements efficiently.
  • Enables reasoning about resource usage in your system, in general. (this also serves as an excellent preparation, in case we see production issues)
  • Makes clear where adapting any OS/BEAM/app configuration will be needed.
  • Helps avoid under-provisioning of capacity

What practice has proven to be good enough for you? What approach is practical for your end-users?