kafka服务端之日志磁盘存储

文章目录

  • 页缓存
  • 顺序写
  • 零拷贝

Kafka依赖于文件系统(更底层地来说就是磁盘)来存储和缓存消息 。 那么kafka是如何让自身在使用磁盘存储的情况下达到高性能的?接下来主要从3各方面详细解说。

页缓存

页缓存是操作系统实现的一种主要的磁盘缓存, 以此用来减少对磁盘I/0 的操作。 具体来说, 就是把磁盘中的数据缓存到内存中, 把对磁盘的访间变为对内存的访问。 为了弥补性能上的差异, 现代操作系统越来越 “ 激进地 ” 将内存作为磁盘缓存, 甚至会非常乐意将所有可用的内存用作磁盘缓存, 这样当内存回收时也几乎没有性能损失, 所有对于磁盘的读写也将经由统一的缓存。

当一个进程准备读取磁盘上的文件内容时, 操作系统会先查看待读取的数据所在的页
(page)是否在页缓存(pagecache)中, 如果存在(命中)则直接返回数据, 从而避免了对物理磁盘的I/O操作;如果没有命中, 则操作系统会向磁盘发起读取请求并将读取的数据页存入页缓存, 之后再将数据返回给进程。 同样, 如果 一个进程需要将数据写入磁盘, 那么操作系统也会检测数据对应的页是否在页缓存中, 如果不存在, 则会先在页缓存中添加相应的页, 最后将数据写入对应的页。 被修改过后的页也就变成了脏页, 操作系统会在合适的时间把脏页中的数据写入磁盘, 以保持数据的一致性。

Linux操作系统中的vm.dirty_background_ra巨o参数用来指定当脏页数量达到系统
内存的百分之多少之后就会触发pdflush/flush/kdmflush等后台回写进程的运行来处理脏页, 一般设置为小千10 的值即可,但不建议设置为0。与这个参数对应的还有一个vm.dirty_ratio参数, 它用来指定当脏页数量达到系统内存的百分之多少之后就不得不开始对脏页进行处理,在此过程中, 新的VO请求会被阻挡直至所有脏页被冲刷到磁盘中。

对一个进程而言, 它会在进程内部缓存处理所需的数据, 然而这些数据有可能还缓存在操作系统的页缓存中, 因此同 一份数据有可能被缓存了两次。 并且, 除非使用DirectI/0的方式,否则页缓存很难被禁止。 此外, 用过Java的人一般都知道两点事实: 对象的内存开销非常大,通常会是真实数据大小的几倍甚至更多, 空间使用率低下; Java的垃圾回收会随着堆内数据的增多而变得越来越慢。 基千这些因素, 使用文件系统并依赖于页缓存的做法明显要优于维护 一个进程内缓存或其他结构, 至少我们可以省去了一份进程内部的缓存消耗, 同时还可以通过结构紧凑的字节码来替代使用对象的方式以节省更多的空间。如此, 我们可以在32GB的机器上使用28GB至30GB的内存而不用担心GC所带来的性能间题。 此外, 即使Kafka服务重启,页缓存还是会保持有效, 然而进程内的缓存却需要重建。 这样也极大地简化了代码逻辑, 因为维护页缓存和文件之间的一致性交由操作系统来负责, 这样会比进程内维护更加安全有效。

Kafka 中大量使用了页缓存, 这是Kafka 实现高吞吐的重要因素之一。 虽然消息都是先被写入页缓存, 然后由操作系统负责具体的刷盘任务的, 但在Kafka中同样提供了同步刷盘及间断性强制刷盘( fsync )的功能,这些功能可以通过 log.flush.interval . messages 、log.flush .int erval .m s 等参数来控制。同步刷盘可以提高消息的可靠性,防止由于机器掉电等异常造成处于页缓存而没有及时写入磁盘的消息丢失。不过笔者并不建议这么做,刷盘任务就应交由操作系统去调配,消息的可靠性应该由多副本机制来保障,而不是由同步刷盘这种严重影响性能的行为来保障 。

Linux 系统会使用磁盘的 一部分作为 swap 分区,这样可以进行进程的调度:把当前非活跃的进程调入 swap 分区,以此把内存空出来让给活跃的进程。对大量使用系统页缓存的 Kafka而言,应当尽量避免这种内存的交换,否则会对它各方面的性能产生很大的负面影响 。我们可以通过修改 vm.swappiness 参数 ( Linux 系统参数〉来进行调节 。 vm. swappiηess 参数的上限为 100,它表示积极地使用 swap 分区,并把内存上的数据及时地搬运到 swap 分区中;vm.swappiness 参数的下限为 0 ,表示在任何情况下都不要发生交换( vm . swappiness=0的含义在不同版本的 Linux 内核中不太相同,这里采用的是变更后的最新解释) ,这样一来 ,当内存耗尽时会根据一定的规则突然中止某些进程。可以将这个参数的值设置为 1 ,这样保留了 swap 的机制而又最大限度地限制了它对 Kafka 性能的影响 。

顺序写

Kafka顺序写磁盘是其实现高性能数据存储的关键技术之一。

  • 日志分段:Kafka的每个分区在磁盘上以日志文件的形式存储,这些日志文件会被切分成多个日志段。新消息会不断追加到当前活跃的日志段末尾,当达到一定条件(如文件大小达到阈值或时间间隔),就会创建新的日志段。

  • 顺序追加:生产者发送到Kafka的消息会按照到达的顺序依次追加到分区日志文件中,不会随机插入或修改中间的内容,保证了磁盘写入是顺序的。

优势

  • 提升写入性能:与随机写相比,顺序写磁盘时磁头移动距离小,减少了寻道时间和旋转延迟,能充分利用磁盘的顺序读写带宽,大幅提升写入速度,使Kafka能处理大量并发写入请求。

  • 提高数据可靠性:顺序写的方式使数据在磁盘上连续存储,降低了数据碎片化和存储错误的风险,同时也便于Kafka进行日志的分段、清理和压缩等管理操作,有助于保证数据的完整性和一致性。

实现条件

  • 底层文件系统支持:Kafka依赖底层文件系统提供的顺序写支持,如常见的ext4、XFS等文件系统都能很好地配合Kafka实现顺序写。

  • 合理配置参数:通过合理设置 log.segment.bytes (日志段大小)、 log.roll.hours (日志滚动时间间隔)等参数,能确保Kafka按预期进行日志分段和顺序写入,避免因参数设置不当导致的写入性能下降。

零拷贝

Kafka 还使用零拷 贝 ( Zero-Copy )技术来进一步提升性能 。 所谓的零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手 。零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换 。 对 Linux操作系统而言,零拷贝技术依赖于底层的 sendfile() 方法实现 。 对应于 Java 语言,
FileChannal.transferTo()方法的底层实现就是 sendfile()方法 。

传统的文件读写中 文件经历了 4 次复制的过程:

  • (1)调用read()时, 文件A中的内容被复制到了内核态下的Read Buffer中。
  • (2)CPU控制将内核模式数据复制到用户模式下。
  • (3)调用write()时, 将用户模式下的内容复制到内核模式下的SocketBuffer中。
  • (4)将内核模式下的SocketBuffer的数据复制到网卡设备中传送。
    在这里插入图片描述

从上面的过程可以看出, 数据平白无故地从内核模式到用户模式 “ 走了一 圈 ” , 浪费了2次复制过程: 第一次是从内核模式复制到用户模式;第二次是从用户模式再复制回内核模式,即上面4次过程中的第2步和第3步。 而且在上面的过程中, 内核和用户模式的上下文的切换也是4次。

如果采用了零拷贝技术, 那么应用程序可以直接请求内核把磁盘中的数据传输给Socket,如图所示。

在这里插入图片描述

零拷贝技术通过 DMA (Direct Memory Access) 技术将文件内容复制到内核模式下的 Read Buffer 中。 不过没有数据被复制到 Socket Buffer, 相反只有包含数据的位置和长度的信息的文件描述符被加到 Socket Buffer 中。 DMA 引擎直接将数据从内核模式中传递到网卡设备(协议引擎)。 这里数据只经历了2次复制就从磁盘中传送出去了, 并且上下文切换也变成了2次。零拷贝是针对内核模式而言的, 数据在内核模式下实现了零拷贝。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES6 Map 数据结构是用总结

1. Map 基本概念 Map 是 ES6 提供的新的数据结构,它类似于对象,但是"键"的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map 也可以跟踪键值对的原始插入顺序。 1.1 基本用法 // 创建一个空Map…

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)

计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas) 文章目录 计算机视觉语义分割——Attention U-Net(Learning Where to Look for the Pancreas)摘要Abstract一、Attention U-Net1. 基本思想2. Attention Gate模块3. 软注意力与硬注意力4. 实验…

韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系

韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系 在当今这个科技日新月异的时代,企业之间的竞争早已超越了单纯的产品质量比拼,**售后服务成为了衡量消费电子行业各品牌实力与客户满意度的关键一环。**深圳市韶音…

机器学习之Transformer 模型

Transformer 模型详解 Transformer 是由 Vaswani et al. 在 2017 年 提出的模型,最初用于 机器翻译 任务,并迅速成为自然语言处理(NLP)领域的标准模型架构。与传统的 RNN(循环神经网络) 和 LSTM(长短期记忆网络) 不同,Transformer 的核心思想是 完全基于自注意力机制…

使用 CloudDM 和钉钉流程化管理数据库变更审批

CloudDM 是一个专为团队协同工作打造的数据库数据管控平台。在管控数据库安全变更的过程中,为提高效率,CloudDM 接入了钉钉,支持实时通知与移动办公,满足广大企业用户的实际需求。 本文将介绍如何使用 CloudDM 和钉钉实现高效的数…

【RabbitMQ的重试配置retry】重试配置不生效原因

在Spring Boot项目中,RabbitMQ的retry重试配置不生效可能由以下原因导致: 核心问题定位 retry:enabled: true # ✅ 配置已开启max-attempts: 3 # ✅ 参数有效但实际未触发重试,可能原因如下: 1. 容器类型不匹配 症状表现 配置…

如何在WPS和Word/Excel中直接使用DeepSeek功能

以下是将DeepSeek功能集成到WPS中的详细步骤,无需本地部署模型,直接通过官网连接使用:1. 下载并安装OfficeAI插件 (1)访问OfficeAI插件下载地址:OfficeAI助手 - 免费办公智能AI助手, AI写作,下载…

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<7>

大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 今天我们一起来学习转移表,回调函数,qsort… 目录 一、转移表1.1 定义与原理1.3…

使用Jenkins实现鸿蒙HAR应用的自动化构建打包

使用Jenkins实现鸿蒙HAR应用的自动化构建打包 在软件开发领域,自动化构建是提高开发效率和确保代码质量的重要手段。特别是在鸿蒙(OpenHarmony)应用开发中,自动化构建更是不可或缺。本文将详细介绍如何使用Jenkins命令行工具实现…

漏洞分析 Spring Framework路径遍历漏洞(CVE-2024-38816)

漏洞概述 VMware Spring Framework是美国威睿(VMware)公司的一套开源的Java、JavaEE应用程序框架。该框架可帮助开发人员构建高质量的应用。 近期,监测到Spring Framework在特定条件下,存在目录遍历漏洞(网宿评分&am…

笔记:理解借贷相等的公式

强烈推荐非会计人士,快速了解会计看这个系列的视频,其中比较烧脑的“借贷相等”公式,这个视频讲解的不错: 4.小白财务入门-借贷记账法_哔哩哔哩_bilibili 比如这里,钱在银行卡重,所以银行存款就是借方…

Java算法技术文章:深入解析排序、搜索与数据结构

引言 在软件开发的世界里,算法不仅是程序设计的基础,更是提升软件性能、优化用户体验的关键。Java,作为一种广泛使用的编程语言,提供了丰富的API和标准库来支持各种算法的实现。本文将深入探讨Java中的排序算法、搜索算法以及一些…

Android15音频进阶之MediaRecorder支持通道(一百零五)

简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀 优质视频课程:AAOS车载系统+…

个人 Vite 构建性能分析插件开发实践

Vite 构建分析插件开发实践 一、开发背景 在个人项目开发中遇到以下问题: 🕒 构建时间波动大(30%)🔍 难以定位耗时模块📈 缺乏构建进度反馈 开发目标: 实现模块级耗时分析提供实时进度预测识…

【Spring】什么是Spring?

什么是Spring? Spring是一个开源的轻量级框架,是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…

学习笔记:机器学习中的数学原理(一)

1. 集合 集合分为有限集和无限集; 对于有限集,两集合元素数相等即为等势; 对于无限集,两集合元素存在一一映射关系即为等势; 无限集根据是否与正整数集等势分为可数集和不可数集。 2. sigmoid函数(也叫…

【信息系统项目管理师-案例真题】2016下半年案例分析答案和详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 试题一【问题1】4 分【问题2】12 分【问题3】3 分【问题4】6 分试题二【问题1】3 分【问题2】4 分【问题3】8 分【问题4】5 分【问题5】5 分试题三【问题1】4 分【问题2】8 分【问题3】5 分【问题4】8 分试题一…

基于javaweb的SpringBoothis智能医院管理系统(源码+文档+部署讲解)

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 运行环境开发工具适用功能说明一、项目运行 环境配置: 运行环境 Java≥8、MySQL≥5.7、Node.js≥14 开发工具 后端&…

JS实现灯光闪烁效果

在 JS中&#xff0c;我们可以实现灯光闪烁效果&#xff0c;这里主要用 setInterval 和 clearInterval 两个重要方法。 效果图 源代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>灯闪烁效果<…

Linux ltrace跟踪入门

文章目录 背景ltrace原理ltrace使用跟踪程序调用库函数跟踪指定pid进程调用 参考 本文介绍ltrace跟踪 背景 ltrace 会拦截并记录正在执行的进程所调用的动态库调用以及该进程接收到的信号&#xff0c;它还可以拦截并打印程序执行的系统调用。 其代码位置在&#xff1a;https:/…