博客

【求职分享】

【笔试/面试】

一文读懂:高频交易系统的设计与实现(下)

Feb 03,2023

分享本文:

【概要】高频交易是指从那些人们无法利用的极为短暂的市场变化中寻求获利的计算机化交易。

大家好, 我是Lucy@FinTech社区。上篇文章我们介绍了高频交易系统的特点。

 

今天这篇文章我们就来一起学习一下高频交易系统的软硬件实现。欢迎大家扫码二维码添加微信,加入FinTech社区,提认知,攒人脉,求职招聘!

图片

 

 

01 高频交易系统的硬件配置 

 

目前来看高频交易系统所需的硬件配置有如下几种情况:

 

  • 超频CPU:通常所说的超频简单来说就是人为提高CPU的外频或倍频,使之运行频率得到大幅提升,即CPU超频,提升CPU的运算性能。

  • FPGA硬件加速:适用于逻辑性强,从CPU上卸载一些计算任务,减少CPU运算单元的耗时,在高频交易领域比较有优势。

 

下图为FPGA示意图

 

图片

 

  • 使用GPU并行算法强,适合大数据,比如机器学习,神经网络强化算法,矩阵式计算语言的加速。

 

下图为机器学习中并行计算的示意图

 

图片

 

关掉CPU节能设置。很多CPU默认有节能功能,在程序运算量不大的时候减少CPU的消耗,这对于高频这种竞速交易系统是非常不适用的

 

定义专核专用。目前的CPU都是多核设计的,在交易系统的应用,对核的理解是不一样的,会希望CPU专核专用,服务于特定进程,不要进行自动切换,需要对内核做一些隔离和绑定的操作,一般操作系统都会有专用的参数提供。

 

 

02 高频交易系统的软件设计

 

对于高频交易系统来说,交易的时效性显得尤为重要,那么对于软件开发人员来说,如何做好低延迟、高并发就是重中之重的事情了!

 

  • 第一,优化kernal控制。

 

控制了物理的CPU内核之后,就要对操作系统的Kernel进行控制。

 

操作系统内部会有两种状态,一种是内核态,一种是用户态。在两种状态进行切换的时候,会花费一定的代价。对交易系统来说,这种自动过度的过程也是一种损耗,因此就要对Kernel进行处理。

 

下图为内核态与用户态的示意图

 

图片

 

例如,一般来说,网络数据的研发,会做一些硬件上的操作,比如看一下网络数据,导入内存中再传输给应用程序。在使用TCP/CP传输的时候,也是内核在维护信息的传输和转移。

 

  • 第二,进行线程隔离。

 

高频交易系统的开发,尤其要避免上下线程切换,为了做到这一点,常用线程隔离。我们不希望有多个线程竞争同一个层面的CPU内核,一旦发生这样的情况,就势必要进行线程切换

 

在开发系统的时候,会尽量保证,一个物理CPU核上只跑一个线程,这个线程就只会做单线程内部的计算,来节省多线程直接切换或者锁的开销

 

下图中的线程3、4就发生了竞争:

 

图片

 

  • 第三,要避免数据的移动。

 

计算机进行运算的时候,要把数据从相对慢速的存储设备,比如硬盘、网卡读取内存,把数据传输到CPU缓存中,然后再从高速缓存传输到计算器中,经过一层又一层数据在缓存中的移动,最终才能完成系统需要的数据计算。

 

搞清楚这个过程,我们就很清楚,优化计算事件的解决方案,很重要的一点是尽量避免数据在缓存之间的移动。要设定每个层面上的缓存是怎样使用的,避免数据被交换到更慢速的缓存中去。

 

  • 第四,尽量使用共享内存。

 

从速度的角度考虑,对内存的读写控制也是重要的工作,我们当然更希望所有的读写都在高速缓存里完成的。

 

但是程序在编写的时候是直接面对内存,把数据放在内存里,从程序员编程的角度会更加方便。但是,从速度的角度考虑,这种模式会增加系统在内存读写拷贝上的开销。我们会尽量实现zero copy,让数据在产生的区域直接进行运算、转化的操作

 

下图为共享内存的示意图:

 

图片

 

  • 第五,要尽量减少线程锁 (thread lock)。

 

每增加一个锁,都会增加系统的复杂性,影响系统运行速度,因此要很认真思考有没有承担这部分开销的代价。

 

我们一般会使用一种叫busy spin的技术,让一个线程中的计算代码,使用代码无限循环的办法,避免任何形式的等待,主动控制CPU的使用,保持在同一个内核上线程一直在高速运转状态里。

 

 

03 常用的系统性能测试工具

 

当我们开发完成一个交易系统的时候,怎么测试我们的系统呢?下面就给大家推荐几款小应用:

 

  • Netperf/sockperf:用于测试网络速度,确认延时情况,提升网络性能;

  • Wireshark/tcpdump:抓取网卡上所有的数据包,提供反映实际系统性能的底层数据;

  • Systemtap:提供具体进程状态的统计,可以精细到处于sleep状态的频率、总数、时长;

 

写一篇评论

发表评论
%{tishi_zhanwei}%
博客留言测试

Dec 20,2022

< 1 >