注意

本文档适用于 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 都已死亡。

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入