假设有一款使用Java编写的高频交易系统,需要(非常)低延迟,由于不可变性而产生了许多短暂的小对象(是否考虑使用Scala?),每秒连接数达到数千个,在事件驱动的架构中传递了大量的消息(使用akka和amqp?)。
对于专业人士来说,理论上最好的JVM 7调优方法是什么?哪种类型的代码可以让它更快?Scala和Akka是否能够胜任这种系统?
注意:已经有了一些类似的问题,比如这个,但我还没有找到一个涵盖Scala的问题(因为它在JVM中具有自己的特点)。
假设有一款使用Java编写的高频交易系统,需要(非常)低延迟,由于不可变性而产生了许多短暂的小对象(是否考虑使用Scala?),每秒连接数达到数千个,在事件驱动的架构中传递了大量的消息(使用akka和amqp?)。
对于专业人士来说,理论上最好的JVM 7调优方法是什么?哪种类型的代码可以让它更快?Scala和Akka是否能够胜任这种系统?
注意:已经有了一些类似的问题,比如这个,但我还没有找到一个涵盖Scala的问题(因为它在JVM中具有自己的特点)。
在Java中可以实现非常好的性能。但是,为了提供可信的答案,问题需要更加具体。以下是可能导致延迟的主要因素,但不限于此:
你产生的垃圾量以及GC收集和推广它的工作。根据我的经验,不可变设计不适合低延迟。GC调优需要成为一个重点。
预热JVM以便加载类并让JIT有时间进行编译。
将算法设计为O(1)或至少O(log2 n),并具有断言其性能的性能测试。
您的设计需要无锁并遵循“单写原则”。
需要投入大量精力来理解整个堆栈,并在使用中表现出机械同情。
将算法和数据结构设计为缓存友好型。如今,缓存未命中是最大的成本。这与进程亲和力密切相关,如果设置不正确,可能会导致显着的缓存污染。这将涉及对操作系统的同情,甚至在某些情况下需要一些JNI代码。
确保您拥有足够的核心,以便任何需要运行的线程都有可用的核心而无需等待。
我最近写了一篇关于这种练习的案例研究的博客。
有很多用Java编写的HFT系统,但我从未听说过有一个用Scala编写的。为什么?
JVM语言中,垃圾收集器是常见的,但对于HFT来说并不是一个好选择。但Java是一种垃圾收集语言。那么诀窍是什么呢?诀窍在于人们在编写HFT时像使用C一样使用Java,我的意思是:他们通过更高的内存分配控制来交换Java提供的一些好处。这个技巧基本上是通过将JCF(Java Collections Framework)替换为预先分配在内存中的平凡数组或其他创造性解决方案。
Scala是一种功能强大的编程语言,它促进了大量使用函数式编程技术,其中大部分都由集合框架支持。问题在于:如果你要摆脱集合框架(通过第1点),那么你基本上就没有使用Scala内置的FP基本构建块。如果你一开始就不这样做,那么使用Scala有什么意义呢?
Akka似乎不是一个好的选择,因为...嗯...它是用Scala编写的。所以,通过第(1)和(2)项,我们也可以排除Akka。