@JeremyFriesner
未来的问题
为了扩展我所说的“未来问题”的含义,我指的是在异步系统中,消息的发送者不知道接收者是否真的跟上了需求。发件人不知道,因为它只知道某个消息缓冲区已接受该消息。然后,当接收者愿意接受时,下面的传输(例如 tcp)继续将消息推送过来。
因此,在压力下,系统可能无法按要求执行,因为消息传输将不可避免地具有有限的能力来吸收接收者尚不能接受的消息。发件人只有在问题已经开始发展之后才发现这一点,到那时,采取任何措施可能为时已晚。
测试当然可以揭示这个问题,但你必须小心,测试确实已经耗尽了传输器吸收消息的能力。只是全速快速爆炸可能具有欺骗性。
当然,同步系统会带来额外的开销(“你准备好了吗?”、“不,还没有”、“现在?”、“是!”、“那么你来了”)发生在异步系统中。因此,平均而言,异步系统会更高效,实际上可能具有更高的吞吐量等。这就是世界上大多数系统实际上是异步的原因,也是系统并不总是达到原始系统的全部容量的原因网络带宽/处理时间可能会建议。在我看来,当接近满负荷时,异步系统往往不会优雅地限制。令牌总线(nb not 令牌环)是同步网络的一个很好的例子,具有完全可靠和确定的吞吐量,但比以太网和令牌环慢一点......
在我的问题中总是有足够的带宽,我选择同步路由是出于成功确定性的原因;我并没有在带宽上损失太多,但我损失了很多风险,这很好。
从同步转换为异步
也许,但它可能没有什么价值。在同步系统中,只有成功地平衡了线程之间的分工,它才能按要求工作。也就是说,有足够多的线程在执行慢速位,因此不会阻碍快速位。弄错了,系统肯定不够快。
但是这样做之后,您就拥有了一个系统,其中每个组件都能够无延迟地继续发送消息,因为它发送到的所有内容都已准备好并正在等待(因为您在平衡工作负载方面的技能和判断力)。因此,如果您确实转换为异步消息传输,那么您所做的就是在这些消息的传输中节省少量时间。您所做的更改不会导致工作负载得到更快的处理。但是,如果节省带宽是目标,那么它也许是值得的。
当然,进行这种平衡可能是一件困难的事情,而且处理 HDD 访问时间、网络等变量可能很难克服。我经常不得不实施“下一个可用”工作负载共享方案。但可以肯定的是,在像我和你一起玩的那些实时信号处理系统中,基本上是在处理像 OpenVPX 的 RapidIO 这样非常可靠的传输,你只是对数据进行求和(不处理数据库、磁盘等),并且数据速率非常高(如今 1GByte/sec 是完全可行的,事实上,我在 13 年前就处理过如此高的数据速率;那是我的工作)。严格同步意味着您要么绝对跟上数据速率,要么绝对不跟上。使用异步,它更像是一个...
适合所有人的实时操作系统!
拥有一个实时操作系统也是一个必不可少的组件,而现在它似乎是用于 Linux 的 PREEMPT_RT 补丁集,它为许多业内人士完成了这项工作。 Redhat 对它进行了预打包(RedHat MRG),但是对于来自 CERN 好心人的免费赠品 Scientific Linux 是好的和免费的!我强烈怀疑,如果使用 PREEMPT_RT,许多系统在接近其容量限制的情况下会更顺畅地工作 - 它可以很好地解决问题。