繁体   English   中英

在多线程环境中访问大型单例对象

[英]Accessing a large singleton object in multithreaded environment

我有一个非常大的单例对象,其中包含一个2500 X 80000双数组。 当我尝试在多线程环境中访问它时,随着线程数量的增加,访问对象的时间也会增加。 如果有办法我可以保持对象的访问时间相同,而不管线程的数量。

我只是在读数组。 阵列中没有进行任何更改。 代码中没有同步

问题的一个可能原因是无效的缓存。 缓存取决于线程在有足够的其他缓存活动将线路移出缓存之前返回到线路。 随着线程数量的增加,线程重用线路的概率下降。

如果可能的话,以自然顺序访问数组,第二个索引变化最快。 这会尽快重用行,并减少每个线程需要运行良好的缓存空间量。

尝试的可能解决方案是使用例如信号量来同时将读取阵列的线程数限制为提供最高吞吐量的数量。 这可能大于一,但不会是无限的。

另一种解决方案是增加处理器的数量,从而增加缓存空间,与线程数成比例。

第三种选择是重新使用这么多线程。 拥有一个有限的线程池和一个任务队列可能会更有效。

如果你所做的只是阅读,那么你就拥有了最有效的解决方案软件。 更可能是一个问题是你正在耗尽一个资源,例如你有比CPU更多的线程,或者你有更多的数据可以有效地适应你的缓存。

例如,如果您有一个线程,则它具有对您的L3缓存的完全访问权限,例如12 MB。 如果你有两个线程,如果没有重叠,每个cpu可以使用一半的缓存。 如果你有24个线程,那么每个CPU只有0.5 MB,它必须共享一个高度竞争的资源。

在我已经完成的测试中,您可以使用2-3个线程来最大化L3缓存的带宽,具体取决于您正在执行的操作。

顺便说一句:如果你有任何一个,你应该获得更好的缓存效率。

  • 购买具有更大L3缓存和更大内存带宽的CPU,2011针脚Xeon处理器最高可达24 MB。
  • 使用float或int而不是double。 对于某些用例,我使用了带有两个固定小数位的short。

我只是在读数组。 阵列中没有进行任何更改。 代码中没有同步

在一个地方,我看到每个关键线程都在自己的机器上运行。 这将保证您的持续表现。 但我怀疑,您需要考虑哪些选项可以充分利用您的硬件并实现您的硬件有限制(例如您的预算;)

我终于找到了解决问题的方法。 我没有将数据存储在二维数组中,而是将数据存储在单维数组中,结果比在二维数组中存储数据快得多。 显然,java不像单维数组那样有效地处理双维数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM