Multithreading 硬件对异步JVM服务器性能的重要性

Multithreading 硬件对异步JVM服务器性能的重要性,multithreading,concurrency,jvm,hardware,finagle,Multithreading,Concurrency,Jvm,Hardware,Finagle,我正在运行一个Finatra服务器(),它是基于Finagle(一个异步RPC系统)之上构建的、受sinatra启发的scala web框架。 应用程序的设计应该能够同时接收10到50个请求。每个请求都相当占用CPU,主要是由于解析和序列化大型JSON以及对数组的操作,如排序、分组等 现在我想知道以下参数对性能有什么影响,以及如何将它们结合起来: 服务器的RAM 服务器的核心数 JVM堆大小 未来池中并行运行的线程数 作为部分回应,我想说: JVM堆化应该根据RAM进行调整 拥有多个内核可

我正在运行一个Finatra服务器(),它是基于Finagle(一个异步RPC系统)之上构建的、受sinatra启发的scala web框架。 应用程序的设计应该能够同时接收10到50个请求。每个请求都相当占用CPU,主要是由于解析和序列化大型JSON以及对数组的操作,如排序、分组等

现在我想知道以下参数对性能有什么影响,以及如何将它们结合起来:

  • 服务器的RAM
  • 服务器的核心数
  • JVM堆大小
  • 未来池中并行运行的线程数
作为部分回应,我想说:

  • JVM堆化应该根据RAM进行调整
  • 拥有多个内核可以提高并发工作负载下的性能,但不会真正加快单个请求的处理速度
  • 相反,拥有大RAM可以显著加快单个请求的执行速度
  • 我未来池中的线程数必须根据我的内核数进行调整
编辑

我想比较性能,而不考虑代码,只关注硬件/线程模型。让我们假设代码已经过优化。其他信息:

  • 我正在构建一个数据报告API。请求的处理时间在很大程度上取决于我正在处理的数据集。对于大型数据集,它最多可以达到10秒
  • 我从第三方API检索大部分数据,但我也使用c3po连接池机制访问MySQL数据库。请求的执行被另外委托给未来的池,以防止阻塞
  • 不包括MySQL的磁盘IO
  • 我不想在服务器端缓存任何东西,因为我需要 处理新数据

谢谢

性能和总体行为仍将取决于您自己的代码,而不是您正在使用的框架。换句话说,您已经正确地列出了影响性能的主要因素,但是您自己的代码将对其产生重大影响,因此几乎不可能提前知道

我要说的是,您需要更详细地描述应用程序的一些特性:

  • 你说每个请求都是CPU密集型的,但这是什么意思?每个请求需要1毫秒吗?10毫秒?100毫秒
  • 你访问数据库吗?您的数据库有哪些特点
  • 无论是有数据库还是没有数据库,您都有磁盘IO吗?它有多重要
。。。但是如果您的应用程序非常简单,对磁盘的影响不大(或者根本没有)。您的请求可能是只读的,所有内容都会被缓存,并且您受到CPU的限制,那么您可以做的最重要的事情就是在服务器中插入足够的CPU内核