如何确定所需的核心数和内存大小?

4
我有一个Spring应用程序,正在Apache Tomcat 7上运行,并提供完全的REST服务。我大约有100万人会在全球范围内使用它。我的问题是:是否有标准的方法来计算所需的处理器数量和RAM(内存)容量。虽然我有很多资源可供使用,但我想明智地订购产品。我真的很期待能够有一个公式或其他东西,可以帮助我进行这样的估计,请指导我。
或者请指出各种限制条件,以便建立和运行此基础架构。我希望您指出以下要求:
1.具有Apache运行的Web服务器 2.Tomcat运行的应用服务器 3.运行Redis,Postgres和MongoDB的数据库服务器
非常感谢。

你预计会有多少并发用户?你对每个会话的内存需求进行了分析吗? - Thomas
@Thomas 我可能会有大约5000-10000个并发用户。每个会话的内存需求...不,我没有记录那个 :( - Shiv Kumar Ganesh
@Thomas 我稍微修改了问题。希望这对我的情况有所帮助。你能列出几个让我开始的吗 :) .. 谢谢 - Shiv Kumar Ganesh
1
没有一种通用的公式可以用来计算需求。这完全取决于您特定应用程序的细节,只有您自己知道。这里没有人拥有足够的信息来给出答案,描述如何收集这些信息是性能分析完整书籍的主题。如果您想要一个答案,您将不得不进行自己的研究和分析,以确定您的应用程序的需求,并确定预期的并发性,包括平均值和峰值(非常不同的事情)。 - Jim Garrison
1个回答

5
我会尝试列出一些我能想到的限制,但可能还有更多:
在运行Apache的Web服务器上,请查看使用的文件句柄数量(如果Apache提供静态内容,如CSS、JavaScript或图像)。
此外,HTTP连接的数量可能是一个限制(通常每个并发用户一个)。
另一个限制可能是将请求传递给Tomcat的ajp工作线程的数量。
内存约束要求可能不那么巨大,但这取决于您的Apache所做的工作。
在运行Tomcat的应用服务器上,会话大小将是一个限制。请注意,根据会话超时时间,同时进行的会话数可能比同时进行的用户数高得多(并非所有用户都需要进行并发请求,但会话仍需要内存)。
此外,可用于服务执行的线程数量也将是一个限制。您的服务响应越快,被阻塞的线程就越少,因此需要的线程也就越少。
在运行Redis、Postgres和MongoDB的数据库服务器上也是如此。

针对数据库至少有两个限制:连接数(每个请求至少需要一个数据库连接)和查询缓存的内存(内存越多,可以缓存更多的查询结果,使响应更快)。

总体

对于预计有 5000 - 10000 个并发用户的系统,您可能需要考虑集群和负载均衡。这将允许您根据需求进行调整(如果您的资源被用完,您可以添加另一个节点;如果大多数资源从未被使用,您可以删除节点),并且会有更高的可靠性(如果一个节点失效,系统可能会变慢,但仍然可以运行)。

为了分析您的系统,您可能需要模拟一些并发访问,并监视关键参数(文件句柄、内存使用、线程使用、数据库连接、HTTP 连接等)。从少量的用户(例如 10)开始,然后逐步增加(例如到 100,再到 1000 等)。当访问时间低于某个(自定义的)限制时,找到瓶颈,提供更多的资源,然后再试一次。最终,您将发现一些趋势(例如每 500 个用户累积会话大小为 1GB),这将允许您粗略估算更高数量的并发用户。

如果要模拟并发用户,请查看 Apache JMeter


太好了,@Thomas :) 我喜欢你说的话。我会尽力添加更多内容,以便我可以计划一个强大的系统。非常感谢 :) - Shiv Kumar Ganesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接