我的问题涉及JVM应用程序可以利用主机的NUMA布局的程度。对JVM的NUMA认识
我有一个Akka应用程序,其中参与者通过将传入数据与已加载到不可变(Scala)对象的“通用”数据进行组合来并发处理请求。该应用可以在云中很好地扩展,使用许多双核虚拟机,但在单个64核心机器上执行效果不佳。我认为这是因为公共数据对象驻留在一个NUMA单元中,并且从其他单元并发访问的许多线程对于互连而言太多。
如果我运行64个单独的JVM应用程序,每个应用程序包含1个actor,那么性能会很好。一个更温和的方法可能是运行尽可能多的JVM应用程序,因为有NUMA单元(我的情况是8个),给主机操作系统一个保持线程和内存在一起的机会?
但是,在单个JVM中实现相同效果还有更明智的方法吗?例如。如果我用一个case类的几个实例替换了我的公共数据对象,那么JVM是否有能力将它们放在最佳的NUMA单元上?
更新:
我使用Oracle JDK 1.7.0_05和阿卡2.1.4
现在我已经试图与UseNUMA和UseParallelGC JVM选项。在使用一个或几个JVM时,对性能下降似乎没有任何显着影响。我也试过用PinnedDispatcher和thre-pool-executor没有任何作用。我不确定配置是否有效,因为在启动日志中似乎没有什么不同。
当我每个工人使用一个JVM(〜50)时,最大的改进仍然存在。然而,这个问题似乎是在FailureDector注册Akka集群JVM之间的“第一次心跳”成功交换之前存在长时间延迟(长达几分钟)。我怀疑还有其他一些问题,我还没有发现。自从我达到默认的最大进程数(1024)以来,我不得不增加ulimit -u。
只是为了澄清,我并没有试图实现大量的消息,只是试图让很多独立的角色同时访问一个不可变的对象。
您是否在使用-XX:+ UseNUMA jvm选项? – cmbaxter
另外,您使用的是什么GC设置?什么执行器配置? –
您可能需要告诉akka使用更好的线程模式,请参阅此处获取某些邮箱配置选项:http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html – Noah