Chinaunix首页 | 论坛 | 博客
  • 博客访问: 164382
  • 博文数量: 22
  • 博客积分: 126
  • 博客等级: 入伍新兵
  • 技术积分: 459
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-26 21:14
文章分类
文章存档

2013年(22)

我的朋友

分类: LINUX

2013-08-04 17:38:01

Q:采用pdflush方式回写脏页的不足?
A:pdflush方式回写脏页最大的问题是pdflush线程会饥饿,导致超时的脏页无法及时的回写.采用pdflush方式回写时,周期性回写(wb_kupdate)和后台回写(background_write)都必须设置wbc->nonblocking=1,因为pdflush是全局的,它负责所有块设备脏数据的回写,如果wbc->nonblocking=0(可以阻塞)且遇到某个块设备拥塞,那么pdflush线程阻塞,可能导致属于空闲块设备的inode得不到回写机会.这就带来下面的情况:如果有进程对文件频繁的写入,制造大量的脏页,balance_dirty_pages()生效,进程被动回写脏页,很快将IO队列塞满,bdi的阻塞标志置位,更坏的情况是,进程发现IO队列已满,还会在IO队列上等待,一有空闲马上填充,导致IO队列长时间置于拥塞状态.此时,如果脏页超时,周期性回写线程启动,运行到generic_sync_sb_inodes()发现bdi的阻塞标志置位,if (wbc->nonblocking && bdi_write_congested(bdi))条件满足(wbc->nonblocking必须置1),退出回写,等待100ms后重试,重试时,发现队列仍然阻塞,多次重试后,出现饥饿,最终导致同一磁盘上的超时脏页都无法回写.

Q:pdflush方式周期性回写超时脏页时,如果遇到有进程对某个文件频繁的写入,回写1024个脏页后,文件还有脏页,但是文件产生脏页的时间是在本次回写之后,因此会将对inode做redirty_tail()处理,将inode放入dirty队列的最后,最坏的情况下会在30秒后才会再次回写1024个脏页,2.6.32对此情况是否有所改进?
A:2.6.32遇到这种情况时会将inode加入到more_io队列,在下一轮中连续回写.

Q:per-bdi方式下,flusher线程只有在处理完毕bdi上所有的bdi_work后,才会回写超时的脏数据,如果balance_dirty_pages()提交bdi_work的速度,跟flusher线程回写的速度匹配,那么wb_check_old_data_flush()岂不是没有执行机会?
A:不会,balance_dirty_pages()提交bdi_work之前会看bdi上是否还有任务未处理,如果有,则会放弃提交.

阅读(1962) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~