JVM的NUMA感知能力

7
我的问题与JVM应用程序能够利用主机的NUMA布局的程度有关。
我有一个Akka应用程序,其中actor通过将传入数据与已加载到不可变(Scala)对象中的“公共”数据组合来并发处理请求。该应用程序在云中使用许多双核VM时具有良好的扩展性,但在单个64核机器上表现不佳。我认为这是因为公共数据对象驻留在一个NUMA单元中,并且许多线程同时从其他单元访问过于频繁,导致了互连的负担过重。
如果我运行64个包含1个actor的单独的JVM应用程序,则性能会恢复正常。一个更温和的方法可能是运行与NUMA单元数相同的JVM应用程序(在我的情况下为8个),使主机操作系统有机会将线程和内存保持在一起?
但是,在单个JVM内实现相同效果是否有更聪明的方法?例如,如果我用几个case类的实例替换我的公共数据对象,JVM是否有能力将它们放置在最佳的NUMA单元上?
更新:
我正在使用Oracle JDK 1.7.0_05和Akka 2.1.4
我现在尝试了UseNUMA和UseParallelGC JVM选项。当使用一个或少量的JVM时,两者似乎都没有任何显着的影响。我还尝试使用PinnedDispatcher和three-pool-executor,但没有效果。虽然启动日志中似乎没有任何不同,但我不确定配置是否产生了影响。
最大的改进仍然是当我为每个工作进程使用单个JVM(约50个)时。但是,这样做的问题似乎是在Akka集群JVM之间成功交换“第一个心跳”的FailureDector注册之前存在长时间的延迟(多达几分钟)。我怀疑这里还有其他问题,我尚未发现。我已经不得不增加ulimit -u,因为我达到了默认最大进程数(1024)。
只是为了澄清,我并不试图实现大量消息,只是试图让许多单独的actor同时访问一个不可变对象。

2
你是否正在使用 -XX:+UseNUMA JVM 选项? - cmbaxter
另外,您使用什么GC设置?以及什么执行器配置? - Viktor Klang
你可能需要告诉Akka使用更好的线程模式,这里有一些邮箱配置选项:http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html。 - Noah
这种事情非常依赖于您使用的虚拟机,我假设您正在使用Oracle的HotSpot? - rxg
我会添加 'akka' 标签。可能来自 Typesafe 的人会分享如何调整 Akka 以适应具有这么多 CPU 的服务器的经验:http://letitcrash.com/post/20397701710/50-million-messages-per-second-on-a-single-machine - Andriy Plokhotnyuk
Hotspot有UseNUMA标志,这就是关于NUMA支持的全部内容。这将对Eden进行分区,并使用循环算法在每个节点上交错旧代。(http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html)。因此,JVM无法智能地处理旧对象。我认为您的8个JVM方法听起来不错,为什么不将它们中的每一个绑定到一个节点上?(在Linux上使用numactl)。 - Alexandre de Champeaux
1个回答

2
我认为如果您确定问题不在消息处理算法中,那么您应该考虑整个环境配置,从JVM版本(最新版本更好,Oracle JDK通常比OpenJDK表现更好),然后是JVM选项(包括GC、内存、并发选项等),然后是Scala和Akka版本(最新的发布候选版和里程碑可能更好),还有Akka配置。您可以从这里借鉴所有相关的内容,以获得当代笔记本电脑上每秒50M条消息的总吞吐量的Akka actors
我从未有机会在64核服务器上运行这些基准测试 - 所以任何反馈将不胜感激。
根据我的研究发现,当线程池中的线程数量增加时,ForkJoinPool 的当前实现会增加消息发送延迟。当响应-请求之间的调用频率很高(例如,在我的笔记本电脑上将线程池大小从4增加到64时),对于大多数执行器服务(如Scala的ForkJoinPool、JDK的ForkJoinPoolThreadPoolExecutor),此情况会显著增加这种情况下Akka actors的消息发送延迟,通常会增加2-3倍左右。
您可以通过使用设置了不同值的benchmark.parallelism系统变量来检查是否存在任何差异,请运行mvnAll.sh

以下是一篇博客文章,描述了我们在48核测试服务器上使用FJP的Akka的可扩展性概况:http://letitcrash.com/post/20397701710/50-million-messages-per-second-on-a-single-machine - Viktor Klang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接