每天进步一点点——Linux下的磁盘缓存

一文了解Linux磁盘缓存机制 最近遇到了一起跟磁盘相关的线上故障,借此总结一下之前不太了解的Linux磁盘缓存相关的知识。总的来说磁盘缓存出现的原因大概有两个:第一是访问磁盘的速度远慢于访问内存的速度,通过在内存中缓存磁盘内容可以提高访问速度;第二是根据程序的局部性原理,数据一旦被访问过,就很有可能在短时间内再次被访问,所以在内存中缓存磁盘内容可以提高程序运行速度。在这次遇到的线上故障中,根本原因在于在业务逻辑中使用了临时文件做缓存,一个临时文件创建后如果在短时间内删除,这时候对这个文件的操作都是在页缓存内进行,不会实际回写到磁盘。 阅读详情

    前段时间在开发一个使用SSD做缓存的系统,在高速写入数据时会出现大量的磁盘缓存。太多的磁盘缓存如果没有及时的写入磁盘中,在机器出现问题时是非常危险的,这样会导致很多的数据丢失,但是如果实时的将数据刷入磁盘中,这样写入效率有太低了。为了弄明白Linux系统的这种磁盘写入特性,最近深入的学习了一下。
    VFS(Virtual File System)的存在使得Linux可以兼容不同的文件系统,例如ext3、ext4、xfs、ntfs等等,其不仅具有为所有的文件系统实现一个通用的外接口的作用,还具有另一个与系统性能相关的重要作用——缓存。VFS中引入了高速磁盘缓存的机制,这属于一种软件机制,允许内核将原本存在磁盘上的某些信息保存在RAM中,以便对这些数据的进一步访问能快速进行,而不必慢速访问磁盘本身。高速磁盘缓存可大致分为以下三种:
  • 目录项高速缓存——主要存放的是描述文件系统路径名的目录项对象
  • 索引节点高速缓存——主要存放的是描述磁盘索引节点的索引节点对象
  • 页高速缓存——主要存放的是完整的数据页对象,每个页所包含的数据一定属于某个文件,同时,所有的文件读写操作都依赖于页高速缓存。其是Linux内核所使用的主要磁盘高速缓存。
正是由于缓存的引入,所以VFS文件系统采用了文件数据延迟写的技术,因此,如果在调用系统接口写入数据时没有使用同步写模式,那么大多数据将会先保存在缓存中,待等到满足某些条件时才将数据刷入磁盘里。

内核是如何将数据刷入磁盘的呢?在看完以下两点后就能得到答案。

1. 把脏页写入磁盘
    正如我们所了解的,内核不断用包含块设备数据的页填充页高速缓存。只要进程修改了数据,相应的页就被标记为脏页,即把它的PG_dirty标志位置。
    Unix系统允许把脏缓冲区写入块设备的操作延迟执行,因为这种策略可以显著地提高系统的性能。对高速缓存中的页的几次写操作可能只需对相应的磁盘块进行一次缓慢的物理更新就可以满足。此外,写操作没有读操作那么紧迫,因为进程通常是不会因为延迟写而挂起,而大部分情况都因为延迟读而挂起。正是由于延迟写,使得任一物理块设备平均为读请求提供服务将多于写请求。
一个脏页可能直到最后一刻(即直到系统关闭时)都一直逗留在主存中。然而,从延迟写策略的局限性来看,它有两个主要的缺点:
  一、如果发生了硬件错误或者电源掉电的情况,那么就无法再获得RAM的内容,因此,从系统启动以来对文件进行的很多修改就丢失了。
  二、页高速缓存的大小(由此存放它所需的RAM的大小)就可要很大——至少要与所访问块设备的大小不同。
因此,在下列条件下把脏页刷新(写入)到磁盘:
  • 页高速缓存变得太满,但还需要更多的页,或者脏页的数量已经太多。
  • 自从页变成脏页以来已过去太长时间。
  • 进程请求对块设备或者特定文件任何待定的变化都进行刷新。通过调用sync()、fsync()或者fdatasync()系统调用来实现。
缓冲区页的引入是问题更加复杂。与每个缓冲区页相关的缓冲区首部使内核能够了解每个独立块缓冲区的状态。如果至少有一个缓冲区首部的PG_Dirty标志被置位,就应该设置相应缓冲区页的PG_dirty标志。当内核选择要刷新的缓冲区时,它扫描相应的缓冲区首部,并只把脏块的内容有效的写到磁盘。一旦内核把缓冲区的所有脏页刷新到磁盘,就把页的PG_dirty标志清0。

2. pdflush内核线程
    早期版本的Linux使用bdfllush内核线程系统地扫描页高速缓存以搜索要刷新的脏页,并且使用另一个内核线程kupdate来保证所有的页不会“脏”太长时间。Linux 2.6用一组通用内核线程pdflush替代上述两个线程。
这些内核线程结构灵活,它们作用于两个参数:一个指向线程要执行的函数的指针和一个函数要用的参数。系统中pdflush内核线程的数量是要动态调整的:pdflush线程太少时就创建,太多时就杀死。因为这些内核线程所执行的函数可以阻塞,所以创建多个而不是一个pdflush内核线程可以改善系统性能。
根据下面的原则控制pdflush线程的产生和消亡:
  • 必须有至少两个,最多八个pdflush内核线程
  • 如果到最近的1s期间没有空闲pdflush,就应该创建新的pdflush线程
  • 如果最近一次pdflush变为空闲的时间超过了1s,就应该删除一个pdflush线程
所有的pdflush内核线程都有pdflush_work描述符,其数据结构如下:
类型
字段
说明
struct task_struct
who
指向内核线程描述符的指针
void (*) (unsigned long)
fn
内核线程所执行的回调函数
unsigned long
arg0
给回调函数的参数
struct list head
list
pdflush_list链表的链接
unsigned long
when_i_went_to_sleep
当内核线程可用时的时间(以jiffies表示)
当系统没有要刷新的脏页时,pdflush线程会自动处于睡眠状态,最后由pdflush_operation()函数来唤醒。那么在这个过程中pdflush内核线程主要完成了哪些工作呢?其中一些工作与脏数据的刷新有关。尤其是pdflush通常执行下面的回调函数之一:
    1. background_writeout(): 系统地扫描页高速缓存以搜索要刷新的脏页。
为了得到需要刷新的脏页,就要彻底的搜索与在磁盘上有映像的索引节点相应的所有address_space对象(是一棵搜索树)。由于页高速缓存可能有大量的页,如果用一个单独的执行流来扫描整个高速缓存,会令CPU和磁盘长时间繁忙,因此,Linux使用一种复杂的机制把对页高速缓存的扫描划分为几个执行流。当内存不足或者用户显式的(用户态进程发出sync()系统调用等)调用请求刷新操作时会执行wakeup_bdflush()函数。wakeup_bdflush()函数会调用pdflush_operation()唤醒pdflush内核线程,并委托它执行回调函数background_writeout()。background_writeout()函数有效的从页高速缓存中获得指定数量的脏页,并把它写回磁盘。此外,执行background_writeout()函数的pdflush内核线程只有在满足以下两个条件下才能被唤醒:一是对页高速缓存中的页内容进行了修改,二是引起脏页部分增加到超过某个脏背景阈值。背景阈值通常设置为系统中所有页的10%,不过可以通过修改文件/proc/sys/vm/dirty_background_ratio来调整该值。
    2. wb_kupdate():检查页高速缓存中是否有“脏”了很久时间的页,避免当一些页很久没有被刷新时发生饥饿危险。
 内核在初始化期间会建立wb_timer动态定时器,其的定时间距为dirty_writeback_centisecs文件中所规定的几百分之一秒(通常是500分之一秒,不过可以通过修改/proc/sys/vm/dirty_writeback_centisecs文件调整该值)。定时器函数会调用pdflush_operation()函数,然后将wb_kupdate()函数的地址传入。wb_kupdate()函数遍历页高速缓存搜索陈旧的脏索引节点,把已保持脏状态时间超过30秒的页都写到磁盘,之后重置定时器。
运维 | 清理 Linux 磁盘空间方法汇总 系统磁盘不够用或占满了,导致部分应用或程序无法正常使用。本章节将记录一些常用或常见的方法清理系统磁盘(持续更新中)。 阅读详情

相关推荐

XFS 3.10中文版:高性能文件系统深入解析

XFS起源于Silicon Graphics Incorporated (SGI),是为高并发大容量存储系统设计的高性能文件系统。它的设计理念是在处理大规模数据时,能够提供稳定且快速的数据访问,同时支持高效的存储空间管理和强大的扩展能力。在本案例中,公司对XFS文件系统进行了细致的监控和分析,识别出磁盘I/O是主要的性能瓶颈。通过调整I/O调度器并优化文件系统布局,最终使得随机读写性能提升了30%,顺序写入性能提高了40%。

weixin_35756892的博客 1106

把linux制作成内存系统,把内存当硬盘,提速你的linux系统

场景:电脑内存太大用不了那么多,空着浪费,所以利用起来。内存读写速度高用来缓存或者编译,甚至存临时文件最好不过了~~Windows下有一种叫法叫做内存盘,Linux自然也有,看了Linux中ramdisk,tmpfs,ramfs比较与说明这篇文章后,决定使用tmpfs文件系统。关于tmpfs和VMlinux的内存(VM),包括ram和swap两部分。ram就是你的物理内存,swap就是在装系统的时...

weixin_33045961的博客 565

西门子S7-300PLC系列接线图纸(全套)

西门子300的接线图,做柜子设计时用得到。

Linux内核设计与实现 第十六章 页高速缓存与页回写

页高速缓存(cache) 是Linux内核实现磁盘缓存。它主要用来减少对磁盘的I/0操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。这一章将页回写:将页高速缓存中的变更数据刷新回磁盘的操作。磁盘高速缓存之所以在任何现代操作系统中尤为重要源自两个因素:第一,访问磁盘的速度要远远低于(差好几个数量级)访问内存的速度一ms 和ns的差距,因此,从内存访问数据比从磁盘访问速度更快,若从处理器的L1和L2高速缓存访问则更快。

weixin_55255438的博客 1055

微信蓝果小镇商城小程序前后台完整版

1、App/Common/Conf/db.php 数据库连接参数修改; 2、App/Api/Conf/config.php 微信小程序的appid、secret、mchid、key、notify_url,SELF_ROOT的参数修改; 3、ThinkPHP\Library\Vendor\wxpay\lib\WxPay.Config.php 微信小程序的appid、appsecret、mchid、key参数修改; 4、ThinkPHP\Library\Vendor\WeiXinpay\lib\WxPay.Config.php 微信小程序的appid、appsecret、mchid、key、notify_url参数修改; 5、App/Api/Controller/WxPayController.class.php 50行修改链接 后台登录的用户名是admin,密码是123456

《新视野大学英语》第四册第二单元翻译。PART A

《新视野大学英语》第四册第一单元翻译。PART A

XFS参数优化及测试

(一)测试环境 硬件环境Inspur NF5270M3, CPU E5-2650 v2@2.60GHz(2Sockect * 8Core * 2HT) 8 * 16GB of DDR3@1.33G RAM (NUMA) ASPEED Graphics Family (rev 21)(used in text-only mode) HGST HUS724030ALA640 7200 RPM 2.

helloanthea的专栏 1万+

EndnoteX8 破解版

EndnoteX8 破解版

linux 磁盘缓存设置,Linux下的磁盘缓存

前段时间在开发一个使用SSD做缓存的系统,在高速写入数据时会出现大量的磁盘缓存。太多的磁盘缓存如果没有及时的写入磁盘中,在机器出现问题时是非常危险的,这样会导致很多的数据丢失,但是如果实时的将数据刷入磁盘中,这样写入效率有太低了。为了弄明白Linux系统的这种磁盘写入特性,最近深入的学习了一下。VFS(Virtual File System)的存在使得Linux可以兼容不同的文件系统,例如ext3...

weixin_35653597的博客 2272

员工工作量统计

mfc 管理系统 员工工作量 交大暑期实习项目

基本模型 PINNs : Physics Informed Neural Networks

系列最开始当然要提到很经典的文章 —— Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations 。 这篇文章是布朗大学的助理教授Maziar Rais...

waitingwinter的博客 3万+

Linux磁盘缓存机制

在这次遇到的线上故障中,根本原因在于在业务逻辑中使用了临时文件做缓存,一个临时文件创建后如果在短时间内删除,这时候对这个文件的操作都是在页缓存内进行,不会实际回写到磁盘。当程序出现问题响应变慢时,临时文件存活时间变长,就可能会使其被回写到磁盘上,导致磁盘压力过大,进而影响整个系统。

ldxxxxll的博客 1165

PyTorch实战:5步搞定Res2Net图像分类模型(附完整代码)

本文详细介绍了如何使用PyTorch在5步内构建高性能Res2Net图像分类模型,包括环境配置、核心模块实现、完整网络架构搭建、训练流程优化及模型部署技巧。Res2Net通过多尺度特征融合机制显著提升图像分类性能,附完整代码帮助开发者快速实践。

java5的博客 1024

磁盘高速缓存

<br />相信通过前面的虚拟文件系统VFS及一个具体的Ext2文件系统博文,大家对基本的VFS体系有一个大致的掌握了吧。从本章开始,我们将讨论一些VFS底层的技术细节,磁盘高速缓存就是其中一个重要的技术。磁盘高速缓存是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保留在RAM中,以便对那些数据的进一步访问而不用再访问磁盘。<br /> <br />因为对同一磁盘数据的反复访问频繁发生,所以磁盘高速缓存对系统性能至关重要。与磁盘交互的用户态进程有权反复请求读或写同一磁盘数据。此外,不同的进程可能也需要

云(存储),松(耦合) 8521

抖音风控参数逆向实战:从bd-ticket-guard-client-data到x-tt-session-dtrait的完整攻防解析

本文深入解析抖音风控参数逆向实战,重点剖析bd-ticket-guard-client-data和x-tt-session-dtrait的生成机制与破解方法。通过抓包调试、ECDH密钥生成、RSA与AES双层加密等技术手段,揭示抖音风控系统的核心逻辑,并提供实用的对抗策略与维护建议,助力开发者突破抖音风控限制。

weixin_30335575的博客 678

贪婪投影三角化算法

贪婪投影三角化算法是一种利用点云数据进行曲面重建的方法。其基本思想是通过迭代地连接点云中的邻近点来生成三角形,从而构建出整个表面。这种方法被称为“贪婪”,因为它在每一步仅考虑当前最优的策略,而不考虑全局的最优性。

twnkie的博客 1567

linux缓存详解,Linux磁盘缓存机制详解

磁盘缓存出现的原因大概有两个:一是访问磁盘的速度远慢于访问内存的速度,通过在内存中缓存磁盘内容可以提高访问速度;二是根据程序的局部性原理,数据一旦被访问过,就很有可能在短时间内再次被访问,所以在内存中缓存磁盘内容可以提高程序运行速度。简而言之,Linux磁盘缓存机制是为提高系统对磁盘中资源的访问速度。接下来我们先来详细讲解一下Linux磁盘缓存机制的两大原因:1.局部性原理程序局部性原理:程序在执...

weixin_39774490的博客 1020

【AI大模型:前沿】44、大模型+机器人:从自动化工具到通用智能体的技术革命与应用全景

大模型与机器人的融合催生了“具身智能体”,突破传统机器人智能化缺失、功能单一等瓶颈。大模型赋予机器人三大能力:常识推理(如热牛奶需去包装)、模糊指令解析(如“整理书桌”拆解步骤)、零样本任务泛化(如搭乐高桥)。技术实现上,通过多模态融合(视觉-语言-动作)、仿真训练(虚拟试错)和实时反馈(动态调整动作)形成闭环。主流框架如Google RT-2(端到端动作生成)、斯坦福Q-Transformer(强化学习优化)和Figure 01(ChatGPT驱动人形机器人)各具优势,可适配工业、家庭等场景。该技术正重塑

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2020

linux缓存写入磁盘完成(同步)

《Unix环境高级编程》中提到函数sync,fsync,fdatasync对缓存向磁盘写入数据做了解释: 当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。这种输出方式被称为延迟写。 因此要实现缓存写入磁盘完...

zet的博客 4207

代谢组数据分析(二十八):基于广义估计方程(GEE)的方法探究代谢物与临床表型相关性

本研究利用广义估计方程(GEE)方法对代谢组学数据进行了深入分析,旨在探究代谢物与临床表型之间的相关性。代谢组学数据具有高维性、样本间相关性以及混杂因素的复杂性,传统的统计方法难以有效处理这些问题。GEE方法通过引入相关性结构,能够有效地处理样本间的相关性,并同时调整多个混杂因素,从而提高了分析结果的准确性和可靠性。

专注生信领域 1278

simulink的电动汽车制动系统热管理仿真

本文系统研究了电动汽车制动系统热管理仿真技术。通过建立机电液多物理场耦合模型,分析了不同工况下的动态热平衡特性。提出基于MPC的动态调节和NSGA-II多目标优化算法,使电池温度波动降低60%。创新性采用石墨烯相变材料与微通道液冷复合技术,冷却系统能耗减少40%。研究构建了完整的工程验证平台,涵盖200kW电制动测试台和高精度热成像系统。展望指出,未来将结合Transformer预测和强化学习算法,进一步优化热管理策略。该研究为电动汽车制动系统热管理提供了从理论建模到工程实施的完整解决方案。

xiaoheshang_123的博客 122

linux raid卡缓存,RAID卡的缓存与磁盘自带的缓存的关系

RAID卡的缓存与磁盘自带的缓存的关系RAID卡是否有(启用)缓存对“随机读写”性能有巨大的影响。中高端的RAID卡都有缓存(价格也高)。那么RAID卡的缓存与磁盘自带的缓存是如何设置的?戴尔服务器的perc H710 RAID卡有512M缓存,并带电池。建立阵列的时候(raid5),关于RAID卡缓存的默认选项是:读取策略:自适应写策略:回写磁盘高速缓存策略:禁用属性解释:读取策略:一般要启用,...

weixin_42452460的博客 1591

多智能体记忆架构设计:从分层模型到一致性实践

多智能体记忆架构本质上是一个有状态、分布式、支持遗忘的知识系统。从分层模型入手,结合RBAC隔离、版本向量一致性以及混合存储,可以构建出既灵活又健壮的生产级方案。可微分记忆:让记忆的读写操作嵌入端到端训练。基于大模型的记忆压缩:用LLM自动生成情景摘要,取代规则式遗忘。联邦记忆:不同组织之间的多智能体系统在不共享原始数据的情况下协同记忆。希望本文能为你的多智能体项目提供一块坚实的基石。欢迎在评论区分享你在实践中遇到的记忆架构难题。

Ven%的博客 171
上一篇: 内核缓冲区
下一篇: 13.1 文件I/O的内核缓冲:缓冲区高速缓存
xiaofei0859
博客等级 码龄18年 455粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值