用于运行Java Web应用程序的单个服务器的可伸缩性

我希望获得有关部署到单个Tomcat实例的单服务器Java Web应用程序可以处理的工作负载规模的更多信息。 特别是,让我假装我正在开发一个类似维基百科的使用模式的Wiki应用程序。 如果我将服务器部署在具有以下配置的计算机上,我的服务器可以在内存不足之前可以同时处理多少请求,或者显示压力过大的迹象:

  • 4核高端Intel Xeon CPU
  • 8GB RAM
  • RAID-1中的2个HDD(无SSD,无基于PCIe的固态存储)
  • RedHat或Centos Linux(64位)
  • Java 6(64位)
  • MySQL 5.1 / InnoDB

另外,我们假设MySQL DB安装在与Tomcat相同的机器上,并且所有Wiki数据都存储在DB中。 此外,让我们假装Java应用程序构建在以下堆栈之上:

  • SpringMVC为前端
  • Hibernate / JPA用于持久化
  • DI和安全等的spring

如果你没有使用确切的配置,但有评估类似架构的可扩展性的经验,我也会非常有兴趣听到这个。

提前致谢。

编辑 :我想我没有正确地表达我的问题。 我用最多的选票标记答案作为最佳答案,我将在社区维基区域重写我的问题。 简而言之,我只想了解您在Java应用程序能够在一台物理服务器上处理的工作负载规模的经验,以及有关应用程序本身的类型和体系结构的一些描述。

您将需要使用一组工具:

  1. 负载测试工具 – 可以使用JMeter。
  2. 监视工具 – 此工具将用于监视各种数量的资源负载。 有批量付费和免费付款。 Jprofiler,visualvm等
  3. 收集和报告工具。 (未使用任何工具)

使用上述工具,您可以找到最佳价值。 我会按照以下方式接近它。

  1. 将了解应该访问的页面的比例。 什么是后台进程及其频率。
  2. 相应地配置我的JMeter(对于比率),并监控所应用的负载的性能(服务页面的时间……可以在JMeter中完成),使用Monitor工具监控其他资源。 还要检查错误率的计数。 (注意:您需要确定哪些错误率是不可接受的。)
  3. 继续增加负载一步一步,并保持写入各种感兴趣的数据,直到服务器完全失败。

您可以根据许多标准,低错误率,最长服务时间等来确定最佳值.JMeter支持许多应用负载的方法。

说实话,这几乎是不可能的。 可能有大约3种方法(构建这样一个系统的最重要的方法),每种方式都有相当不同的性能特征。 你最好的选择是建立和测试。

首先尝试了解您将拥有的估计数量以及您需要满足的延迟限制。

提出一个基本架构,并通过系统端到端实现一个薄片(理想情况下是最常见的用例)。 使用负载测试工具(如Grinder或Apache JMeter )来注入负载并开始测量性能。 如果性能可以接受 – 保守,您的简单实现可能包括更少的function并且比整个系统更快 – 继续构建系统并进行测试以确保不会引入主要的性能瓶颈。 如果没有想出不同的设计。

如果您的代码是合理的,那么瓶颈很可能是数据库以及每秒db操作数100s的区域。 如果这还不够,那么您可能需要考虑缓存。

绝对要看一下Spring Insight的性能监控和分析。

英语维基百科有14GB的数据。 一个8GB的内存缓存会有非常高的命中/未命中率,我认为硬盘读取将在其容量范围内。 因此,应用程序很可能是网络绑定的。

英语维基百科每秒有大约3000页的页面浏览量。 tomcat可以通过仔细调整来处理负载,并且网络具有足够的吞吐量来为流量提供服务。

那么整个维基百科网站可以托管在一台中等机器上吗? 可能不是。 只是一个想法。

http://stats.wikimedia.org/EN/TablesWikipediaEN.htm

http://stats.wikimedia.org/EN/TablesPageViewsMonthly.htm

Tomcat不允许在多台机器上传播。 如果您真的关心可伸缩性,那么当您的应用程序超出单个计算机时,您必须考虑要做什么。