注意
本文档适用于 Ceph 的开发版本。
回写节流
以前,当处理大量小 IO 时,filestore 存在一个问题。我们通过日志隐式地限制脏数据,但是大量的 inode 可能会被弄脏而不会填满日志,导致当同步最终发生时,同步时间非常长。flusher 并不是解决这个问题的合适方案,因为它过于急切地强制回写小写入,从而扼杀了性能。
WBThrottle 按 lru 顺序跟踪每个 hobject_t 的未刷新 io 和 ::fsyncs,一旦脏字节、脏 io 或脏 inode 中的任何一个超过 start_flusher 阈值。当这些中的任何一个超过 hard_limit 时,我们会在 _do_op 中阻塞 throttle()。
请参阅 src/os/WBThrottle.h, src/osd/WBThrottle.cc
为了通过回写过程跟踪打开的 FD,现在有一个 fdcache 来缓存打开的 fd。lfn_open 现在返回一个缓存的 FDRef,一旦所有引用都过期,它就会隐式关闭 fd。
Filestore 同步有一个副作用,即刷新 wbthrottle 中的所有未决对象。
当最后一个链接被删除时,lfn_unlink 清除未链接对象的缓存 FDRef 和 wbthrottle 条目,并断言该对象的所有未决 FDRef 都已死亡。