Chronicle Queue:多路复用生产者写入单个队列的推荐方法是什么?
Chronicle Queue: What is the recommended way to multiplex producers to write into a single queue?
假设有 5 个生产者线程和 1 个队列。我似乎有 2 个选择:
为每个生产者线程创建一个附加程序,并发附加并让编年史队列处理同步(启用双缓冲?)
首先同步 5 个生产者线程(无锁机制,例如 disruptor),创建 1 个额外的线程和 1 个写入编年史队列的附加程序
为什么这个问题?
我最初的印象是写入编年史队列是无锁的,因此应该非常快。但是 github 文档多次提到有一个写锁可以序列化并发写入。所以我想知道在编年史队列前面放置一个无锁干扰器是否会提高性能?
你的建议可以提高作者的表现,尤其是如果你有一个昂贵的 serialization/marshalling 策略。但是,如果您正在写入一个真正的磁盘,您会发现驱动器的性能可能是您最大的问题。 (即使是快速的 NVMe 驱动器)您可能会发现读取数据的时间更糟。
假设您花费 1 微秒编写一条 512 字节的消息,并且您正在以 200K/s 的速度编写消息。这意味着您的 80%ile 将因争用而额外等待队列 1 us。但是,您将写入 360 GB/h,因为它会很快填满快速 NVMe 驱动器。相反,如果您的 20K/s 消息量相对较低,则您的 98%ile 延迟增加了 1 us。
简而言之,如果写入争用是一个问题,那么您的驱动器可能是一个更大的问题。添加干扰器可以帮助作者,但会延迟每条消息的读取时间。
我建议首先为实际吞吐量构建延迟基准。您可以通过先写入 Wire 并仅在持有锁时复制字节来自己双重缓冲数据。
假设有 5 个生产者线程和 1 个队列。我似乎有 2 个选择:
为每个生产者线程创建一个附加程序,并发附加并让编年史队列处理同步(启用双缓冲?)
首先同步 5 个生产者线程(无锁机制,例如 disruptor),创建 1 个额外的线程和 1 个写入编年史队列的附加程序
为什么这个问题?
我最初的印象是写入编年史队列是无锁的,因此应该非常快。但是 github 文档多次提到有一个写锁可以序列化并发写入。所以我想知道在编年史队列前面放置一个无锁干扰器是否会提高性能?
你的建议可以提高作者的表现,尤其是如果你有一个昂贵的 serialization/marshalling 策略。但是,如果您正在写入一个真正的磁盘,您会发现驱动器的性能可能是您最大的问题。 (即使是快速的 NVMe 驱动器)您可能会发现读取数据的时间更糟。
假设您花费 1 微秒编写一条 512 字节的消息,并且您正在以 200K/s 的速度编写消息。这意味着您的 80%ile 将因争用而额外等待队列 1 us。但是,您将写入 360 GB/h,因为它会很快填满快速 NVMe 驱动器。相反,如果您的 20K/s 消息量相对较低,则您的 98%ile 延迟增加了 1 us。
简而言之,如果写入争用是一个问题,那么您的驱动器可能是一个更大的问题。添加干扰器可以帮助作者,但会延迟每条消息的读取时间。
我建议首先为实际吞吐量构建延迟基准。您可以通过先写入 Wire 并仅在持有锁时复制字节来自己双重缓冲数据。