
在本文中,我想以一种流行科学的方式讨论如何优化交易所和银行(HFT)交易平台中的响应时间。 作为参考,我们正在谈论的时间是从数百纳秒到数百微秒。 对于大多数其他应用程序,下面的许多优化方法都是无关紧要的,因为它们没有如此严格的要求。
通常我们以带宽为单位来考虑性能。 例如在Gigaflops。 在这种情况下,优化任务减少为每单位时间执行最大数量的计算或在最短时间内解决问题。 处理器的设计主要是为了获得每单位时间的最大计算量以及与此相同的标准优化技术。
但是,有些应用程序的响应时间更为重要,例如,计算机交易(HFT)中的交易平台,搜索引擎,机器人技术和电信。 响应时间是这种“单一”操作的执行时间,例如,从交易所收到具有当前报价的包裹到发送交易所操作的订单。 实际上,响应时间和吞吐量(每单位时间这种类型的操作数)密切相关,但是区别是根本的。 通常可以简单地通过添加硬件(更多服务器)来提高吞吐量,但是以这种方式改善响应时间是有问题的(峰值负载情况除外)。
使用了几种出色的技术来优化响应时间。 一些同时提高了响应时间和吞吐量,而另一些则以牺牲另一种为代价。 例如,为了提高吞吐量,通常使用缓冲来一次处理一组数据包。 显然,对于单个数据包的响应时间,此方法是有害的。
在交易平台中,响应时间的稳定性也非常重要。 大多数盈亏发生在市场剧烈波动期间,并伴随着异常活跃的活动。 平台必须承受这种载荷。 任何插头都会造成明显的损失。
通常,这种低级响应时间优化是一个复杂的主题,需要对网络堆栈,操作系统的核心,处理器和平台的性能以及有效的线程同步有很好的了解。 我的任务是用一个简单易懂的示例来解释所有这些复杂的事情。
办公室工作
让我们使用以下类比。 想象一群人在办公室里工作。 通过纸上信息的交流(信件)进行交流。 每个字母都包含收件人,发件人和任务。 信件放在办公室的某些桌子上。 有些员工的任务是接收外界的来信并将其放在桌子上。 其他人则从桌子上拿起信件,然后传递给决策者。 每个决策者只能使用某种类型的字母(或任务)。
决策者阅读给他的信,并决定是完成,推迟还是忽略此任务。 执行任务堆叠在单独的表上。 特殊工作者从这张桌子上拿起信件,分发给表演者。 有些信件必须在办公室外答复,例如,向外部发件人发送确认。
为了更接近现实,让我们使情况复杂一些。 例如,办公室是由房间和走廊组成的复杂网络,并且不同类型的工人只能去他们可以进入的某些地方。 正如数学家所说,在不失一般性的前提下,假设我们的办公室在正常情况下每天处理200条消息,平均消息处理时间为5分钟。
因此,我们的任务是最大程度地减少消息处理时间。 在这种情况下,希望最大处理时间不超过平均时间的两倍以上。 也就是说,应该有效地处理突发事件。
那么我们从哪里开始呢? 雇用更多员工的最简单方法是处理更多消息。 寻找快速的工作人员很好,这样可以减少处理时间。 假设我们雇用了Usain Bolt和其他奥运决赛入围者。 也许处理时间已减少到2分钟。 但是很明显,没有朝这个方向进一步发展的地方。 没有人跑得更快。 已达到限制。 将这些方法与计算机进行比较,雇用人员正在购买其他硬件(服务器,处理器,内核)以增加执行线程的数量。 雇用运动员类似于购买最快的铁杆(首先是最高频率)。
也许我们办公室的布局不是最佳的。 必须提供足够的空间以使工人有效地工作。 也许扩大走廊,否则人们不得不让位,浪费宝贵的时间? 让我们扩展。 我们还要稍微增加房间,以使人们在靠近桌子时不会拥挤。 这就像购买一台具有更多核心,更多内存和I / O带宽的服务器。
此外,我们可以改为快递服务,而不是普通邮件,以便与外界交换消息。 在计算机方面,这类似于选择和优化网络设备以及操作系统的网络堆栈。 所有这些都是额外的费用,但是我们认为他们一定会有所回报。
因此,在创新之后,我们的消息处理时间减少到了一分钟。 还可以培训工人以改善沟通和执行过程。 也许这会给15%的人以正确的动力。 他知道我们达到了51秒。 这类似于软件优化。
下一步是设法避免我们快速移动的工人之间发生冲突。 可能的瓶颈是表格的处理方法。 建议员工可以同时访问他们所需的办公桌。 您可以在布局时(放在单独的文件夹中)对表上的消息进行排序,以加快访问速度。 消息也可能具有不同的优先级。 在程序中,这类似于线程同步。 流应具有无限的并行和最大数据访问权限。 解决线程同步问题通常可以大大提高系统吞吐量,并有助于缩短响应时间。 在处理活动突发时,通常很难高估最佳同步算法的影响。
此外,有时工人可能会发现自己身处关门前。 这种性质的其他小问题可能会造成不便和延迟。 建议满足以下条件:给定建筑物中的人员数量永远不能超过其能力,工人的速度不受限制,不采取与主要工作无关的行动,并且没有任何外部人员进入工作流程。 用计算机术语来说,这意味着线程数永远不会超过可用核心数,将平台配置为具有最大频率/性能,关闭经济模式,打开Turbo模式,并且隔离操作系统和其他应用程序的内核,并且(几乎)不影响交易平台。
现在是时候更加仔细地考虑办公室的条件了。 门容易打开吗? 地板打滑了吗? 这与分析与操作系统的交互大约相同。 如果没有任何改进,可以尝试避免使用某些零件。 例如,为什么不尝试通过办公室投递信件,而不是将它们逐个窗口扔出去? 你说不舒服吗 可能不舒服,但是很快。 这类似于在网络堆栈中使用内核旁路方法。
内核旁路不使用操作系统的网络堆栈,而是在用户空间中执行网络堆栈。 这有助于消除系统与用户堆栈之间不必要的数据复制以及消息接收流执行的延迟。 在内核旁路中,接收流通常会主动等待。 他没有坐在操作系统的锁上,而是不断地检查lock变量,直到它允许他执行。
实际上,如果我们开始通过窗口抛出消息,那么我们就可以高效地做到这一点。 最可靠的选择是用手从窗户穿过。 TCP协议中使用了该原理。 这不是最快的选择。 UDP允许您简单地丢弃消息而无需确认。 它更快。 无需等待。 认为这是极限吗? 不,您仍然可以学习如何通过窗口进行投掷,以便字母直接落在所需的表格和所需的文件夹中。 这种方法称为远程直接内存访问(RDMA)。 我认为我们将处理时间从秒减少到35。
还是从头开始建立办公室,而不是使现有办公室适应我们的需求? 这样就提供了理想的工作条件。 也许这样可以将响应时间从几秒缩短到20秒,甚至更少。 自己的办公室设计是使用现场可编程门阵列(FPGA)。 FPGA就像处理器,其硬件经过编程可以解决特定问题。 常规处理器经过编码,可以在某些数据类型上执行一组特定的指令,并且执行线程(不要与应用程序线程混淆)也已固定。 与处理器不同,FPGA没有针对一组指令,数据类型和执行流程进行预编程。 它们针对特定任务进行了编程,并且在此状态下仅能够执行(直到后续的重新编程)。 有效的FPGA编程并非易事。 对程序进行更改也可能需要大量的精力。 尽管FPGA并不意味着要雇用Usain Bolt(频率远低于处理器),但是指令执行的无限并行性可以实现比处理器上更少的消息处理时间。
好吧,总之,我将推荐用于软件的性能分析工具。 英特尔VTuneTM放大器和英特尔处理器跟踪技术可帮助您详细了解浪费CPU时间的位置和原因。
如果您对该主题感兴趣,可以在英特尔开发人员专区(英语)上阅读我的文章,该文章还提供了有关优化响应时间的实用技术提示。
- https://software.intel.com/zh-CN/articles/optimizing-computer-applications-for-latency-part-1-configuring-the-hardware
- https://software.intel.com/zh-CN/articles/optimizing-computer-applications-for-latency-part-2-tuning-applications