怎样解决时延

2019年6月21日 | 分类: 【技术】

参考:https://mp.weixin.qq.com/s/g33Ofys_tWc4mS2iEHCYgA?
参考:https://zhuanlan.zhihu.com/p/30495137

低延迟系统结构的起源

现在计算机硬件速度已经足够的快,而且越来越快。我们的交易策略能够实时处理海量数据并立即做出决策。随着时间推移,降低延迟的必要性表现为如下两点︰

1. 机会稍瞬即逝,许多交易策略只有在低延迟环境中才有存在意义;
2. 计算机交易者越来越多,适者生存 —— 意味着速度慢就会被竞争对手挤出市场。

“延迟latency”,可以理解为响应时间,是一个统称。延迟问题涵盖了许多方面的设计,它很难量化。下面是交易策略运行的基本生命周期:

1.    交易所发布实时数据包;
2.    交易所的数据包在公网中传输;
3.    数据包到达我们服务器端的路由器;
4.    路由器转发数据包到内网端口;
5.    适配器解析 UDP/TCP 协议;解析数据包的内容;
6.    适配器将内容转换为内部格式传递至算法交易平台;
7.    数据进入算法交易系统的复杂事件处理(Complex Event Processing,CEP)模块和Tick 数据处理等模块;
8. 复杂事件处理分析按照既定策略数据并发送订单请求;
9. 获得订单反馈,这又要把上面步骤重复一遍;

反复循环。以上任何一步的高延迟都会拉长整个周期,就是说,即使在其它所有的步骤都优化到很好了,如果在某一个步骤出现显著的高延迟,整个系统的优化就失败了。

以下分别介绍上面各部分的延迟优化。

Co-location

延迟优化通常从1、“交易所传输数据包”开始。最容易操作的就是拉近我们的服务器和交易所之间的距离(Co-location)。主机托管是指由把服务器放到交易所来管理的机房。

下面的关系图说明了延时和距离的关系。可以看出,10公里以内的延时差别就已经是微秒级别,不是那么大了。

主机托管是任何针对单一交易所的高频交易系统的必备条件。当系统涉及多家交易所时,就是另外一个问题了。另外,不但要考虑交易所返回订单请求的时间,还要比较不同交易所的 Ping 时间。

传播延迟

传播延迟是指数据在线路上的传播时间受到光速制约。

有几种优化方法能够降低物理距离造成的传播延迟。例如,在芝加哥和纽约之间,普通电缆的数据往返时间估计为 13.1 毫秒,2012 年,一家名为 Spread Networks 的公司则在两座城市之间铺设了超高速光缆,数据往返时间估计优化为 12.98 毫秒。Tradeworx公司则更喜欢微波通信,估计的往返时间降低至 8.5 毫秒。要知道,理论上两座城市间最低的数据往返时间约为 7.5 毫秒。持续创新不但拓展了科学的疆域,也迅速接近了光速的理论极限。最新的激光通信技术已让短距离的微小延迟下降至纳秒级别。

网络处理延迟

网络处理延迟,或者说跳转(hop)延迟,是指由路由器和交换机等造成的延迟。数据包从 A 点到 B 点所需要的跳转数,是算法交易系统中需要优化的下一个部分。

一个跳转hop,是指数据包无需通过路由器或交换机等物理设备就能直接到达过程。比如,假设数据包有两条传输路径,第一条需要两次跳转,第二条需要三次。就跟传播延迟一样,路由器和交换机越多(跳转数越多),跳数越多,延迟越长。

网络处理延迟也可能受到微爆(Microburst)的影响。微爆是指数据传输量瞬时提高,但不一定会影响数据传输的平均速率。由于算法交易系统是基于既定规则进行的,所有算法交易系统可能对会对相似事件作出相似反应。其结果就是,大量系统发送订单会导致系统和目的地之间的数据传输量暴增,最终导致微爆问题。就像我国春运时那段时间买不到票,但平时的铁路是正常的。要避免这种情况,交易系统的带宽通常要设计成比平均速率高得多。

序列化延迟

串行延迟是指按位发送和接收比特时所产生的延迟。例如把一个 1500 字节的数据包序列化后放到 T1 线路 (1544000 bps)上,大约耗费 8 毫秒的序列化延迟。56k 的调制解调器 (57344 bps) 则耗费 200 毫秒,而 1G 的以太网线就只耗费 11 微秒。

中断延迟

中断延迟是指从服务器接收数据包时发生中断,到中断被处理完毕所产生的延迟。硬件或软件由于发生了某种事件需要立即得到处理,由此产生的信号称为中断。处理器将暂停当前活动、保存当前状态、响应中断。每当网络适配器接收到一个数据包时,就会发出一个中断,以立即处理已经接收并存放到缓冲区的比特数据。处理中断所造成的时间延迟不仅会影响新增有效载荷,还会造成处理器现有进程的延迟。

2011年,Solarflare引入了高性能用户态协议栈Open Onload,这种方法采用了“绕过内核(Kernel Bypass)”技术,也就是说,当新的数据包到来时,操作系统的内核不再处理,而直接交到用户空间来处理。整个数据包将由网络适配器映射到用户空间,并在该处得到处理。这种方法彻底避免了中断的发生。

避免内核中断的结果是每个数据包的处理速率也提高了。下面的图表清楚地表明“绕过内核”的优势。

横轴是每秒处理X百万条消息,纵轴是所需时间。 “绕过内核”方式性能可达内核中断方式的4倍。

应用程序延迟

应用程序延迟是指应用程序 — 也就是我们平时说的“交易策略” — 处理所需的时间。

应用程序延迟来源于对数据包、对规则逻辑的处理、计算的复杂性以及编程效率等等。增加处理器的数量一般会显著降低应用程序延迟,增加CPU时钟频率也能达到相同的效果。许多算法交易系统设计成为核心的算法逻辑指定专属的处理器内核,例如系统逻辑等等。这也避免了内核之间相互切换所产生的延迟。

同样,如果程序逻辑已经确定,那么内存的大小和速度也将显著影响延迟。因此,大量交易系统采用了低阶变成语言来针对处理器的特定结构进行优化。一些公司甚至采用“现场可编程门阵列”(Field-Programmable Gate Array,FPGA)将复杂计算逻辑烧到硬件上。

下图反映了成本随着复杂度的增长而增长。

复杂程度

高频算法交易已进入一个竞争激烈的时代。每位参与者都在采用新的方法迫使竞争对手离开舞台,这样也让技术有了突飞猛进的进步。与早期相比,现代的算法交易体系结构是相当复杂的。先进的系统既耗费时间又耗费金钱。

下图是需求和成本的一个比较: