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

     2023-03-31     255

关键词:

【中文标题】使用 Scala/Akka 在 JVM 中进行高频交易【英文标题】:High Frequency Trading in the JVM with Scala/Akka 【发布时间】:2012-04-14 15:24:23 【问题描述】:

让我们想象一个 Java 中的假设 HFT 系统,需要(非常)低延迟,由于不变性(Scala?),有许多短命的小对象,每秒数千个连接,以及大量的消息传递围绕在事件驱动的架构中(akka 和 amqp?)。

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

注意: 有一些类似的问题,例如 one,但我还没有找到一个涵盖 Scala(它在 JVM 中有自己的特殊足迹)的问题。

【问题讨论】:

还有一个问题,如果JVM是正确的选择?也许 C++ 会提供更可预测的延迟。 我听说过 Scala 用于生成 C 代码执行实际的 HFT,但我不记得任何细节。由于链接问题中提到的 1-3 秒对于 HFT 来说太多了,我认为在 JVM 上编写 HFT 软件不是一个好主意。 问题很笼统。 我只是不明白为什么人们在垃圾收集语言中尝试低延迟。为什么 C 不是更常用的? 您可能在一秒钟内有数千条消息进出,但在 HFT 系统中您肯定不会有数千条连接。 【参考方案1】:

在 Java 中实现非常好的性能是可能的。但是,问题需要更具体才能提供可信的答案。您的主要延迟来源将来自以下非详尽列表:

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

    预热 JVM,以便加载类并且 JIT 有时间 做它的工作。

    将您的算法设计为 O(1) 或至少 O(log2 n),并且具有 断言这一点的性能测试。

    您的设计需要无锁并遵循“Single Writer Principle”。

    需要付出巨大的努力来理解整体 堆栈并在其使用中表现出机械同情。

    将您的算法和数据结构设计为对缓存友好。 如今,缓存未命中是最大的成本。这是密切 与进程关联相关,如果设置不正确,可能会导致 和严重的缓存污染。这会涉及到对操作系统的同情,在某些情况下甚至会涉及到一些 JNI 代码。

    确保您有足够的内核,以便任何需要 run 有一个可用的核心,无需等待。

我最近在博客上写了一篇关于此类练习的 case study。

【讨论】:

【参考方案2】:

在我的笔记本电脑上,Akka 2.3.7 参与者之间 ping 消息的平均延迟为 ~300ns,它远低于由于 JVM 上的 GC 暂停而导致的预期延迟。

英特尔酷睿 i7-2640M here 上 Akka 和其他参与者的代码(包括 JVM 选项)和测试结果。

附:您可以在 Dmitry Vyukov 的 site 和 Martin Thompson 的 blog 中找到许多低延迟计算的原则和技巧。

【讨论】:

仅供参考,改进现已解决,是 JDK 7 较新版本的一部分。 注意:平均延迟实际上只是吞吐量的倒数。您想根据应该发送消息的时间而不是发送消息的时间来了解延迟的分布。即你想避免坐标遗漏。 azulsystems.com/sites/default/files/images/… 我在 typesafe 博客上删除了对吞吐量测试的引用,以避免误解 1/latency = 吞吐量。【参考方案3】:

您可能会发现使用环形缓冲区进行消息传递将超过使用 Akka 所能做的。人们在 JVM 上用于金融应用程序的主要环形缓冲区实现是一种称为 Disruptor,它针对效率(两倍大小的幂)、JVM(无 GC、无锁)和现代 CPU(无虚假共享缓存行)。

这是从 Scala 的角度进行的介绍演示 http://scala-phase.org/talks/jamie-allen-sdisruptor/index.html#1,最后一张幻灯片上有指向原始 LMAX 内容的链接。

【讨论】:

非常有趣!谢谢分享。

在 Scala Akka 期货中,map 和 flatMap 有啥区别?

】在ScalaAkka期货中,map和flatMap有啥区别?【英文标题】:InScalaAkkafutures,whatisthedifferencebetweenmapandflatMap?在ScalaAkka期货中,map和flatMap有什么区别?【发布时间】:2011-10-0500:34:46【问题描述】:在普通的Scala映射和flatMap中,flatMap将... 查看详情

如何在 Scala Akka 中停止 system.scheduler.schedule

】如何在ScalaAkka中停止system.scheduler.schedule【英文标题】:Howtostopasystem.scheduler.scheduleinScalaAkka【发布时间】:2021-11-1503:27:45【问题描述】:我目前有一个方法可以创建一个调度程序,以设定的时间间隔向我的演员发送消息。但是... 查看详情

如何在scala akka(spray)中为rest服务编写测试用例

...2016-04-2416:38:22【问题描述】:如何模拟HttpRespose?我正在使用scalla、akka和spray来调用以json响应的rest服务,我需要为此编写测试用例。建议我可以使用的技术。【问题讨论】:【参考方案1】:最好的 查看详情

在 scala/akka 的计算之间检查参与者的消息查询

】在scala/akka的计算之间检查参与者的消息查询【英文标题】:Checkingmessagequerybyactorinbetweencalculationsinscala/akka【发布时间】:2021-12-1917:52:22【问题描述】:我有一个演员,当他收到一条消息时,他开始循环计算,并且他做了一段... 查看详情

与 Scala / Akka Actor 相比,Java 线程有多重?

...alaactor与java线程的性能。我很惊讶地看到差异,我观察到使用我的系统我最多只能生成约2000个线程(一次运行)但使用相同的系统我能够生成约500,000个scala演员。两个程序 查看详情

Scala、Akka、Spray:如何在处理前验证 json 数据?

】Scala、Akka、Spray:如何在处理前验证json数据?【英文标题】:Scala,Akka,Spray:Howtovalidatejsondatabeforeprocessing?【发布时间】:2015-03-3117:29:31【问题描述】:当所有输入都有效时,我可以处理这个json,即使用有效的键(包括大小写)... 查看详情

部署 Scala/Akka 微服务的规范方法是啥?

】部署Scala/Akka微服务的规范方法是啥?【英文标题】:WhatisthecanonicalwaytodeployScala/Akkamicroservices?部署Scala/Akka微服务的规范方法是什么?【发布时间】:2016-11-2504:08:08【问题描述】:我们最终会得到几十个这样的微服务(大多数... 查看详情

高频面试题----------jvm调优

...ff0c;会抛出OOM呢?系统OOM之前都有哪些现象?如何进行堆Dump文件分析?如何进行GC日志分析?线上死锁是如何排查的?线上YGC耗时过长优化方案有哪些?线上频繁FullGC优化方案有哪些?如何进行线上堆... 查看详情

JVM 未在服务器中进行夏令时更改

...描述】:我们有4台服务器在生产中,它们的所有时间都使用NTP(网络时间协议)服务器进行同步,所有这些服务器都在新西兰,作为Daylight的一部分,服务器被提前到1小时,即+1200到+1300,但似乎所有使用JVM的应用程序都达到了+... 查看详情

为啥要对jvm做优化?

...升高在多线程应用下,如何分配线程的数量?……说明:使用的jdk版本为1.8。jvm的运行参数在jvm中有很多的参数可以进行设置,这样可以让jvm在各种环境中都能够高效的运行。绝大部分的参数保持默认即可。三种参数类型jvm的参... 查看详情

稳压电源中的谐振变频器的特征

...零进行开关的方法。在现×××关电源出现之前,高频开关使用晶闸管作为开关元件其原因是,在当时作为功率用高频4开关晶体管,只有电视机水平偏转用开关晶体管,但为了进行大功率开关工作,使用开关速度慢的晶闸管,用谐振电路... 查看详情

如何在 Windows 中使用单独的 JVM 配置多个 Tomcat 实例

】如何在Windows中使用单独的JVM配置多个Tomcat实例【英文标题】:howtoconfigureMultipleTomcatinstancewithseperateJVMinwindows【发布时间】:2014-03-2715:41:05【问题描述】:我已经在Windows中安装并配置了6个ApacheTomcat实例,并在所有实例中放置了... 查看详情

:高频算法第27节:高频面试算法-基础(下)

...主要对排序与查找算法,常见链表以及二叉树的面试题目进行了分析与交流。在本小节中,我们主要对队列,堆栈,字符串与数组等知识点进行交流。针对各个知识点最高频的面试题目来进行解析,希望遇到经典的基础算法题目... 查看详情

如何在我的 JVM 上激活 JMX 以使用 jconsole 进行访问?

】如何在我的JVM上激活JMX以使用jconsole进行访问?【英文标题】:HowtoactivateJMXonmyJVMforaccesswithjconsole?【发布时间】:2010-10-2519:21:41【问题描述】:如何在JVM上激活JMX以使用jconsole进行访问?【问题讨论】:它是允许的,实际上它... 查看详情

mysql面试高频100问

...呢?索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引.3.Hash索引和B+树所有有什么区别或者说优劣呢?首先要知道Hash索引... 查看详情

jvm中的垃圾回收

...而固定的,在运行过程中由于类的加载和创建,内存中已使用的内存会越来越大,导致后来的程序执行时无法进行分配内存进行执行,此时就需要进行垃圾回收 查看详情

我可以在不同的进程中附加到 JVM 吗?

...正在运行的JVM实例。进程A如何附加到进程B中运行的JVM并使用它在进程A中运行Java代码。注意:不允许在进程B中进行Java处理。【问题讨论】:您是否有任何理由需要直接访问进程A中的J 查看详情

将文件/“文件夹”锁定到特定的 JVM 并在锁定时进行迭代

...locked【发布时间】:2019-02-2207:23:06【问题描述】:我正在使用多个JVM,但我需要每个JVM使用一个特定的文件夹。我要做的是遍历文件夹,直到找到未锁定的文件,然后将其锁定以使用该特定文件夹。我在这里过滤我想使用的文件... 查看详情