Hug*_*ira 21 performance jvm scala low-latency akka
让我们想象一下Java中假设的HFT系统,需要(非常)低延迟,许多短暂的小对象在某种程度上是由于不变性(Scala?),每秒数千个连接,以及在事件驱动架构(akka和amqp?).
对于那里的专家来说,(假设)对JVM 7的最佳调整是什么?什么类型的代码会让它开心?Scala和Akka会为这种系统做好准备吗?
注意:已经有一些类似的问题,像这样的一个,但我还没有找到一个覆盖斯卡拉(它有自己的特质足迹在JVM).
小智 35
可以在Java中实现非常好的性能.然而,问题需要更加具体,以提供可靠的答案.您的主要延迟来源将来自以下非详尽列表:
您创建了多少垃圾以及GC收集和推广它的工作.根据我的经验,不可变设计不适合低延迟.GC调整需要成为一个重点.
预热JVM以便加载类并且JIT有时间完成其工作.
将您的算法设计为O(1)或至少为O(log2 n),并进行性能测试以断言这一点.
您的设计需要无锁,并遵循" 单一编写原则 ".
需要付出巨大努力来理解整个堆栈并在其使用中显示机械同情.
将您的算法和数据结构设计为缓存友好.这些天缓存未命中是最大的成本.这与过程亲和力密切相关,如果没有正确设置,则会导致严重的高速缓存污染.在某些情况下,这将涉及操作系统甚至一些JNI代码的同情.
确保您有足够的核心,以便任何需要运行的线程都可以使用核心而无需等待.
我最近在博客上发表了关于这种练习的案例研究.
Mic*_*lon 11
您可能会发现使用环形缓冲区进行消息传递将超过Akka可以做的事情.人们在JVM上用于财务应用程序的主环缓冲区实现是一个名为Disruptor的实现,它针对JVM(无GC,无锁)和现代CPU(没有虚假共享)的效率(两种尺寸的功率)进行了仔细调整.缓存行).
以下是Scala观点http://scala-phase.org/talks/jamie-allen-sdisruptor/index.html#1的介绍演示文稿,最后一张幻灯片上有原始LMAX内容的链接.