存储io栈分析 .pptxVIP

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
存储io栈分析

IO栈全景图IO栈简化版IO各层输入输出虚拟文件系统(VFS)提供所有文件相关的系统调用的接口将系统调用和具体的文件系统实现联系起来file、dentry和inodefile:在进程范围内,由fd索引,主要记录进程打开文件的偏移和对应的dentry。打开文件时,先从dcache和icache中查找或创建dentry、inode(类似CPU执行单元只会从L1取数据,数据不在L1时会先将数据加载到L1中)dentry:在文件系统中用ls看到的每个目录项都对应了一个dentry,同一个文件系统的dentry是树状层级关系inode:文件系统中真实存在的文件在内核的表示pagecache的数据结构:基树每个文件都对应了一颗基树,是文件磁盘内容在内存的拷贝本质上是一颗64叉树文件系统数据分配的最小单位:块块最小512字节,最大PAGE_SIZE字节,且PAGE_SIZE必须是块大小的整数倍在内核用buffer_head表达Buffer_head存放了内存块(文件块)在磁盘上的磁盘块号关联了buffer_head的page称为buffer page,可以直接回写文件系统的本质:磁盘块管理分配:文件扩张时,将空闲的磁盘块分配给文件释放:删除文件时,将文件占用的磁盘块归还查询:输入文件块号,输出磁盘块号缓冲读在pagecache层的调用路径aops-readpage()最终调用submit_bio()将读操作提交到通用块层read()的阻塞点1.sys_read()调用文件系统提供的get_block()函数查找文件块号对应的磁盘块号时,读取文件的间接数据块会阻塞2.提交BIO读取page或buffer_head,等待page或buffer_head读取磁盘数据时会阻塞read()示例假定文件系统块大小为1K,一个page含4个块1.fd = open(“foo”,O_RDONLY);2.lseek(fd,50000, SEEK_SET);3.read(fd,buf,4096);在sys_read()函数中,page_index=50000/4096=10,需要读取的数据对应的文件起始块号为:10×4=40,结束块号为434次调用get_block()依次传入的参数为40~43,假定返回的结果为150,251,252,253page相应的文件块在磁盘上是不连续的,需要对每个块启动一次bio操作,读取数据write()的调用路径30秒后,由bdi-flusher线程将脏页回写硬盘Q:sys_write()缓冲写文件时,为什么page都会先转换为buffer page?A:将page转化为buffer page后,page中buffer_head在磁盘上的位置信息可以得知,后续脏页回写就可以直接用page初始化bio,并提交到通用块层。write()的阻塞点1、write_begin()会调用文件系统提供的get_block()函数为buffer_head分配磁盘数据块,分配数据块时需要读取块组描述符,数据块位图,文件的间接数据块等元数据,导致阻塞。2、对数据块部分写入时,为避免破坏数据,需要将数据块的数据从磁盘读出,导致阻塞。3、write()完成后会增加系统脏页的数量,当脏页占内存的比例接近/proc/sys/vm/dirty_ratio时,sys_write()会调用balance_dirty_pages_ratelimited_nr()回写部分脏页,导致阻塞。脏页回写脏页回写的目标?1、脏页产生后在内存中驻留的时间不能太久,避免掉电或系统崩溃导致大量的数据丢失。2、脏页占总内存的比例不能太大,避免分配内存时无足够的内存立即可用。3、超时的脏页回写时,多个脏页文件的公平性。当有多个文件都有脏页需要回写时,不能因为某个文件的脏页非常多,回写时消耗大量的时间,导致其他文件的脏页得不到回写机会。4、超时的脏页回写时,单个文件前后脏页的公平性。当一个文件的脏页较多,在文件前面的脏页被频繁的弄脏时,需要保证文件后面的脏页与前面的脏页有公平的回写机会。buffers和cached的区别buffers和cached都是pagecachebuffers表示直接读取块设备,缓存在块设备基树中的数据,一般来说,这些数据是文件系统使用__bread()读取的元数据执行dd if=/dev/sda of=/dev/zero bs=1M count=100,可以明显的看到buffers在增大cached表示除buffers外,kernel缓存的文件数据,一般来说,是文件系统的文件数据执行dd if=~/A_BIG_FILE of=/dev/zero bs=1M count=100,可以明显的看到cached在增大direct IO绕过pagecache,用户态提交的

文档评论(0)

peili2018 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档