我正面临多核系统的可伸缩性问题。我的应用程序是在4台物理核心机上并行处理科学数据,8台具有超线程激活的逻辑核。我们启动了8个JVM,每个逻辑核心一个(为了避免JVM的开销,我们可能最终会切换到一个JVM)
问题是,可伸缩性几乎是线性的,最多可达4个核心,但通过增加4个“逻辑核”,我们几乎无法获得10-20%的性能。
我通过分析应用程序来分析线程的行为,我没有看到太多等待的锁或线程。我还检查了pidstat,例如,我没有看到过多的上下文切换开销。更确切地说,java进程几乎没有上下文切换。CPU使用率极高,几乎达到100%,这似乎也可以。
我的问题是,在超过物理核的数量之后,如何检测和分析这种糟糕的可伸缩性的原因。我可以使用哪些工具和方法来检测争用的位置,应该在哪里查看,并且可以在不改变应用程序的架构的情况下以某种方式修复它(例如,每台机器切换到一个JVM )
谢谢
发布于 2017-10-09 15:28:27
请注意,超线程并不是单核容量的两倍.事实上,当超线程运行时,有些任务执行得更糟糕。
收益将很大程度上取决于工作的性质-更多的管道档位将意味着更多的机会来安排另一个过程,而不是停滞不前的一个。
例如:完全随机访问内存将产生更多的超线程性能增益,而不是非常快的cpu密集型计算,所有这些都在同一高速缓存线内。
以下是两个硬件线程共享的东西,因此任何争用都会限制任何增益:
另一个观察是,操作系统必须支持SMT/HT,否则它将无法将任何内容安排到其他内核中,或者安排错误的任务。
当操作系统支持时,OS仍有可能在文件句柄或网络套接字等方面发生争用。工作性质越‘尴尬可并行的’,就越有机会限制这种争论。但是,如果您的工作涉及到对同一系统资源的读取和/或写入,则您的收益将更少。
一旦将所有这些任务都放到了一个JVM中,那么您的并行性将是:
int cores = Runtime.getRuntime().availableProcessors();https://stackoverflow.com/questions/46648534
复制相似问题