设计规模化服务。所需服务器数量

Designing a service for scale. Number of servers needed

假设我需要设计一个网络服务。为了简单起见,假设我使用 LAMP (Linux-Apache-MySQL-PHP).

我知道我每秒将正好处理 N 个用户请求。请求基本都是对数据库的简单CRUD操作,没有文件上传,也没有复杂的计算。

假设每个请求执行 M 毫秒并在我的服务器上占用 K Mb 内存,有 G Gb RAM。

我需要多少台这样的服务器?只是 N * K / G 吗?

M 的合理值是 200msK 的合理值是多少?

我们需要在这个问题中考虑 CPU 功率吗?

还有其他注意事项吗?

您所做的是粗略估计,但绝不应将您的思维练习用作扩展服务的权威指南。

那是因为没有服务会像您描述的那样表现出那种类型的恒定行为(如果在不可预测的外围设备 i/o、垃圾收集、外部因素、用户输入等上,则归咎于此)

正确的方法是执行规模和负载测试。编写服务后,开始对服务进行负载测试并记录服务的性能特征。如果你做对了,你应该达到配置最大化的程度:CPU、网络吞吐量、内存或磁盘 I/O。如果两者都没有达到上限并且您达到了限制那么它就是您的上游依赖项之一(您的数据库等)

一旦达到峰值,它会告诉您在峰值时每秒可以处理多少请求。

您还会注意到,在大多数情况下,峰值性能是不可持续的:您的设置可能会在短时间内突然爆发,每秒处理的请求比在持续负载下处理的请求多得多。

获得单个服务器的编号后,您可以开始以两种方式变化:

  1. 使用不同的硬件配置进行测试(如果内存受限,请添加更多 RAM,如果内存受限,请添加更好的 CPU,等等)

  2. 多台服务器测试;开始添加服务器并查看您的服务如何横向扩展

理想情况下,您的服务应在添加服务器时线性扩展,但您可能会发现性能曲线不是线性的。

得到你的数字,调整你的设计。冲洗。重复。

没有替代品,神奇的公式。