问题标签 [lmax]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
191 浏览

eventhandler - 为什么 lmax 干扰器架构使用 2 个干扰器?

在“lmax 中断器架构设计”中,它表明,他们正在接受输入并将其加入输入中断器,并且有多个事件处理程序,如日志、解组、业务逻辑,然后将其加入输出中断器和输出中断器有编组,日志等事件处理程序..

我的疑问是..为什么不将一个破坏器与输入和输出破坏器的所有组合事件处理程序一起使用。我们可以这样处理事件,在业务逻辑处理输出的中断事件之后会调用.??

如果我误解了,请纠正我。

0 投票
0 回答
142 浏览

concurrency - LMAX Disruptor - 事件处理上的顺序和并行数据库/服务调用

我有一个处理来自 Kafka/Redis 流的数据的工作流(不同的任务)。有些任务是顺序的,有些是并行的——在高级任务中,验证->计算->传输。

这里的问题是,许多任务(在某种程度上)需要部署为微服务(在同一网络中)的 Web 服务调用,并且需要一些数据库调用来对收到的每个事件进行计算/转换。(我看到在某些计算逻辑中使用内存数据处理可以提高性能)。

Disruptor来自's的数据库和 Web 服务调用EventHandler<T>是开销吗?这会破坏 Disruptor 吗?如果是这样,是否可以将所需的数据(如果不是全部)保存在内存中,但对于以数据为中心的计算有帮助吗?这是 Disruptor 所期望的吗?

编辑: 经过一番思考,我确信任何此类服务或数据库调用本身都可以在计算作业之前作为另一个事件处理程序(异步)分离出来,以发出所需的必要输入。

让我知道你的想法。

0 投票
1 回答
698 浏览

python-3.x - Python 中的 LMAX 破坏者

是否已经有一个实现(或至少绑定到)Python3?

我可以看到 Github 上的 Java 原始实现,但我没有看到 Python3 的任何内容。

0 投票
0 回答
256 浏览

netty - 与 Netty 处理程序相比,使用 LMAX Disruptor 进行事件处理会降低性能

我写了一个 Netty HTTP 服务器。

我正在寻找处理 Http 请求
选项的正确方法:(1. Netty 处理程序 2. LMAX Disruptor)。

我在某处读到 LMAX Disruptor 非常适合异步事件处理。
但是在负载测试之后,使用 LMAX Disruptor 进行事件处理的服务器提供的吞吐量比 Netty Handler 少 70%。延迟也增加了 200%。
我在 8 核 16gb 盒子上获得了 30k qps。使用 Lmax Disruptor 后,我得到 10k qps。
目前我的服务只是读取 Json 请求并返回静态响应。我只是想比较一下到目前为止的原始性能。

我正在从 SimpleChannelInboundHandler 读取 HttpRequest 并发送到 LMAX Disruptor 事件处理程序并释放下面提到的配置的 netty 工作程序处理程序:

Netty IO 线程:24 和工作线程:48

Disruptor disruptor = new Disruptor<>(new EventFactory(), 65536, DaemonThreadFactory.INSTANCE);

是因为 Disruptor 为每个事件创建了新的守护线程吗?

0 投票
1 回答
102 浏览

java - 破坏者行为 - 在使用新数据之前耗尽整个缓冲区

我有以下情况。

我们在 K8s 上的 Cloud 中对我们的应用程序进行负载测试。我们的入站消息来自 Kafka,我们正在回信给 Kafka。我们的架构是这样的,Kafka 线程将消息推送到中断器(阻塞等待策略,512 大小),业务线程将消息从中断器中取出进行处理。为了模拟负载,我们在应用程序未运行时为 Kafka 主题(4 个分区)准备了接近 500K 的消息。然后我们启动我们的应用程序来测量负载。

我们看到的是中断器完全填满,剩余容量为 0,然后开始耗尽,这种情况一遍又一遍地继续。

这是正确的行为还是我们以错误的方式使用破坏者?请分享你的想法?

0 投票
1 回答
243 浏览

java - LMAX Disruptor 垃圾收集器如何友好

我试图了解 lmax 干扰器如何对 GC 友好。我看到环上的事件对象被重复使用,但是,在这些对象上“设置”的“数据”在堆上,所以感觉垃圾收集的好处仅限于每个事件少 1 个对象。如果“数据”是原始数据类型,那么堆上没有任何额外内容,因此在这种情况下的好处非常明显。每个事件对 GC 的重要性是否减少 1 个对象,或者这比我对 GC 的理解要多。

这篇文章http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html垃圾收集器在这里几乎没有什么可做的——这对我来说不是很明显,因此是这个问题。

0 投票
1 回答
42 浏览

java - LMAX Disruptor剩余容量等于0,甚至在等待一段时间之前

tryPublishEvent我通过调用函数将数据添加到 Disruptor 。在我等待 40 秒并尝试unprocessedDataCount通过以下计算进行检查后:

有时remainingCapacity值等于 0,即使在获得ringBufferUnProcessedCount值之前我们等待 40 秒。这个错误很少发生。

你不知道为什么会这样吗?

0 投票
1 回答
167 浏览

java - 使用 LMAX Disruptor 的单个和多个消费者之间几乎没有性能提升/如何正确解码许多 UDP 数据包

我必须使用 UDP 传输更大的文件(最大 10GB)。不幸的是,在这个用例中不能使用 TCP,因为发送者和接收者之间不可能进行双向通信。

发送文件不是问题。我已经使用netty编写了客户端。它读取文件,对其进行编码(唯一 ID、流中的位置等)并以可配置的速率(每秒数据包)将其发送到目的地。所有数据包都在目的地接收。我已经使用 iptables 和 Wireshark 来验证这一点。

问题出现在收件人身上。每秒接收多达 90K 个数据包工作得很好。但是以这种速率接收解码它是不可能使用单个线程的。我的第一种方法是使用线程安全队列(一个生产者和多个消费者)。但是使用多个消费者并没有带来更好的结果。一些数据包仍然丢失。似乎开销(锁定/解锁队列)减慢了进程。所以我决定将 lmax 破坏器与单个生产者(接收 UDP 数据报)和多个消费者(解码数据包)一起使用。但令人惊讶的是,这也不会导致成功。使用两个 lmax 消费者几乎没有速度优势,我想知道为什么。

这是接收 UDP 数据包并调用中断器的主要部分

我的 lmax事件很简单......

这是我的工厂

制作...

有趣但非常简单的部分是解码器。它看起来像这样。

这里有一些有趣的事实:

  • 所有解码器都运行良好。我看到正在运行的解码器数量
  • 接收到所有数据包,但解码时间过长。更准确地说:解码前两个整数和长值工作正常,但解码有效负载需要太长时间。这会导致“背压”并丢失一些数据包。
  • 有趣的事实:该代码在我的 MacBook Air 上运行良好,但在我的服务器上却无法运行。(MacBook:Core i7;服务器:在 Xeon @2.6Ghz 上具有 8 个虚拟内核且完全无负载的 ESXi)。

现在我的问题,我希望有人有一个想法:

  • 为什么使用多个消费者几乎没有区别?差别只有5%
  • 一般来说:接收 60K(或更多)UDP 数据包并对其进行解码的最佳方法是什么?我尝试将 netty 作为接收器,但 UDP 不能很好地扩展。
  • 为什么解码有效载荷这么慢?
  • 有没有我忽略的错误?
  • 我应该使用另一个生产者/消费者库吗?LMAX 的延迟非常低,但吞吐量呢?
0 投票
0 回答
38 浏览

python - python中LMAX架构中的业务逻辑imp

我正在尝试在Lmax架构中实现破坏者。如您所知,在 lmax 架构中,我们有一个环形缓冲区,用于创建队列来处理数据。在这里你可以看到它的结构: 在此处输入图像描述

我已经在 python 中实现了这个结构,你可以在这里看到:

正如你在图片中看到的,我们在 Lmax 中有一个业务逻辑部分,它从 Ring Buffer 中获取数据到 CPU 中以进行快速处理。不幸的是,我找不到任何文档来实现业务逻辑层。如何使用 python 从环形缓冲区获取数据到 Lmax 中的 cpu 寄存器?

0 投票
1 回答
50 浏览

python - AttributeError:无法获取属性“journalerReader”

我试图在 python 中实现 Lmax。我试图在 4 个进程中处理数据

但我的代码中出现此错误:


您的第一个问题是调用的目标不能Processif __name__ == '__main__':块内。但:

正如我在您之前的一篇文章中提到的,我看到您可以CircularBuffer跨多个进程共享一个实例的唯一方法是实现一个托管类,令人惊讶的是,这并不难做到。但是当您创建托管类并创建该类的实例时,您所拥有的实际上是对该对象的代理引用。这有两个含义:

  1. 每个方法调用更像是对由您将启动的管理器创建的特殊服务器进程的远程过程调用,因此比本地方法调用具有更多开销。
  2. 如果打印引用,__str__则不会调用该类的方法;您将打印代理指针的表示。您可能应该将方法重命名__str__为类似的名称dump,并在需要实例表示时显式调用它。

您还应该明确地等待您正在创建的进程完成,以便管理器服务不会过早关闭,这意味着每个进程都应该分配给一个唯一的变量并具有唯一的名称。