C++大会|恒生章乐焱:金融行业高频极速交易系统架构与关键技术探索

http://rdcqii.hundsun.com/portal/article/UFT-614.html

10月28日,2016 C++及系统软件技术大会在上海召开,C++之父Bjarne Stroustrup和众多在系统软件领域的海内外技术领袖与一线工程实战专家受邀参加本次大会。

恒生电子首席架构师、恒生研究院专家章乐焱发表《金融行业高频极速交易系统架构与关键技术探索》主题演讲。

【 为什么需要极速交易?】

普通散户只需满足一般需求,但专业投资者对速度与服务有更高的要求,如股指套利需求、策略化需求、对资讯行情送达的需求等。

随着专业投资者对速度和服务要求的提高,传统的数据库已经无法满足要求,必须要有革命性的变化来满足新时代的需求,由此极速交易应运而生。

对专业投资者和机构客户,选用内存交易系统,采取行情、成交主推模式;对于普通投资者和散户,则选用数据库交易系统,采取行情、成交轮询模式。

【第一代UFT―初生的喜悦】
*注:UFT(Ultra Fast Trading)指恒生极速交易系统。

2008年,第一波需求来自期货,当时我们只有大致思路,并没有很好的架构设计。但我们努力想减少传统数据库的各种做法。我们发现,一个股民的相关数据是有限的,在数据查找的时候可采用事先组织的方式,不需要再排序。

第一代UFT,期货委托的业务延时从20ms减少到100us,我们的性能达到了两个数量级的提升,可以说是一个革命性的变化。

但与此同时,也产生了一些新的问题: 
● 纯手写,对开发人员要求高,需要同时熟悉C/C++技术和业务知识;
● 开发效率较低,开发新业务周期长;
● 业务和数据耦合,影响系统稳定性,排查问题困难;
● 扩展性不好,应用到其他业务场景基本需要从零开始。

扫描二维码关注公众号,回复: 8329077 查看本文章
【第二代UFT―成长的快感】

2012年,股指期货等出现。各种量化做法、程序化交易出现。除了期货公司、大量的基金公司、证券公司都开始做量化投资,都需要量化系统,应用场景不断增加,原来的做法也出现了一些新的问题。

这对技术人员的技术要求、业务要求更高,因此我们对整个系统做了更认真的设计。该封装的封装,该分层的分层。恒生的传统做法是自己做一个开发工具,用于降低开发难度。大家都知道,c++很多时候都是靠编译器来实现易用性。当编译器改不动的时候,再通过开发工具来提升开发的易用性。UFT开发工具在以下方面提供了许多便利。

恒生一直遵循金融行业的严谨性与规范性,在极速交易系统的组织架构上也严格遵守,并在数据模型上也做了一些考虑。

第二代UFT的快速成长,也解决了众多问题:
◕ 封装内存数据库,支持事务、索引,可持久化,可以应用到各业务场景;
◕ 交易单元,数据预先关联,主体呈树状组织,缩小查找范围,甚至无需查找;
◕ 开发工具,开发效率高,不易出错。

【第三代UFT―全新的挑战】

13年的时候,恒生接到新三板、港交所的需求。交易所的要求比较高。比如说切换时间要短、数据不能丢失。因此我们采用了组播多活、定序处理的一个架构。收到一笔订单时,我们发给两台或者多台服务器同时去处理。处理最快的服务器先向外输出,这对性能提升有一定好处。有些业务有顺序要求,顺序不同输出的结果也会不一样。

因此这里存在一个问题:定序。所有东西排好队,交由各个节点处理,处理好了再传输出去。用这样单线程的方式,当系统出问题时,比较容易找到解决方法。 

交易所讲求三公原则,公开公平公正。因此这套系统对交易所来说再适合不过。为了增强可靠性,我们都使用两块网卡。单线程要求每一笔的处理时间越短越好,这样整体性能才能提升。当时最低要求是每秒4万笔的撮合,对此我们也没做什么优化,甚至连网络优化也没有,就达到了7万笔。

当然,最重要的还是排队机制,序排好,再做组播。这样做的好处是:核心可以有好几个组。每组有各自的分工,比方说一组只做撮合,而另一组撮合完了还需要向外输出行情。后来我们的研发团队又将这个架构从交易所这样一个比较特定的业务场景扩展到了更多的业务场景中。并开始采取批处理的方式,提升数据处理的速度。

【我们还想突破更多】

性能是一个永久的主题。在极速交易上,恒生已经达到了数量级的提升,但我们一直在思考,是否还有更多可以突破的地方。我们认为,要做到更大的提升,一要提升CPU访问内存性能,二是降低网络延时,三是通过FPGA专用硬件提升性能。

01| 提升CPU访问内存性能 

>>降低缓存延时

降低缓存的延时,与机器的架构相关。服务器的架构分为三种:SMP―对称多处理器结构、MPP―海量并行处理、NUMA―非一致存储访问结构。其中最简单的是SMP,它的多个CPU共享内存。NUMA架构中,CPU对内存的访问尽量要做到独占,共享一定会有竞争。 
第二点,CPU里面一定会有缓存。一级缓存和二级缓存的区别,一是速度差别,二是独占和共享的差别,三是容量差别,一级缓存比较小,二级比较大。这就涉及到数据缓存的设计。通过设计把命中率提高,从而提升性能。大小会严重影响我们的性能,同时影响我们对数据结构的设计。

>>缓存一致性协议
缓存有缓存一致性协议,和前面介绍的Oracle中的一项RAC的技术类似。不同CPU核心有自己的缓存,为了保证这些缓存数据的一致性 ,需要通过复杂的缓存一致性协议来保证。

>>普通储存访问

除了一级、二级缓存还有一个储存,就是我们的普通储存。我们的程序有一个虚拟地址,访问的内存叫虚拟内存,它跟物理内存其实是一个映射,在这个映射的过程中,缓存处理不好将会引起TLB颠簸。

02| 降低网络延时

除了访存延迟,网络延迟更严重。动不动就十几个微秒。大家都知道用户态和内核态的切换是非常耗时间的,目前最好的网卡一次来回只要两微秒,它的处理方式最重要的一点,就是通过消除用户态和内核的切换,同时考虑内存拷贝开销、线程切换开销来降低网络访问的延时。

03| FPGA专用硬件

FPGA通过硬件的并行性来提高性能,当然实现也具有更大的复杂性,因此不可能把全部业务放在FPGA。FPGA可以通过PCI接口与主机进行交互。恒生基于整体架构的基础,在FPGA方面也做了一些研究,考虑某些低延时要求更高的业务放在FPGA,而其他的还是通过软件来实现。

猜你喜欢

转载自www.cnblogs.com/dhcn/p/12105812.html