位置: 编程技术 - 正文

深入解析Linux下的磁盘缓存机制与SSD的写入放大问题(linux解析命令)

编辑:rootadmin

推荐整理分享深入解析Linux下的磁盘缓存机制与SSD的写入放大问题(linux解析命令),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:linux内核解析,linux内核解析,-mtime +3详解 linux,linux配置解析,linux深入理解,linux 解析,linux 解析,linux内核深度解析pdf,内容如对您有帮助,希望把文章链接给更多的朋友!

前段时间在开发一个使用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描述符,其数据结构如下:

深入解析Linux下的磁盘缓存机制与SSD的写入放大问题(linux解析命令)

当系统没有要刷新的脏页时,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内核线程只有在满足以下两个条件下才能被唤醒:一是对页高速缓存中的页内容进行了修改,二是引起脏页部分增加到超过某个脏背景阈值。背景阈值通常设置为系统中所有页的%,不过可以通过修改文件/proc/sys/vm/dirty_background_ratio来调整该值。 2. wb_kupdate():检查页高速缓存中是否有“脏”了很久时间的页,避免当一些页很久没有被刷新时发生饥饿危险。 内核在初始化期间会建立wb_timer动态定时器,其的定时间距为dirty_writeback_centisecs文件中所规定的几百分之一秒(通常是分之一秒,不过可以通过修改/proc/sys/vm/dirty_writeback_centisecs文件调整该值)。定时器函数会调用pdflush_operation()函数,然后将wb_kupdate()函数的地址传入。wb_kupdate()函数遍历页高速缓存搜索陈旧的脏索引节点,把已保持脏状态时间超过秒的页都写到磁盘,之后重置定时器。

PS:关于SSD的写入放大问题

现在固态硬盘正在越来越多地被作为服务器磁盘使用。之前在SSD(Solid State Drive)上设计并实现缓存系统用于存储数据块时遇到了一些问题,比如在磁盘写满后,如果老化掉一些最久未使用的数据块后,继续大量写入新的数据,随着时间的推移,写入速度变得比刚开始时慢了许多。为了弄清楚为什么会出现这样的情况,于是在网上搜索了一些关于SSD的资料,原来这种情况是由于SSD硬件设计本身决定的,最终映射到应用程序上该中现象称为写入放大现象(WA: Write amplification),WA是闪存及SSD相关的一个极为重要的属性,这个术语在年被Intel公司和SiliconSystems公司(于 年被西部数据收购)第一次提出并在公开稿件里使用。下面简单讲解一下为什么会出现这种情况以及是怎样一个过程。 SSD的设计完全不同于传统的机械磁盘,其是一个完整的电子设备,没有传统机械盘的读写磁头。因此,在读写数据的时候由于少了磁头在磁道之间的寻道过程所以SSD能提供较高的IOPS性能。也正因为其少了磁头的调度,所以SSD还能减少电量的使用,在数据中心中使用对企业来说是非常有益的。 SSD与传统磁盘相比其有了很大的性能优势,以及较多的优点,但是事物总是有两面性的,其也自身也存在一些问题,写入在SSD中的数据是不可以直接更新的,只能通过扇区覆盖重写,在覆盖重写之前需要先擦除,而且擦除操作又是不能在扇区上做的,只能在磁盘的块上来完成,擦除块之前需要将原有的还有效的数据先读出,然后在与新来的数据一起写入,这些重复的操作不单会增加写入的数据量 ,还会减少闪存的寿命,更吃光闪存的可用带宽而间接影响随机写入性能。

写入放大的解决办法 在实际操作中我们很难完全解决掉SSD写入放大的问题,只能通过某些方法来更有效的减少放大的倍数。一个很简单的办法就是将一块大的SSD硬盘只使用其的一部分容量,比如GB你只是用GB,那么最坏的情况就是写入放大能减少约3倍。当然这种方法有点过于浪费资源了。另外还可以在写数据时采用顺序写入,当SSD被顺序写入时,其写入放大一般为1,但某些因素会影响到该值。 除了上面的方法外,现阶段公认的比较好的方法是TRIM。TRIM位于操作系统层。操作系统使用TRIM命令来通知SSD某个page的数据不需要了,则可以回收。 支持TRIM的操作系统和以往的主要区别是删除一个Page的操作不同。在磁盘时期,删除一个page之后在文件系统的记录信息里将该page的标志位设置为可用,但是并没有将数据删除。使用SSD且支持TRIM的操作系统,在删除一个page时,会同时通知SSD这个page的数据不需要了,SSD内部有一个空闲时刻的垃圾收集进程,在空闲时刻SSD会将一些空闲的数据集中到一起,然后一起Erase。这样每次写操作,就在已经Erase好了的Page上写入新的数据。

虽然其存在写入放大的问题,但是这并没有让我们拒绝使用它。用其来做缓存加速已在很多项目中得到使用,尤其是在数据库缓存项目中,在这些项目中SSD高效的读性能得到了充分的利用。随着Facebook的开源项目Flash Cache的发布,以及Facebook内部的大量使用,Flash Cache已经成为了一个比较成熟的技术方案,这使得更多的公司选择了SSD来做存储或者缓存。

解析Linux系统的平均负载概念 一、什么是系统平均负载(Loadaverage)?在Linux系统中,uptime、w、top等命令都会有系统平均负载loadaverage的输出,那么什么是系统平均负载呢?系统平均负

Linux系统下wget命令的使用教程 一、Linuxwget简介wget是linux上的命令行的下载工具。这是一个GPL许可证下的自由软件。Linuxwget支持HTTP和FTP协议,支持代理服务器和断点续传功能,能够自

Linux系统下配置squid代理服务器的过程详解 简单记录一下Squid透明代理服务器的配置环境:VirtualBox+CentOS6.0+squid-3.1.4-1.el6.i、检查squid是否默认安装,没有安装的先安装复制代码代码如下:[root@Slya

标签: linux解析命令

本文链接地址:https://www.jiuchutong.com/biancheng/353403.html 转载请保留说明!

上一篇:Linux系统中的screen命令基本使用教程(linux系统中的一切都归结为)

下一篇:解析Linux系统的平均负载概念(linux 解析)

  • 支付办公楼维修费
  • 基本户可以开立几个
  • 五联普通发票盖章要求
  • 减免税费期末如何结转
  • 合资公司51%股东的权限
  • 产品因质量问题造成损害的,应当承担责任的主体是
  • 香港公司在大陆设立子公司
  • 建筑公司不需要预缴增值税的有
  • 报税了没有交税可以领发票吗
  • 个体户可以申请公章吗
  • 季度奖金个人所得税怎么算
  • 哪些政府补助可以做收入
  • 账表不一致的原因和根源
  • 如何处理填写错题的问题
  • 企业抵押贷款手续办理流程
  • 股票质押得到的钱怎么算
  • 公司的实收资本是借款,但是利息由公司付,会计怎么做账
  • 银行承兑汇票付款提示期限
  • Linux系统怎么设置常亮
  • windows10安装应用怎么到桌面
  • php中的事务使用是什么
  • 公司买手机怎么做账务处理
  • deepin缩放
  • 为员工租房租金怎么入账
  • PHP:curl_multi_getcontent()的用法_cURL函数
  • 计提本月固定资产折旧会计科目
  • Windows操作系统出现内存错误解决方法
  • 未确认融资收益怎么理解
  • 森林里雾气弥漫,给大家带来了什么困难?
  • PHP:imagecreatefromjpeg()的用法_GD库图像处理函数
  • 哪种审计证据可以查出来
  • 电子发票有哪些种类
  • 工商罚款怎么入账
  • 如何在wordpress嵌入amazon链接
  • ChatGPT 能自己跑代码了!
  • ldd命令详解
  • 购买短期股票
  • 使用van-picker 动态设置当前选中项
  • 公司注销公司名下的房子怎么办
  • python中datetime.datetime
  • 销售车位应怎么交税
  • mysql怎么防止sql注入
  • 将资本公积转为资本会计科目
  • 结汇的汇率差异怎么算
  • 关税征收方式
  • 公司老板个人卡收支公司业务属于什么行为
  • 汽修厂印花税怎么交
  • 银行存款核算如何操作
  • 新注册的公司在企查查上查不到
  • 中标服务费可以税前扣除吗
  • 生产线计提折旧是否会减少现金流
  • 加强备案管理
  • 发出计价是什么意思
  • 如何学会计做账视频
  • 非营利医疗机构由谁批准
  • mysql中字符串函数
  • mysql安装配置教程5.7.25
  • 苹果Mac系统怎么切换输入法
  • windows自带搜索引擎
  • linux中安装jdk1.8
  • win8如何设置
  • linux中的rpm什么意思
  • linux如何查看磁盘信息
  • win8和win10双系统安装教程
  • win8怎么打开桌面
  • opengl的函数
  • linux中查看命令怎么使用
  • python下三角
  • ie内存怎么清理
  • JavaScript中数组包含的属性和方法有哪
  • 如何把多个文本文档合并成一个且分行不重叠
  • 解决js请求服务问题
  • jquery日期控件 datepicker
  • ajax 分页
  • python系统代码
  • 扣税13个点实际支付金额该怎么算
  • 广西发票查询平台
  • 成品油税费具体计算
  • 复函地税务机关对自产货物原材料向上游发函
  • 郑州房管局办事大厅预约
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设