我目前有一个 AWS EC2 实例,m5.24xlarge
它具有:
- 96 个虚拟 CPU
- 384 内存
- 25 英镑网络
我们目前预计在线并发用户将超过 50,000 名,我在 cloudflare 上添加了一个层,但问题是我一直使用server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting
apache error_log
。
为了处理这种流量,apache 的最佳设置是什么?
答案1
恐怕你做错了。你应该运行一个大型实例,而不是运行一个大型实例运行一组较小的实例负载均衡器后面。例如替换m5.24xlarge
为24 x m5.xlarge
,理想情况下自动伸缩组和竞价实例以节省成本。
部分原因如下:
如果您的大实例发生故障或需要维护,您的整个网站都会瘫痪。如果其中一个小实例发生同样的情况,您只会损失 1/24 的容量。
当流量发生变化时,您可以添加或删除容量,例如在周末或夜间需求较少时自动关闭某些实例。为您节省资金。
您可以自动恢复失败的实例,可以使用现货实例来节省更多资金等等。
话虽如此,你可能需要稍微重新设计一下你的应用程序。例如,如果数据库当前正在同一实例上运行,您必须将其移动到AWS Aurora以便所有实例都可以使用它。
同样适用于文件系统- 如果你的应用在本地存储用户数据,你可能需要引入共享文件系统,例如AWS EFS - 弹性文件系统。
虽然需要做一些工作,但水平扩展带来的巨大好处(添加更多较小的工人来完成工作)与垂直方向(使单个工人越来越大)。
希望有帮助:)
答案2
事实上,在非常大的 Web 服务器实例上进行扩展是可能的。
正如 httpd 的警告所暗示的,您需要调整 MPM。首先选择一个 MPM。event 很好而且性能很好,但根据您的模块,您可能需要 prefork。
MaxRequestWorkers
以前称为 MaxClient。根据内存允许的程度尽可能增加此值。以简单的程序为例如何计算apache中的MaxClient值? 假设可以使用 350 GB 内存,其余用于操作系统和其他开销。除以 中的每个进程 RSS top
。假设它是 50 MB,结果将超过 7000。这是您对 的第一个猜测MaxRequestWorkers
。 ServerLimit
也需要大于此,请尝试 10000。
观察负载下的用户响应时间以了解其表现。 50,000 个并发用户可能不需要那么多工作人员来继续处理请求,但它根据应用程序的不同而有很大差异。
在密切关注事态的同时,规划下一次调整实验。也许增加ThreadsPerChild
将允许更少的进程数,从而减少相应的内存使用量。
50k 超过了更多操作系统上的默认临时端口范围。如果您的所有流量都来自同一个负载均衡器 IP 和端口,请寻找绕过该问题的方法。