【问题标题】:Java/Scala resource consumption and loadJava/Scala 资源消耗和负载
【发布时间】:2011-12-04 11:18:21
【问题描述】:

我正在用 Scala 开发一个 Web 应用程序。它是一个简单的应用程序,它将从客户端(JSON 或 ProtoBufs)获取端口上的数据,并使用数据库服务器进行一些计算,然后使用 JSON / Protobuf 对象回复客户端。

它不是一个非常繁重的应用程序。最多 1000 行代码。它将在每个客户端请求上创建一个线程。现在从收到请求到回复所需的时间在 20 到 40 毫秒之间。

我需要关于我应该使用哪种硬件/设置来处理每秒 3000 多个此类请求的建议。我需要采购硬件放在我的数据中心。

请任何有大规模部署 Java 应用程序经验的人提出建议。我应该使用一个带有 2 - 4 个 Xeon 5500 和 32 GB RAM 的大盒子还是多台较小的机器。

更新 - 我们没有很多客户。其中 3 - 4 个。请求将来自这 3 个。

【问题讨论】:

  • 首先通过不在每个客户端请求上创建线程来优化您的应用程序。使用线程池。然后进行测量和实验。
  • 您可以尝试使用 SoapUI 或类似工具来测量负载。通过这种方式,您可以测试某种类型的机器如何处理您的应用程序所需的负载。
  • 忘了提及更新。现在我正在尝试在线程中使用 HTTP 管道从单个套接字获取多个请求。所以线程数应该减少。
  • 3000 req/sec 是稳定状态吗?另外,您需要提供多少延迟?你还提到你有一个 Redis 服务器 - 它目前可以处理 3000+ req/sec 吗?
  • 是的,如果您将整个数据库都放在内存中,redis 会很舒服。每秒 3000 是高峰时间。晚上会下来。

标签: java scala load scalability protocol-buffers


【解决方案1】:

如果每个请求平均需要 30 毫秒,那么单个内核每秒只能处理 30 个请求。假设您的应用程序线性扩展(您可以预期的最佳方案),那么您将需要至少 100 个内核才能达到 3000 req/s。这比 2-4 Xeon 多。

最糟糕的是,如果您的应用依赖 IO 或 DB(就像大多数有用的应用程序一样),您将获得亚线性缩放,并且您可能需要更多...

所以首先要做的是分析和优化应用程序。以下是一些提示:

  • 创建线程昂贵,尝试创建有限数量的线程并在请求中重用它们(在 java 中参见 ExecutorService 例如)。
  • 如果您的应用是 IO 密集型应用:尽量减少 IO 调用,使用内存中的缓存并尝试使用非阻塞 IO。
  • 如果您的应用依赖于数据库,请考虑缓存并尽可能尝试分布式解决方案。

【讨论】:

  • 是的,它依赖于数据库,但这不应该成为瓶颈,因为它是在附近具有 16 GB RAM 的机器上基于 redis 的 10 GB 键值存储。所以整个数据库都在它的内存中,读取速度很快。
  • 你应该测量它以确保它不是瓶颈......(如果减少线程数,对你来说还不够)
  • 你认为使用云对这样的应用程序有好处吗???或者我们应该使用我们自己的集群。 ??
  • 在优化代码和检查可伸缩性之前无法判断。然后您可以评估您的需求,并将云服务与集群价格进行比较(不要忘记为集群管理和维护定价)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多