本文选自《交易技术前沿》总第四十四期文章
(上交所技术大会专刊)
信创与交易技术专题分享
孔磊 上交所技术有限责任公司 lkong@sse.com.cn
实时处理系统作为主要基于OLTP模型下的技术系统,随着交易规模迅速扩张和交易品种方式不断推陈出新,现有的技术架构已经逐渐将传统X86服务器的潜力压榨到极限。发展新的技术架构和利用其他硬件体系的能力成为目前主流的技术探索方向。
在信息创新的大背景,鲲鹏服务器作为提供了新的硬件体系以及众多核心易用于并行架构的能力,成为了一种优质的选择。而目前,运行在鲲鹏平台的多为使用Python、Java等原生支持多硬件架构的语言的应用,或者是一些非核心的业务。基于此,上海证券交易所低延时实验室,选取主要基于C/C+ +的证券实时处理系统进行鲲鹏平台的试点,进行国产化系统上核心业务的技术印证。
2.1. 交易所技术系统
交易所技术系统主要服务于整个证券市场,提供安全可靠的证券交易环境。整个技术系统主要服务于三大主要角色:市场参与方、业务操作方、审计监察方。市场参与方统一接入交易所技术系统,同时获得交易所发布的实时市场数据以及盘后的交易私有数据。业务操作方通过发起交易系统业务流程,进行证券基本信息的变更和证券服务的管控。市场参与方和业务操作方提交的订单指令,作为证券实时类处理系统的输入,在交易时段进行快速响应和处理,并回馈给输入方。在整个实时处理系统的后端,还需要对所有的数据进行分析处理,向审计监管方上报数据。
2.2. 实时处理系统的挑战
在整个交易环节中,需要保证在开市期间的所有订单的安全可靠,实时处理系统因此面临巨大挑战。
2.2.1. 高吞吐
实时处理系统的高吞吐,本质上就是证券交易业务行为的高吞吐。首先,证券处理系统需要能够有处理整个证券市场的容量,以及面临投资者数据快速增长带来交易规模膨胀的能力。其次,目前A股每日集合竞价结束报单后集中撮合,需要数十万笔每秒的处理吞吐能力,才能保障后续的连续竞价按时开放订单申报。再次,交易规则层面决定了成交对的多样化,散户的规模也成就了低价订单的高分布,1笔撮合成交1万笔的成交对也不是什么稀罕事。
除此之外,交易时的各种安全容错机制也放大了交易流量,数据传输和处理集中突发成了常态。
2.2.2. 低延时和高可用
近年来,证券领域的低延时话题越来越热,本质上反映了无论是投资者还是市场参与方还是市场服务提供方均认识到,延时是市场服务的关键,延时越低证券服务和价格发现的能力越强。
高可用则是证券技术历史悠久的领域了。为保证整个证券实时业务的连续性,市场服务的可靠性和公平性,交易所技术系统需要应对多种故障场景,并保证在交易所技术系统应对吞吐提升和延时降低的技术升级后持续的高可用性。
2.3. 技术展望
应对挑战,交易所实时处理系统对一些主要技术方向做出了探索和展望。
1) 开放平台。从硬件到操作系统,从基础库到应用软件,开源世界提供了一个庞大的、便利的、可扩展的生态。向多种体系结构进行探索和验证,对开放平台的兼容和技术印证,以及对开源世界的反馈,都将是技术系统发展的重要脚步。
2)并行架构。在摩尔定律失效的今天,硬件厂商很难通过提高主频的方式对CPU的性能进行巨大提升,而当单核性能的延伸遇上瓶颈的时候,水平扩展提供了另一种解决用户的算力需求。在应用串行转并行,单点转分布式后,并行架构必将应运而生。
3)编程语言。应对证券实时交易的现行巨大挑战,使用C/C + +作为主要编程语言是多年来形成的共识,也是性能和编写难度的妥协。近些年诞生的一些新生语言,都在持续尝试即降低编程门槛,也尽可能的接近C/C + +的语言效率,目前已经有了一些不错的实践用例。另外,市场上也诞生另一种编码思路,使用高级语言编写代码再使用工具翻译成C/C + + 语言的代码;高级语言的书写和语法和应用框架高度耦合。这种新的探索也取得了一定的成果。
4)自主可控。从贸易战开始,国内厂商获取芯片的风险剧增,同时前些年的各类安全时间也是敲响了IT行业的警钟。作为资本市场的主要服务方,对于IT技术自主可控领域的技术积累和持续跟踪也是必不可少的,这也是积极响应国家数字化产业的信息创新。在此基础上,鲲鹏平台提供了一种选择。
2.4. 鲲鹏平台的特点
针对于证券实时处理系统的场景,鲲鹏平台带了一些特色:
1) CPU设计。鲲鹏平台的CPU兼容ARMv8的处理指令集,提供了一些迥异于流行的通用平台的设计。其CPU内部DIE内使用RING环的方式传递指令,单个CORE独享L1和L2,提供了多NUMA节点的能力。
2) 多核并行。单颗CPU集成的众多核心,提供了更大的并行吞吐扩展能力。相对流行的的通用平台,也减少了跨内存访问的损耗。
3)SOC集成。目前鲲鹏的设备集成了8Channel DDR4、PCIe4.0、100GE SAS3,0、NVME、RoCEv2 等模块。
4)快速迁移工具。针对C/C + +系统提供了可以解析makefile的鲲鹏代码迁移工具(DevKits),可以快速增加代码的跨平台支持。
3.1. 迁移对象
我们从现有的证券实时处理系统中选调了具有代表性的组件,进行鲲鹏平台的试点适配。
1) 基础库A 。基础库A是一个复合功能包,包括日志、队列、内存分配器、网络管理等功能,同时依赖一部分系统级的软件包和一部分源码级别的软件包。
2)应用系统B。应用系统B全面使用了基础库A构建业务场景,同时是一个位于证券实时处理系统中关键链路的一个子系统,与多个系统存在大量数据交换。
3.2. 实施过程
3.2.1. 环境准备
3.2.1. 环境准备
在鲲鹏设备就绪后,为了保证迁移工作的顺利,还需要进行一些前期准备。对于研发环境处于独立网络时,这些准备工作尤为重要。
1)软件依赖
鲲鹏平台的设备需要安装对应适配的操作系统,其与X86设备下使用的操作系统存在一定的差异性。因此在迁移工作之前,需要梳理出原工程的系统依赖软件清单,并在鲲鹏平台的操作系统中找到对应的软件包。这里如果原工程的操作系统和鲲鹏平台的操作系统使用不同的包管理工具,此时仅仅找到软件包还不够,还需要进行依赖分析,确保对应的软件包包含足够的内容。
从实施角度来说,建议使用和原工程运行的操作系统相同包管理工具的鲲鹏平台的操作系统,同时搭建对应的操作系统软件源。这样能够尽快的完成依赖的安装就绪。
2)二进制文件检查
对于代码量比较庞大的原工程,需要对源码进行扫描,检查出其中附带者直接使用的二进制文件。这种二进制库文件或者可执行文件往往来源于本组件依赖的其他组件或者第三方库,此时需要将此依赖项的源码作前置的库适配工作,直到所有的二进制依赖适配完成 重新构建出基于鲲鹏平台的二进制,替换原有的二进制参与本组件的适配。
当然,这一步也可以等到鲲鹏源码迁移工具安装完成后,扫描并分析。根据分析结果去获取对应制品,或者自行制作。
3) 鲲鹏源码迁移工具和性能分析工具的安装
登录鲲鹏的官网可知己而获得该工具完善的安装手册和使用手册。需要注意的是,工具的安装环境目前不支持数据另分区存储。笔者目前安装时,仍需要保证用户目录必须为$HOME/$USRNAME。
3.2.2. 基础代码迁移
目前使用华为鲲鹏源码迁移工具可以很轻松的做完基础的代码迁移。迁移工具提供了图形化的方式进行代码的静态扫描,能够提供类似于现代IDE的代码修复提示以及交互式修改的方式快速的完成基础代码的修改。下图是一个基础修改的代码示例。
华为鲲源码迁移工具还提供对代码的弱内存序的扫描。尤其是对于X86平台迁移的代码,需要进行弱内存序的加固。目前对于弱内存序,迁移工具只能做到初步揭示,需要根据使用使用的场景,修改响应的代码。以下是一个弱内存序的示例。在X86平台下,程序的输出为1;不修改代码在ARM上运行可能是0也可能是1;这里修改成release-acquire模型之后,输出符合预期。
3.2.3. 迁移验证
完成了基础的代码迁移,并不意味着整个迁移工作的完成。这时候,如果开发测试的迭代一样,需要进行持续的验证和修订。每一步不通过后修改代码后,均需要按照顺序重新进行验证。
3.3. 结果印证
3.3.1. 对比方案
1)构建设备鲲鹏平台目前提供两种装机的OS:基于Redhat的CentOS和基于openEuler的Kylin V10。对于本次适配,各需要选出一台搭配对应OS的主机作为代码完成迁移之后,进行构建的编译环境。
2)基准测试对照组
对照组提供了两个角度:基于鲲鹏的不同OS的主机运行的基准测试和鲲鹏设备和X86设备运行的基准测试分别对应鲲鹏的OS开箱即用能力和鲲鹏设备对于通用X86服务器的能力。同时每个对照组分为两个场景测试:同子网和跨子网。
3.4. 性能调优
初步的基准测试结果并不能代表该平台本身的能力,因此对于基准测试还需要进行性能调优的来不断的探索其天花板。具体的调优手段包括:
1)使用NUMA绑核。针对程序运行的特征,将数据共享的进程绑定在一组NUMA节点上,减少内存的跨区访问,提高L3的利用率,这是进程调优的常规手段。
2) 使用高版本编译器。通过使用Glibc2.31版本的编译器新增特性(流水线&平台指令集),优化代码生成的二级制程序。
3)内存屏障优化。使用一些高效的内存屏障写法,比如对于atomic原子类型,使用fetch_add(1,std::memory_order_relaxed)替代自增操作可以保证内存屏障的作用域尽可能的小,减少等待消耗。
4)调整CPU预取和升级内核。通过调整BIOS参数更改CPU预取配置以及升级内核版本,优化内核的资源调度方式,可以优化指令集的处理速度,提高进程性能。还可以修改内核的TLB页表大小,提高命中率,增强页表查询性能,提高程序的运行效率。
5)使用鲲鹏性能分析工具。使用鲲鹏性能分析工具内置的C/C++性能分析工具可以全方位的记录程序运行时的性能活动结果,并给出一定的代码优化建议。
3.5. 迁移结果
本次迁移工作历时五周,其中环境准备耗时8天,代码迁移耗时5天,性能调优耗时10天;工程代码规模百万级,实际变更代码约500行。经过性能调优之后,鲲鹏平台并行场景下的基准测试单核与X86平台(至强6254)基本持平 。基于Kylin V10的鲲鹏在尚未进行内核参与调优的情况下与基于CentOS的鲲鹏设备进行深度调优后的基准测试结果接近。
本文主要介绍了证券实时处理系统在鲲鹏平台上的迁移实践。目前行业内对鲲鹏平台的代码迁移特别是C/C++还没有进行广泛的开展。其在迁移完成后,也会带来一些新的问题或者风险。同时其众多核心的硬件架构提供的并行能力,也会催生行业内并行架构的持续演进。我们在持续摸索中,也将进一步验证其成熟度,为行业内提供更多的参考和借鉴价值。
本公众号内容仅供参考。对任何因直接或间接使用本公众号内容而造成的损失,包括但不限于因有关内容不准确、不完整而导致的损失,本公众号不承担任何法律责任。如有问题请反馈至tech_support@sse.com.cn。
--------------------------
上海证券交易所为证券公司、基金管理公司等市场参与者及相关行业机构提供交易技术支持与服务,包括日常交易技术支持、技术交流研讨、市场调查反馈、证券信息技术知识库、测试等服务。
点击"阅读全文"了解详情




