java - MPP架构上的多线程应用

标签 java scalability java-threads infrastructure tandem

简而言之:

是否值得在始终在 MPP 基础设施(例如 Tandem HPNS(水平可扩展))中运行的应用程序上添加多线程可扩展性(垂直可扩展性)?

现在,让我更深入地说:

我在很多地方看到使用 Java 进行 MPP(大规模并行处理)下的开发倾向于认为,如果是 Java,你可以使用 Java 提供的所有功能(你知道,写一旦在任何地方运行!),其中多线程库(例如线程、AKKA、线程池等)可以通过使用并行性加快性能来提供很大帮助。

忘记一个事实,如果它是 MPP,它是水平可扩展的,这意味着如果您需要更快的应用程序,您必须将其设计为运行应用程序的多个副本,每个副本都在不同的处理器上。

另一方面,我们有 SMP(对称多处理)基础设施(这里我们有任何 Windows、Linux、UNIX 等环境),在这些中您不需要不必担心这一点,由于可扩展性是垂直的,您可以拥有更多线程,其中它们的执行将分布在操作系统可用的不同内核上(这里我同意使用多线程库) .

因此,考虑到这一点,我的问题是,是否需要创建一个应用程序来执行大量数据负载,并进行大量验证和其他要求,其中并行性的使用将有很大帮助改善了加载时间,但是,它必须在 MPP 环境下运行(例如 Tandem HPNS)。

开发人员是否应该投入时间添加多线程库以增加并行性和并发性?

一些旁注:

1) 我并不是说 SMP 更好或 MPP 更好,它们只是不同的基础设施;我的观点仅涉及在 MPP 环境上使用多线程库,因为在 MPP 上使用多线程的应用程序将仅使用服务器可能拥有的 N 个 CPU 中的一个 CPU。

2) 我并不是说 MPP 服务器不支持多线程库,您可以在 HPNS 上运行多线程,但即使您有 20 个线程,也没有真正的并行性,因为一个线程是阻挡其他人;除非您将应用程序分布在不同的 CPU 上(运行多个副本)。

最佳答案

不,我认为在始终串联运行的应用程序上添加多线程可扩展性是没有意义的,因为串联不提供内核级线程,因此即使您编写多线程应用程序,它也不会带来任何好处。

即使串联 HPNS Java 也按照 Java 规范提供多线程,但其性能无法与 Linux 或任何其他支持内核级线程的操作系统相媲美。 串联的实际目的是由于其硬件冗余而实现 HA 可用性。

关于java - MPP架构上的多线程应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37345891/

相关文章:

Java 允许泛型中的原始类型

java - 使用并发标记扫描 GC 收集器?

java - 使用 volatile int 的多线程中的兴趣案例

mysql - 数据库已经填充并运行后是否可以完成分片解决方案

android - 3个高频运行的线程使用相同的变量

java - 仅在 ExecutorService 中提交任务时设置变量值

java - 如何将字符串拆分为标记?

java - Java Web App 中会运行多个日志属性吗?

scalability - 您将如何为用户实现 "last seen"功能?

database - 在NoSQL和RDBMS中扩展?