同样的程序在本应更好的机器上运行起来要慢得多

same program is much slower on a supposedly better machine

当 运行 同一应用程序在两台不同的机器上运行时,我发现一台要慢得多,但它应该是两台机器中较快的那台。这是一个具有线程池的计算绑定应用程序。线程不相互通信,也不与外部通信。应用程序开始时从磁盘读取(几分之一秒),最后写入磁盘(几分之一秒)。

该程序对一组确定性变化的输入重复运行模拟。由于输入相同,因此可以比较输出,它们实际上是相同的。唯一的区别是经过的时间。我记得有一个对象是 "shared",因为所有线程都从它读取,但我记得这是严格只读的。线程化的工作是同质的。

Dual machine: 2 core / 4 thread machine, 2.53 GHz, 3MB cache, 8GB RAM, passmark.com benchmark is approximately 2100, my application's thread pool size set to 4, JVM memory high water标记为 2.8 GB,经过的时间为 47 分钟

Quad machine: 4 核/8 线程机器,2.2 GHz 到 3.1 GHz,6MB 缓存,8GB RAM,passmark.com 基准大约是 6000,我的应用程序的线程池大小设置为 8,JVM内存高水位标记为 2.8GB,经过时间 164 分钟

另一个对比:

Dual machine:线程池大小设置为 2,运行时间 98 分钟 * 可能更少。请看脚注。

Quad machine: 线程池大小设置为 2,运行时间 167 分钟

*应该不到98分钟,因为我也在播放音频文件。这意味着异常比这个结果看起来更糟糕。

jvisualvm 配置文件看起来很相似,但由于似乎是配置文件故障,我没有从中得到太多用处。我正在寻找有关查找位置的建议。

两台机器都是 Ubuntu 14.04.3 和 Java 8.

答案是:多收集数据,得出一些结论。似乎在比较这两个系统时可以得出一些结论,但它们可能不会扩展到芯片组或处理器。

查看原始帖子中的数据和以下测量结果,似乎对于小数据集,四系统的超线程不仅不会显着提高吞吐量,而且即使在 4 核设备上超过 2 个线程也不会提高每单位时间的吞吐量,至少对于这些特定的同质工作负载。对于大型数据集,超线程似乎会降低单位时间的吞吐量。请注意与平均 1883 秒(2032 和 1734 的平均值)相比的 2933 秒结果。

双核超线程非常好,在线程池大小维度上扩展得很好。双核还可以在数据集大小维度上很好地扩展。

所有测量值都是经过的时间。可以推导出其他方式,比如2032和1734可以取平均