免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: blake326
打印 上一主题 下一主题

[文件系统] 文件写入过程 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2012-10-16 15:04 |只看该作者
学习了

论坛徽章:
0
22 [报告]
发表于 2012-10-29 14:47 |只看该作者
blake326 发表于 2012-10-09 18:27
****************************************************************************************
block_writ ...




突然有了点想法,write写完page之后,实际上只写到了cache,并没有写到物理内存,block_write_end必须把cache刷新到物理内存,要不然后面磁盘驱动把page写到磁盘中的时候,dma读到的物理内存,还不是我们写进去的内容。

之前,一直疑惑着为什么磁盘驱动的page都不需要分配非cache的内存呢,估计就是这原因吧。

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
23 [报告]
发表于 2012-12-02 18:36 |只看该作者
本帖最后由 embeddedlwp 于 2012-12-03 10:52 编辑

回复 1# blake326


感谢楼主分享,能不能对page-writeback.c中的逻辑也分析一下!  比如很重要的一部分: balance_dirty_pages。
   

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
24 [报告]
发表于 2012-12-03 09:52 |只看该作者
回复 1# blake326


ext2_write_begin函数,为什么一定要对新分配的page建立buffer cache呢?

ULK3上说,使用buffer page的情况:

- when reading or writing pages of a file that are not stored in contiguous disk blocks. This happenes either because the filesystem
   has allocated noncontiguous blocks to the file, or because the file contains "hole"
- when accessing  a single disk block(for instance, when reading a superblock or an inode block).

那么某次调用到ext2_write_begin不一定是这两种情况吧? 为什么要建立buffer page呢?


   

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
25 [报告]
发表于 2012-12-03 10:54 |只看该作者
本帖最后由 embeddedlwp 于 2012-12-04 19:34 编辑

分享几个slides给楼主,最近我在看writeback,希望一起研究研究。


论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
26 [报告]
发表于 2012-12-03 11:21 |只看该作者
回复 3# blake326


如果bdi没有工作要处理,并且现在该bdi->wb.task已经空闲了5秒钟以上了,则设置bid的action=KILL_THRREAD。然后break。
=========================================================
如果没有工作要做,并且已经空闲5 min以上,不是5s,会设置KILL_THREAD


假设没有fork,也没有kill的bdi。则default bdi线程睡眠5s钟,或许醒来之后会发现哪个bdi长期不活动可以kill掉了。
=========================================================
貌似这个也不准吧,只有flusher thread空闲5min才会被kill。

如果只是偶尔的对磁盘有写请求的话,一般一个写请求之后,都会5s超时唤醒default bdi线程,然default bdi线程创建并运行一个磁盘的flush线程,在这个flush线程中处理回写,过了5s左右之后这个bdi wb task会被bdi-default kill掉。然后偶然又有写请求产生。
=========================================================
这个也是5min,如果5s就kill掉,也太暴力了

但是wb_do_writeback回写并不是一定会提交写请求给磁盘,一般两种情况满足下才会提交一部分page写请求给磁盘,分别是,page dirty超时30s,另外一个是dirty page比例太高。
=========================================================

- dirty expire time: 30s
- background flush threshold 10%
- dirty throttling threshold 20%


   

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
27 [报告]
发表于 2012-12-03 13:24 |只看该作者
回复 3# blake326


wb_writeback_work的处理。但是,vfs_write中我们只不过将dirty的inode move到了bdi->wb.b_dirty队列。那么wb_writeback_work任务怎么来的呢?
wb_check_old_data_flush() 产生一个for_kupdate的任务通过wb_writeback处理。
wb_check_background_flush()产生一个for_background的任务通过wb_writeback处理。
===========================================
恩,这两个应该是kupdate style和background style获得work的方式,其他获得work的方式还有,sync,fsync。







   

论坛徽章:
0
28 [报告]
发表于 2012-12-03 16:38 |只看该作者
embeddedlwp 发表于 2012-12-03 09:52

ext2_write_begin函数,为什么一定要对新分配的page建立buffer cache呢?

ULK3上说,使用buffer page的情况:

- when reading or writing pages of a file that are not stored in contiguous disk blocks. This happenes either because the filesystem
   has allocated noncontiguous blocks to the file, or because the file contains "hole"
- when accessing  a single disk block(for instance, when reading a superblock or an inode block).

那么某次调用到ext2_write_begin不一定是这两种情况吧? 为什么要建立buffer page呢?


好问题啊,kernel读文件确实按照这样的规则来处理的。
但是,写文件的话,如果page不再内存,kernel是通过buffer head来分别读取整个page的。然后,wait_on_buffer等待所有buffer完成读取。
看了代码,感觉用page方式读取好像也行,但是这样buffer head读取看起来代码比较简单容易处理点。

性能方便估计还好,虽然每个page都通过多个bio(buffer head)提交出去的,后面make_request的时候,如果他们是连续的话,还是会被合并到同一个request中去的(不同的bio)。一个request驱动只要处理一次就ok了。

而且,直接写文件情况应该不多巴。一般先读后写的比较多。

最近,忙于但疼的比较寄存器工作,羡慕bz阿- -





论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
29 [报告]
发表于 2012-12-03 17:01 |只看该作者
blake326 发表于 2012-12-03 16:38
好问题啊,kernel读文件确实按照这样的规则来处理的。
但是,写文件的话,如果page不再内存,kernel是 ...



是不是所有的page都是buffer page? 只是如果一个page的各个block如果在磁盘上不连续就发多个bio,如果连续发一个bio。 求指教!

论坛徽章:
0
30 [报告]
发表于 2012-12-03 17:34 |只看该作者
回复 29# embeddedlwp


    假设block=1024B

    读文件的时候,比如读4个page,如果这四个page都是连续的话,那么产生一个bio。bi_io_vec数量是4个,每个biiovec表示一个page,大小4096B

   写文件的时候,写一个page,如果page不再内存,那么分配一个page,然后用为page分配4个buffer head,每个bufferhead 产生一个bio,大小1024B

   为什么写文件直接用buffer head来读取,这里看到写page顶多一次读取一个page(而读取一次可能读取多个page),可能这也是写文件直接用bufferhead的一个原因吧。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP