博客
【求职分享】
【笔试/面试】
一文读懂:高频交易系统的设计与实现(下)
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状态的频率、总数、时长;
上一页
下一页
上一页
下一页