增强实时系统的性能

时间:2020-03-06 14:50:56  来源:igfitidea点击:

首先,我想为金融世界中的实时系统建立可接受的端到端延迟,该延迟小于200ms。好吧,这就是我的追求。在实时系统的设计中,存在可以提高性能(即减少处理时间,提高可伸缩性等)的"设计模式"(或者技术)。

我所追求的一个例子是,使用GUID而不是顺序号来分配主键。 GUID的基本原理是处理程序具有自己的主键生成器,而不会彼此"协商"。这允许并行处理发生并允许缩放。

还有更多。如果可以的话,我会尝试添加到列表中。

  • 使用事件驱动的体系结构(EDA)。
  • 使用消息传递队列来支持EDA。

我向社区的集体智慧鞠躬。谢谢堆!

解决方案

对于一般的实时系统工作,经典的规则是追求可变性并将其杀死。真正的实时性意味着使用静态计划,简化的操作系统,高效的设备驱动程序和严格的优先级。如果我们确实希望计算X在已知的时限T内结束,那么任何动态或者自适应的东西都是不可行的。

在这方面,我想意思不是实时的,我想该系统比读取传感器,计算控制回路,激活执行器要复杂得多。知道约束在这里,还有更多细节会很高兴。

我们已经提到了事件驱动架构,我建议我们看一下暂存事件驱动架构(SEDA)。

阶段本质上是事件队列和对事件进行操作的功能。这种体系结构的"非常规"之处在于,每个阶段都可以在其自己的线程中运行,并且这些功能通常需要异步I / O等。首先以这种方式安排程序很麻烦,但可以实现QoS之类的各种魔术,调整的时间安排等。

请参阅威尔士的伯克利论文和他的网站。我们可能还会看到Minor Gordon(来自英国剑桥)的名为yield的项目。他取得了一些非常好的成绩。看起来该项目起初是针对Python的,但是它也可以用于纯c ++。

尽管听起来很基本,但是大多数业务应用程序中都充满了多余的计算,因此请消除它们。计算的重构是优化模式的基础。每次出现处理周期时,我们都必须询问:

用该周期外的相同输出计算该周期内的值。
作为一个基本的例子:

for(int i=0;i< x/2; i++)
  //do something

在这里,我们可以安全地获取x / 2并在cicle之前进行计算并重用该值(现代编译器现在负责这些琐碎的优化工作)

为了看到此简单规则的后果,我可以为我们提供适用于数据库查询的示例。为了避免两个表的INNER JOIN以获得频繁重复的字段,我们可以违反规范化规则,并将其复制到与具有该值的表有关的表上。这避免了重复的表联接处理,并且可以释放并行化,因为仅一个表需要锁定在事务上。例子:

客户表查询经常需要客户折扣,但是折扣保存在客户类型表中。

除非我们确定它已"损坏",否则请勿"修复"任何东西。

我要做的第一件事是从必须快速运行的程序中清除故障。我会使用我最喜欢的技术。然后,可能会有足够的摆动空间来愚弄建筑。