Kafka对PageCache的使用

Kafka百万级吞吐调优:PageCache与零拷贝的完美化学反应 通过合理优化 Kafka 中的 PageCache 和零拷贝技术,可以大幅提升其在百万级吞吐量场景下的性能。PageCache 提供了高效的磁盘 I/O 缓存机制,而零拷贝技术避免了多次内存复制操作,降低了 CPU 占用和内存消耗。结合这两者,Kafka 的吞吐量和性能可以得到显著提升,为高并发、高吞吐量的分布式系统提供更强大的支持。对于希望提升 Kafka 性能的开发者来说,理解并利用 PageCache 与零拷贝的结合,无疑是优化 Kafka 性能的有效手段之一。 阅读详情

page cache & buffer cache

执行free命令,注意到会有两列名为buffers和cached,也有一行名为“-/+ buffers/cache”。

  1. ~ free -m

  2. total used free shared buffers cached

  3. Mem: 128956 96440 32515 0 5368 39900

  4. -/+ buffers/cache: 51172 77784

  5. Swap: 16002 0 16001

其中,cached列表示当前的页缓存(page cache)占用量,buffers列表示当前的块缓存(buffer cache)占用量。用一句话来解释:page cache用于缓存文件的页数据,buffer cache用于缓存块设备(如磁盘)的块数据。页是逻辑上的概念,因此page cache是与文件系统同级的;块是物理上的概念,因此buffer cache是与块设备驱动程序同级的。

page cache与buffer cache的共同目的都是加速数据I/O:写数据时首先写到缓存,将写入的页标记为dirty,然后向外部存储flush,也就是缓存写机制中的write-back(另一种是write-through,Linux未采用);读数据时首先读取缓存,如果未命中,再去外部存储读取,并且将读取来的数据也加入缓存。操作系统总是积极地将所有空闲内存都用作page cache和buffer cache,当内存不够用时也会用LRU等算法淘汰缓存页。

在Linux 2.4版本的内核之前,page cache与buffer cache是完全分离的。但是,块设备大多是磁盘,磁盘上的数据又大多通过文件系统来组织,这种设计导致很多数据被缓存了两次,浪费内存。所以在2.4版本内核之后,两块缓存近似融合在了一起:如果一个文件的页加载到了page cache,那么同时buffer cache只需要维护块指向页的指针就可以了。只有那些没有文件表示的块,或者绕过了文件系统直接操作(如dd命令)的块,才会真正放到buffer cache里。因此,我们现在提起page cache,基本上都同时指page cache和buffer cache两者,本文之后也不再区分,直接统称为page cache。

下图近似地示出32-bit Linux系统中可能的一种page cache结构,其中block size大小为1KB,page size大小为4KB。

page cache中的每个文件都是一棵基数树(radix tree,本质上是多叉搜索树),树的每个节点都是一个页。根据文件内的偏移量就可以快速定位到所在的页,如下图所示。关于基数树的原理可以参见英文维基,这里就不细说了。

接下来就可以把Kafka扯进来了。

Kafka对page cache的利用

Kafka为什么不自己管理缓存,而非要用page cache?原因有如下三点:

  • JVM中一切皆对象,数据的对象存储会带来所谓object overhead,浪费空间;
  • 如果由JVM来管理缓存,会受到GC的影响,并且过大的堆也会拖累GC的效率,降低吞吐量;
  • 一旦程序崩溃,自己管理的缓存数据会全部丢失。

Kafka三大件(broker、producer、consumer)与page cache的关系可以用下面的简图来表示。

producer生产消息时,会使用pwrite()系统调用【对应到Java NIO中是FileChannel.write() API】按偏移量写入数据,并且都会先写入page cache里。consumer消费消息时,会使用sendfile()系统调用【对应FileChannel.transferTo() API】,零拷贝地将数据从page cache传输到broker的Socket buffer,再通过网络传输。

图中没有画出来的还有leader与follower之间的同步,这与consumer是同理的:只要follower处在ISR中,就也能够通过零拷贝机制将数据从leader所在的broker page cache传输到follower所在的broker。

同时,page cache中的数据会随着内核中flusher线程的调度以及对sync()/fsync()的调用写回到磁盘,就算进程崩溃,也不用担心数据丢失。另外,如果consumer要消费的消息不在page cache里,才会去磁盘读取,并且会顺便预读出一些相邻的块放入page cache,以方便下一次读取。

由此我们可以得出重要的结论:如果Kafka producer的生产速率与consumer的消费速率相差不大,那么就能几乎只靠对broker page cache的读写完成整个生产-消费过程,磁盘访问非常少。这个结论俗称为“读写空中接力”。并且Kafka持久化消息到各个topic的partition文件时,是只追加的顺序写,充分利用了磁盘顺序访问快的特性,效率高。

关于Kafka的磁盘存储机制,可以参见美团技术团队的大作。

注意事项与相关参数

对于单纯运行Kafka的集群而言,首先要注意的就是为Kafka设置合适(不那么大)的JVM堆大小。从上面的分析可知,Kafka的性能与堆内存关系并不大,而对page cache需求巨大。根据经验值,为Kafka分配6~8GB的堆内存就已经足足够用了,将剩下的系统内存都作为page cache空间,可以最大化I/O效率。

另一个需要特别注意的问题是lagging consumer,即那些消费速率慢、明显落后的consumer。它们要读取的数据有较大概率不在broker page cache中,因此会增加很多不必要的读盘操作。比这更坏的是,lagging consumer读取的“冷”数据仍然会进入page cache,污染了多数正常consumer要读取的“热”数据,连带着正常consumer的性能变差。在生产环境中,这个问题尤为重要。

前面已经说过,page cache中的数据会随着内核中flusher线程的调度写回磁盘。与它相关的有以下4个参数,必要时可以调整。

  1. /proc/sys/vm/dirty_writeback_centisecs:flush检查的周期。单位为0.01秒,默认值500,即5秒。每次检查都会按照以下三个参数控制的逻辑来处理。
  2. /proc/sys/vm/dirty_expire_centisecs:如果page cache中的页被标记为dirty的时间超过了这个值,就会被直接刷到磁盘。单位为0.01秒。默认值3000,即半分钟。
  3. /proc/sys/vm/dirty_background_ratio:如果dirty page的总大小占空闲内存量的比例超过了该值,就会在后台调度flusher线程异步写磁盘,不会阻塞当前的write()操作。默认值为10%。
  4. /proc/sys/vm/dirty_ratio:如果dirty page的总大小占总内存量的比例超过了该值,就会阻塞所有进程的write()操作,并且强制每个进程将自己的文件写入磁盘。默认值为20%。

由此可见,调整空间比较灵活的是参数2、3,而尽量不要达到参数4的阈值,代价太大了。

单细胞测序数据整合 基于Seurat 联合harmony进行单细胞数据整合分析 阅读详情

相关推荐

手把手教你用VSCode+MCUXpresso搭建i.MX RT1062开发环境(附RT-Thread Nano移植)

本文详细介绍了如何使用VSCode和MCUXpresso工具链搭建i.MX RT1062开发环境,包括工具链安装、工程配置、调试技巧以及RT-Thread Nano实时操作系统的移植方法。通过实战步骤和优化建议,帮助开发者快速掌握这款高性能Cortex-M7 MCU的开发流程,提升嵌入式开发效率。

weixin_27014595的博客 392

Kafka 的页缓冲(PageCache)

页缓冲(PageCache)是操作系统用于缓存磁盘数据的一种机制。当应用程序读取或写入数据时,操作系统会将数据缓存在内存中的页缓冲区,以便后续的读取操作可以直接从内存中获取数据,而不必每次都访问磁盘。这种机制可以显著提高数据的访问速度,减少磁盘 I/O 操作,从而提升系统的整体性能。

My_wife_QBL的博客 1639

锐捷路由器DNS Proxy保姆级配置教程:从零到实战,手把手教你搞定内网域名解析

本文提供锐捷路由器DNS Proxy功能的详细配置教程,从基础环境搭建到实战测试,手把手教你实现内网域名解析。涵盖上游DNS设置、内网域名映射、故障排查等关键步骤,帮助网络管理员快速解决内网访问难题,提升工作效率。

weixin_29284657的博客 553

Page Cache 与 Kafka 那些事儿

Kafka 整体架构 Kafka是大数据领域无处不在的消息中间件,目前广泛使用在企业内部的实时数据管道,并帮助企业构建自己的流计算应用程序。 Kafka虽然是基于磁盘做的数据存储,但却具有高性能、高吞吐、低延时的特点,其吞吐量动辄几万、几十上百万。 Kafka为什么速度快、吞吐量大? Kafka是将消息记录持久化到本地磁盘中的,一般人会认为磁盘读写性能差,可能会对Kafka性能如何保证提...

AI天才研究院 9596

<蓝桥杯软件赛>零基础备赛20周--第16周--GCD和LCM

gcd,lcm

罗勇军的博客 7602

LLaMA Factory添加新模型template的实战解析

本文主要介绍了LLaMA Factory添加新模型template的实战解析,希望对使用大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 实战解析 2.1 检查代码 2.2 修改代码

herosunly的博客 19万+

pagecache kafka

聊聊page cache与Kafka之间的事儿

紫蝶侠的博客 872

YOLOv5 实现 10 种热力图可视化方式教程 | GradCAM XGradCAM ScoreCAM LayerCAM HiResCAM EigenCAM......

10 种热力图可视化方法 ,总有一款适合你

Coding... 5567

Kafka【五】Buffer Cache (缓冲区缓存)、Page Cache (页缓存)和零拷贝技术

传统的主要用于缓存块设备上的数据块,包括文件系统的元数据和数据本身。它的主要目的是提高对块设备的读写性能,减少磁盘I/O操作,从而提升系统整体性能。尽管作为一个单独的概念在较新的Linux内核版本中已经不再单独存在,但它所代表的缓存机制仍然是提高系统性能的重要手段之一。通过缓存块设备上的数据和元数据,能够显著减少磁盘I/O操作,提高文件系统的读写性能。在现代Linux内核中,这种缓存机制已经被整合到统一的缓存机制中,以更好地适应现代计算环境的需求。缓存的对象Page cache:主要用于缓存文件的内容。

小小默:进无止境 3147

【Docker】完美解决拉取镜像超时报错:ERROR: Get https://registry-1.docker.io/v2/

因为我们下载的镜像是外网的镜像资源,所以下载的速度会非常的慢,甚至大概率下载时会报错,所以需要我们配置一个国内的服务器镜像地址,国内服务器镜像地址有很多,这里咱们就说一下阿里镜像加速器的配置方法。

liu_chen_yang的博客 12万+

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力

【YOLOv8改进-注意力机制】LSKNet(Large Selective Kernel Network ):空间选择注意力 (论文笔记+引入代码)。LSKNet能够动态调整其大的空间接收场,以更好地模拟遥感场景中各种对象的范围上下文。据我们所知,这是首次在遥感目标检测领域探索大型和选择性核机制。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 2864

一次CPU sys上涨引发对kafka PageCache的思考

1.CPU sys 上涨背景 配置 机型 A 机型 B CPU 48C 48C MEM 8*32G 12*16G DATA DISK 12*960G SSD 12*4T SSD 线上某个kafka集群由于种种原因,从 24 * 机型 A 置换迁移为 12 * 机型 B。从集群总资源维度看,排除其他客观因素,置换后,CPU总核数少了一半,使用率上升其实也是预期之内的。事实上置换后,集群CPU使用率确实也由原有的 20%提升至 40%,上升了约

大叶子不小的博客 512

新手必看!一步步教您如何获取可用的D音Cookie(为什么我复制的D音Cookie无法正常使用?)

新手必看!一步步教您如何获取可用的抖音Cookie(为什么我复制的抖音Cookie无法正常使用,无法下载无水印视频?)

XiaoqiangClub的博客 1491

kafka18-PageCache高效写以及mmap调用原理

PageCache(页缓存)是Linux操作系统中一种用来缓存文件系统数据的机制。它的主要作用是在内存中缓存从硬盘文件读取的数据,以提高文件访问速度和系统性能。整个过程通过使用 MMAMP 技术和操作系统的高效刷盘机制,使得 Kafka 在处理大量数据时能够实现高性能和低延迟的数据写入和持久化存储。

m0_63833709的博客 1540

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

java pagecache_kafka不利用JVM,而是利用OS pageCache

Kafka 为什么那么快kafka初衷 企业统一,高通量,低延迟。Kafka 是一种高吞吐量的分布式发布订阅消息系统,有如下特性:通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万 [2] 的消息。支持通过Kafka服务器和消费机集群来分区消息。支持Hadoop并行数据加载生产快pr...

weixin_39874589的博客 225

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【kafka系统】之pagecache和zeroCopy

文章目录kafka1. 什么是pagecache?2. 集群模式 kafka 1. 什么是pagecache? 是操作系统主要实现的磁盘缓存,目的是减少对磁盘io的操作,把磁盘的数据缓存到内存中,把对磁盘的访问转化成对内存的访问。 传统的操作:经历了4次copy kafka实现了0copy,pagecache 2. 集群模式 ...

qq_41346335的博客 546

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

详解Kafka的PageCache机制及消息积压问题

Kafka 的消息写入操作是顺序的,总是追加到日志文件末尾。Kafka 消息积压是指消费者处理消息的速度跟不上生产者发送消息的速度,导致未处理的消息越来越多。:通过 PageCache,Kafka 可以减少数据在内存中的拷贝次数,从而降低 CPU 使用率,提高系统性能。:尽管 PageCache 可以减少磁盘 I/O 操作,但在高并发场景下,仍需关注磁盘 I/O 负载。:通过缓存数据,Kafka 可以快速从内存中读取数据,减少磁盘 I/O 操作。:生产者发送消息的速度过快,超出 Kafka 的处理能力。

xuweilin的博客 659

得物Java面试被问:Kafka的零拷贝技术和PageCache优化

本文深入解析Kafka高性能背后的关键技术:零拷贝和PageCache优化。零拷贝技术通过sendfile系统调用减少数据拷贝次数,将传统IO的4次拷贝简化为2次DMA拷贝,显著降低CPU使用率。Kafka利用PageCache实现高效读写,通过顺序访问和预读机制提升缓存命中率。文章包含性能对比实验,显示零拷贝技术可提升吞吐量2-4倍,并提供生产环境配置优化建议,包括JVM参数、Linux内核调优等。最后总结了常见面试问题,如零拷贝原理、PageCache失效场景等,帮助读者全面掌握Kafka性能优化要点。

xh2277659985的博客 1129

java pagecache_聊聊page cache与Kafka之间的事儿

前言关于Kafka的一个灵魂拷问:它为什么这么快?或者说,为什么它能做到如此大的吞吐量和如此低的延迟?有很多文章已经对这个问题给出了回答,但本文只重点研究其中的一个方向,即对page cache的使用。先简单地认识一下Linux系统中的page cache(顺便也认识一下buffer cache)。page cache & buffer cache执行free命令,注意到会有两列名为buf...

weixin_39714164的博客 443

美团Java后端Java面试被问:Kafka的零拷贝技术和PageCache优化

Kafka通过零拷贝技术和PageCache优化实现高性能消息传输。零拷贝采用sendfile系统调用,将传统4次数据拷贝减少到2次,上下文切换从4次降至2次,显著降低CPU使用率并提升吞吐量。PageCache通过内存缓存热数据,配合顺序读写和预读策略,减少磁盘访问。生产者批量发送和消费者预取机制进一步优化I/O效率。Linux内核参数调优(如调度器选择、TCP缓冲区设置)可最大化硬件性能。这些技术使Kafka单机可达百万TPS,延迟毫秒级,资源利用率高,特别适合大文件传输和高并发场景。

2501_94505843的博客 1488

Kafka高性能核心——pageCache与zeroCopy

PageCache与ZeroCopy PageCache即页面缓存,它是操作系统实现的一种主要的磁盘缓存,它的目的就是减少对磁盘IO的操作。 具体来说,就是把磁盘中的数据缓存到内存里,然后把对磁盘的访问变成对内存的访问。 目前很多一些主流的框架或者架构设计,为了弥补性能上的差异,基本上都是用“磁盘”做缓存的,也就是说可以把所有内存当做磁盘用。 相信很多做过高并发项目的一些小伙伴们都会知道,我们一开始最早期可能会读关系型数据库,关系型数据库一旦压力大了,大家可能就会想到的策略是分库分表,分库分表也可能不满足我

qq_45455361的博客 3484

Kafka高性能揭秘 —— sequence IO、PageCache、SendFile的应用详解 - Kafka面试

大家都知道Kafka是将数据存储于磁盘的,而磁盘读写性能往往很差,但Kafka官方测试其数据读写速率能达到600M/s,那么为什么Kafka性能会这么高呢?首先producer往broker发送消息时,采用batch的方式即批量而非一条一条的发送,这种方式可以有效降低网络IO的请求次数,提升性能。此外这些批次消息会"暂存"在缓冲池中,避免频繁的GC问题。批量发送的消息可以进行压缩并且传输的时候可以进行高效的序列化,从而减少数据大小。

智海观潮的博客 686

kafka高性能解密 pagecache sendfile

转载自http://blog.youkuaiyun.com/stark_summer/article/details/50144591kafka作为时下最流行的开源消息系统,被广泛地应用在数据缓冲、异步通信、汇集日志、系统解耦等方面。相比较于RocketMQ等其他常见消息系统,Kafka在保障了大部分功能特性的同时,还提供了超一流的读写性能。本文将针对Kafka性能方面进行简单分析,首先简单介绍一下Kafka...

lei1291的博客 5630

kafka08-生产者消息发送流程详解2:PageCache持久化

生产者客户端向 Broker 端循环生成发送数据请求。

m0_63833709的博客 1285

Kafka为什么快?零拷贝与PageCache底层原理深度解析

在高性能消息队列领域,Kafka的吞吐能力一直备受瞩目,其核心支撑离不开操作系统的两大底层机制:零拷贝与PageCache。零拷贝技术通过减少CPU拷贝和用户态与内核态的切换次数,让数据在内核空间高效流转,而PageCache则利用内存缓存文件页,显著加速磁盘读写。理解这些原理,不仅有助于掌握Kafka高性能的根源,还能在消息积压、延迟排查等真实场景中精准定位瓶颈。本文从传统IO的拷贝链路出发,对比mmap与sendfile的实现差异,深入剖析Kafka读写路径如何依赖PageCache,并结合刷盘参数、内

weixin_32597009的博客 126
上一篇: mysql 修改某字段的格式为 utf8mb4
下一篇: GC日志可视化分析工具GCeasy和GCViewer
qq_34412985
博客等级 码龄11年 143粉丝 983原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值