Kafka 日志存储 — 磁盘存储

Kafka 依赖与磁盘来存储和缓存消息,采用文件追加的方式来写入消息。顺序写盘的速度快于随机写内存。

1 磁盘存储

除顺序写入外,Kafka中大量使用了页缓存、零拷贝等技术来进一步提升吞吐性能。

1.1 页缓存

页缓存是操作系统实现的一种磁盘缓存,以此来减少对磁盘I/O的操作。

图 进程读取及写入数据流程

1.1.1 刷盘

将脏页写入到磁盘的过程叫做刷盘。

vm.dirty_background_ratio

当脏页数量达到系统内存的百分之多少之后就会触发刷盘(异步)。默认值为10。

vm.dirty_ratio

当脏页数量达到系统内存的百分之多少之后就立马进行刷盘(同步)。默认值为20。

表 Linux 控制刷盘时机的参数

Kafka同样提供了同步刷盘及间断性强制刷盘的功能,但是不建议使用,刷盘任务应交由操作系统去调配。

1.1.2 未使用进程内的缓存

进程会在其内部缓存处理所需的数据,然后这些数据有可能还缓存在页缓存中,因此同一份数据有可能被缓存了两次。

在Java中,对象的内存开销非常大,通常会是真实数据大小的几倍,空间使用率低下。Java的垃圾回收会随着堆内数据的增多而变得越来越慢。

使用页面缓存可以省去进程内部的缓存消耗,同时通过紧凑的字节码来代替使用对象的方式来节省更多的空间.

此外,即使Kafka服务重启,页缓存还是会保持有效,而进程内的缓存却需要重建。

1.1.3 swap 分区

当物理内存(非磁盘,而是相对于虚拟内存)不够时,Linux会使用磁盘的一部分作为swap分区,将非活跃的进程调入swap分区,来把内存空出来给活跃的进程。

通过vm.swappiness参数来进行调节,其上限为100,表示积极使用swap分区,并把内存上的数据及时地搬运到swap分区中,下限为0,表示任何情况下都不要发生交换。

对于Kafka而言,尽量避免这种内存交换,否则会对它的各方面性能产生很大的负面影响。建议将这个参数值设置为1。

1.2 磁盘I/O流程

图 应用与磁盘I/O操作流程

写操作:用户调用fwrite把数据写入C库标准IObuffer后就返回,写操作通常是异步操作。C库不会立即将数据刷新到磁盘,会将多次小数据量相邻写操作先缓存起来合并,最终调用write一次性写入页缓存。内核的pdflush线程不停检测脏页,判断是否要写到磁盘,如果是,则发起磁盘I/O请求。

读操作:用户调用fread到C库IObuffer中读取数据,如果成功则返回,否则页缓存读取数据,如果成功则返回,否则发起磁盘I/O请求,读取后将数据缓存到页缓存和C库的IObuffer,并返回。读操作是同步操作。

I/O请求:通用块层根据I/O请求构造一个或多个bio(block I/O,阻塞式I/O模型)结构并交给调度层。调度层将bio结构进行排序和合并组织成队列:将一个或多个进程的读操作合并到一起读,将一个或多个进程的写操作合并到一起写,尽可能变随机为顺序,读必须优先满足。

1.2.1 Linux的I/O调度策略

算法

介绍

优缺点

NOOP

No Operation,无操作调度器。采用FIFO(先进先出)策略,按照I/O请求到达的顺序进行处理。在这基础上,会尝试合并相邻(物理地址相邻)的I/O请求:

当一个新的I/O请求到达时,会检查这个请求是否可以和队列种某个请求合并(减少磁盘转动次数)。

优点:低延迟、高吞吐量、简单高效。

缺点:请求饥饿问题、磁盘寻道开销大、缺乏适应性。

CFQ

Completely Fair Queuing,完全公平排队。默认的调度算法。为每个进程单独创建一个队列来管理该进程所产生的请求。根据进程的权重和时间片来调度这些请求。并且将I/O请求按照地址进行排序。

优点:公平性,确保每个进程都能获得公平的I/O带宽。较少了磁盘寻道开销。

缺点:处理大量小I/O请求时有延迟;对优先级高的请求响应不够迅速。

DEADLINE

最后期限。在CFQ基础上,解决了I/O请求“饿死”的情况。除了CFQ本身的I/O队列,还分别为读写提供了FIFO队列。读FIFO队列的最大等待时间为500ms,写FIFO队列的最大等待时间为5s。FIFO队列的优先级要比CFQ队列高。

优点:实时性强、公平性、灵活性。

缺点:复杂度高、资源开销更大

ANTICIPATORY

预期的。上面的算法考虑的焦点在于满足零散I/O请求上,对于连续的I/O请求(比如顺序读),并没有做优化。ANTICIPATORY在DEADLINE的基础上,为每个读I/O都设置了6ms的等待时间窗口,在等待期间OS收到了相邻位置的读请求,则合并请求并处理。

优点:通过预测和合并来减少磁盘的寻道次数和旋转延迟。

缺点:如果非连续读请求较少,则延迟会更长。

表 Linux 的I/O调度策略

请求饥饿:在I/O调度过程种,某些I/O请求由于调度算法的不当处理(无法公平、有效地处理所有请求)而长时间得不到服务,导致请求被“饿死”的现象(长时间等待)。

1.3 零拷贝

将数据直接从磁盘复制到网卡设备中,而不需要经过应用程序。

例如:将磁盘中的图片展示给用户。

正常流程为,将磁盘中的数据复制出来放到内存buf中,然后将这个buf通过套接字(Socket)传输给用户。这个过程中,经历了4次复制。

图 非零拷贝技术的复制过程

图 内核模式下零拷贝技术的复制过程

零拷贝技术通过DMA(Direct Memory Access)技术将文件内容复制到内核模式下的Read Buffer中,然后直接传递到网卡设备。这是在内核模式下实现了零拷贝。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot的阳光幼儿园管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

什么是长短期记忆网络?

一、概念 长短期记忆网络(Long Short-Term Memory, LSTM)是一种特殊的循环神经网络(RNN),旨在解决标准RNN在处理长序列时的梯度消失和梯度爆炸问题。LSTM通过引入三个门(输入门、遗忘门和输出门&#xff09…

Unity游戏(Assault空对地打击)开发(1) 创建项目和选择插件

目录 前言 创建项目 插件导入 地形插件 前言 这是游戏开发第一篇,进行开发准备。 创作不易,欢迎支持。 我的编辑器布局是【Tall】,建议调整为该布局,如下。 创建项目 首先创建一个项目,过程略,名字请勿…

996引擎 - NPC-动态创建NPC

996引擎 - NPC-动态创建NPC 创建脚本服务端脚本客户端脚本添加自定义音效添加音效文件修改配置参考资料有个小问题,创建NPC时没有控制朝向的参数。所以。。。自己考虑怎么找补吧。 多重影分身 创建脚本 服务端脚本 Mir200\Envir\Market_Def\test\test001-3.lua -- NPC八门名…

如何看待 OpenAI 的12天“shipmas”发布计划?

openAI的“Shipmas”并非单纯的营销活动,而是在用户增长、技术创新和市场竞争中的综合布局和战略体现。 史上最寒酸的发布会?继十月马斯克在好莱坞电影城高调发布特斯拉三款最新产品(无人出租车、无人巴士、人形机器人)后,十二月,OpenAI CEO 奥特曼宣布 OpenAI 将连续12…

蓝桥杯模拟算法:蛇形方阵

P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 我们只要定义两个方向向量数组,这种问题就可以迎刃而解了 比如我们是4的话,我们从左向右开始存,1,2,3,4 到5的时候y就大于4了就是越界了&…

第31篇:Python开发进阶:数据可视化与前端集成

第31篇:数据可视化与前端集成 目录 数据可视化概述 什么是数据可视化数据可视化的重要性 Python中的数据可视化库 MatplotlibSeabornPlotlyBokehAltair 数据可视化的基本概念 图表类型设计原则交互性与动态性 与前端框架的集成 前端框架概述Flask与Django集成数据…

240. 搜索二维矩阵||

参考题解:https://leetcode.cn/problems/search-a-2d-matrix-ii/solutions/2361487/240-sou-suo-er-wei-ju-zhen-iitan-xin-qin-7mtf 将矩阵旋转45度,可以看作一个二叉搜索树。 假设以左下角元素为根结点, 当target比root大的时候&#xff…

maven的打包插件如何使用

默认的情况下,当直接执行maven项目的编译命令时,对于结果来说是不打第三方包的,只有一个单独的代码jar,想要打一个包含其他资源的完整包就需要用到maven编译插件,使用时分以下几种情况 第一种:当只是想单纯…

联想拯救者R720笔记本外接显示屏方法,显示屏是2K屏27英寸

晚上23点10分前下单,第二天上午显示屏送到,检查外包装没拆封过。这个屏幕左下方有几个按键,按一按就开屏幕、按一按就关闭屏幕,按一按方便节省时间,也支持阅读等模式。 显示屏是 :AOC 27英寸 2K高清 100Hz…

python:求解偏微分方程(PDEs)

1.偏微分方程基本知识 微分方程是指含有未知函数及其导数的关系式,偏微分方程是包含未知函数的偏导数(偏微分)的微分方程。 偏微分方程可以描述各种自然和工程现象,是构建科学、工程学和其他领域的数学模型主要手段。科学和工程中…

Deepseek技术浅析(二):大语言模型

DeepSeek 作为一家致力于人工智能技术研发的公司,其大语言模型(LLM)在架构创新、参数规模扩展以及训练方法优化等方面都达到了行业领先水平。 一、基于 Transformer 架构的创新 1.1 基础架构:Transformer 的回顾 Transformer 架…

13JavaWeb——SpringBootWeb之事务AOP

1. 事务管理 1.1 事务回顾 在数据库阶段我们已学习过事务了,我们讲到: 事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功&am…

Hive:struct数据类型,内置函数(日期,字符串,类型转换,数学)

struct STRUCT(结构体)是一种复合数据类型,它允许你将多个字段组合成一个单一的值, 常用于处理嵌套数据,例如当你需要在一个表中存储有关另一个实体的信息时。你可以使用 STRUCT 函数来创建一个结构体。STRUCT 函数接受多个参数&…

【Redis】List 类型的介绍和常用命令

1. 介绍 Redis 中的 list 相当于顺序表,并且内部更接近于“双端队列”,所以也支持头插和尾插的操作,可以当做队列或者栈来使用,同时也存在下标的概念,不过和 Java 中的下标不同,Redis 支持负数下标&#x…

鸢尾花书01---基本介绍和Jupyterlab的上手

文章目录 1.致谢和推荐2.py和.ipynb区别3.Jupyterlab的上手3.1入口3.2页面展示3.3相关键介绍3.4代码的运行3.5重命名3.6latex和markdown说明 1.致谢和推荐 这个系列是关于一套书籍,结合了python和数学,机器学习等等相关的理论,总结的7本书籍…

【unity游戏开发之InputSystem——06】PlayerInputManager组件实现本地多屏的游戏(基于unity6开发介绍)

文章目录 PlayerInputManager 简介1、PlayerInputManager 的作用2、主要功能一、PlayerInputManager组件参数1、Notification Behavior 通知行为2、Join Behavior:玩家加入的行为3、Player Prefab 玩家预制件4、Joining Enabled By Default 默认启用加入5、Limit Number Of Pl…

[C语言日寄] 源码、补码、反码介绍

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…

记录 | 基于Docker Desktop的MaxKB安装

目录 前言一、MaxKBStep 1Step2 二、运行MaxKB更新时间 前言 参考文章:如何利用智谱全模态免费模型,生成大家都喜欢的图、文、视并茂的文章! MaxKB的Github下载地址 参考视频:【2025最新MaxKB教程】10分钟学会一键部署本地私人专属…

元宇宙下的Facebook:虚拟现实与社交的结合

随着科技的不断进步,虚拟现实(VR)技术逐渐从科幻走入现实,成为人们探索未来社交方式的重要工具。在这一浪潮中,Facebook(现为Meta)作为全球领先的社交平台,正在积极布局虚拟现实和元…