使用Scala/Akka在JVM中进行高频交易

Hug*_*ira 21 performance jvm scala low-latency akka

让我们想象一下Java中假设的HFT系统,需要(非常)低延迟,许多短暂的小对象在某种程度上是由于不变性(Scala?),每秒数千个连接,以及在事件驱动架构(akka和amqp?).

对于那里的专家来说,(假设)对JVM 7的最佳调整是什么?什么类型的代码会让它开心?Scala和Akka会为这种系统做好准备吗?

注意:已经有一些类似的问题,像这样的一个,但我还没有找到一个覆盖斯卡拉(它有自己的特质足迹在JVM).

小智 35

可以在Java中实现非常好的性能.然而,问题需要更加具体,以提供可靠的答案.您的主要延迟来源将来自以下非详尽列表:

  1. 您创建了多少垃圾以及GC收集和推广它的工作.根据我的经验,不可变设计不适合低延迟.GC调整需要成为一个重点.

  2. 预热JVM以便加载类并且JIT有时间完成其工作.

  3. 将您的算法设计为O(1)或至少为O(log2 n),并进行性能测试以断言这一点.

  4. 您的设计需要无锁,并遵循" 单一编写原则 ".

  5. 需要付出巨大努力来理解整个堆栈并在其使用中显示机械同情.

  6. 将您的算法和数据结构设计为缓存友好.这些天缓存未命中是最大的成本.这与过程亲和力密切相关,如果没有正确设置,则会导致严重的高速缓存污染.在某些情况下,这将涉及操作系统甚至一些JNI代码的同情.

  7. 确保您有足够的核心,以便任何需要运行的线程都可以使用核心而无需等待.

我最近在博客上发表了关于这种练习的案例研究.


And*_*yuk 26

在我的笔记本电脑上,Akka 2.3.7演员之间ping消息的平均延迟时间约为300ns,远远低于因JVM上的GC暂停而导致的延迟.

代码(包括JVM选项)测试结果为阿卡和英特尔睿i7-2640M芯其他演员在这里.

PS你可以在Dmitry Vyukov的网站和Martin Thompson的博客中找到很多关于低延迟计算的原理和技巧.

  • 仅供参考,该改进现已得到解决,并且是JDK 7新版本的一部分. (2认同)

Mic*_*lon 11

您可能会发现使用环形缓冲区进行消息传递将超过Akka可以做的事情.人们在JVM上用于财务应用程序的主环缓冲区实现是一个名为Disruptor的实现,它针对JVM(无GC,无锁)和现代CPU(没有虚假共享)的效率(两种尺寸的功率)进行了仔细调整.缓存行).

以下是Scala观点http://scala-phase.org/talks/jamie-allen-sdisruptor/index.html#1的介绍演示文稿,最后一张幻灯片上有原始LMAX内容的链接.