【Kafka】 Efficiency
【Kafka】 Efficiency
Metadata
title: 【Kafka】 Efficiency
date: 2023-02-14 13:55
tags:
- 行动阶段/完成
- 主题场景/组件
- 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
- 细化主题/Module/Kafka
categories:
- Kafka
keywords:
- Kafka
description: 【Kafka】 Efficiency
【Kafka】 Efficiency
我们在提高效率方面付出了巨大的努力。我们的一个主要用例是处理web活动数据,这是非常大的容量:每个页面浏览可能会产生几十个写入操作。此外,我们假设发布的每个消息都被至少一个消费者(通常是多个)读取,因此我们努力使消费尽可能便宜。
我们还从构建和运行许多类似系统的经验中发现,效率是有效的多租户操作的关键。如果下游基础设施服务很容易因为应用程序使用的小变化而成为瓶颈,那么这种小的更改通常会产生问题。通过非常快的速度,我们帮助确保应用程序在基础设施之前就会负载过重。当试图在集中式集群上运行一个支持数十个或数百个应用程序的集中式服务时,这一点尤其重要,因为几乎每天都会发生使用模式的变化。
上一节我们讨论了磁盘效率。在消除了糟糕的磁盘访问模式之后,这类系统的效率低下有两个常见原因:小I/O操作太多,字节复制过多。
这个小的I/O问题发生在客户端和服务器之间以及服务器自身的持久化操作中。
为了避免这种情况,我们的协议是围绕“消息集”抽象构建的,该抽象自然地将消息分组在一起。这允许网络请求将消息分组并分摊网络往返的开销,而不是一次发送一条消息。服务器一次将消息块添加到日志中,而使用者一次获取大量的线性消息块。
这个简单的优化可以带来数量级的速度提升。批处理导致更大的网络数据包、更大的连续磁盘操作、连续的内存块等,所有这些都允许Kafka将突发的随机消息写入流转换为线性写入流,并传输给消费者。
另一个低效的地方是字节复制。在低消息速率下,这不是一个问题,但在负载下,影响是显著的。为了避免这种情况,我们采用了由生产者、代理和消费者共享的标准化二进制消息格式(这样数据块就可以在它们之间传输而无需修改)。
由broker维护的消息日志本身就是一个文件目录,每个文件都由一系列消息集填充,这些消息集以生产者和消费者使用的相同格式写入磁盘。维护这种通用格式可以优化最重要的操作:持久日志块的网络传输。现代unix操作系统提供了高度优化的代码路径,用于将数据从pagecache传输到套接字。在Linux中,这是通过sendfile系统调用完成的。
要理解sendfile的影响,了解从文件到套接字传输数据的公共数据路径很重要:
- 操作系统从磁盘读取数据到内核空间的pagecache
- 应用程序将数据从内核空间读取到用户空间缓冲区
- 应用程序将数据写回到内核空间的套接字缓冲区中
- 操作系统将数据从套接字缓冲区复制到通过网络发送的网卡缓冲区
这显然是低效的,有4个副本和2个系统调用。通过使用sendfile,操作系统可以直接从pagecache将数据发送到网络,从而避免了这种重新复制。因此,在这个优化的路径中,只需要将最后的数据复制到网卡缓存中。
我们期望一个常见的用例是同一个主题上有多个使用者。使用上面的零拷贝优化,数据只被复制到pagecache一次,每次使用时都重用,而不是每次读取时都存储在内存中并复制到用户空间。这允许消息以接近网络连接极限的速度被消耗。
pagecache和sendfile的这种组合意味着,在Kafka集群上,消费者大部分时间都被占用,你将看不到磁盘上的读取活动,因为它们将完全从缓存中提供数据。
TLS/SSL库在用户空间运行(Kafka目前不支持内核中的SSL_sendfile)。由于这个限制,在启用SSL时不使用sendfile。启用SSL配置请参见安全性。协议和安全。interp .broker. Protocol
有关Java中sendfile和零拷贝支持的更多背景知识,请参阅本文。
End-to-end Batch Compression
在某些情况下,瓶颈实际上不是CPU或磁盘,而是网络带宽。对于需要通过广域网在数据中心之间发送消息的数据管道尤其如此。当然,用户可以每次压缩一条消息,而不需要Kafka的任何支持,但这可能会导致非常低的压缩率,因为相同类型的消息之间的重复是冗余的原因(例如,JSON中的字段名称或web日志中的用户代理或常见的字符串值)。高效的压缩要求将多条消息一起压缩,而不是单独压缩每条消息。
Kafka提供了一种高效的批处理格式。一批消息可以聚集在一起压缩并以这种形式发送到服务器。这批消息将以压缩形式写入,并将保持在日志中压缩,仅由使用者解压。
Kafka支持GZIP、Snappy、LZ4和ZStandard压缩协议。更多关于压缩的细节可以在这里找到。