注意

本文档适用于 Ceph 开发版本。

配置目录碎片化

在 CephFS 中,目录在变得非常大或非常繁忙时会碎片化当它们变得非常大或非常繁忙时。这会将元数据拆分,以便它可以在多个 MDS 守护进程之间共享,以及在元数据池中的多个对象之间共享。

在正常操作中,目录碎片化对用户和管理员来说是不可见的,并且这里提到的所有配置设置都应保留其默认值。

虽然目录碎片化使 CephFS 能够在一个目录中处理非常大的条目数量,但应用程序员在创建非常大的目录时应保持谨慎,因为在 CephFS 客户端列出目录等情况下,所有碎片都必须一次性加载,它们仍然有资源成本。

提示

根目录不能被碎片化。

所有目录最初都创建为单个碎片。这个碎片可能被分割以将目录分割成更多碎片,并且这些碎片可能被合并以减少目录中的碎片数量。

分割和合并

当 MDS 识别一个目录碎片需要被分割时,它不会立即进行分割。因为分割会中断元数据 IO,所以使用一个短延迟来允许客户端 IO 的短爆发完成后再开始分割。这个延迟通过mds_bal_fragment_interval配置,默认值为 5 秒。

当分割完成时,目录碎片会被拆分成一个 2 的幂次方数量的新碎片。新碎片的数量由 2 的幂mds_bal_split_bits指定,即mds_bal_split_bits是 2,那么将创建四个新碎片。默认设置为 3,即分割创建 8 个新碎片。

启动分割或合并的标准在以下部分中描述。

大小阈值

当目录碎片的大小超过mds_bal_split_size(默认 10000 个目录条目)时,它有资格被分割。通常这种分割会被延迟mds_bal_fragment_interval,但如果碎片大小超过mds_bal_fragment_fast_factor分割大小的因子,分割将立即发生(这将阻止任何客户端在目录上的元数据 IO)。

mds_bal_fragment_size_max是目录碎片大小的硬限制。如果达到这个限制,客户端在尝试在碎片中创建文件时会收到 ENOSPC 错误。在一个正确配置的系统中,这个限制在普通目录上永远不会达到,因为它们会在很久之前就被分割了。默认情况下,这设置为分割大小的 10 倍,给出一个 dirfrag 大小限制为 100000 个目录条目。增加这个限制可能会导致元数据池中出现过大的目录碎片对象,而 OSD 可能无法处理。

当目录碎片的大小小于mds_bal_merge_size时,它有资格被合并。上面解释的“快速分割”没有合并的等效项:快速分割是为了避免创建过大的目录碎片,合并时没有等效的问题要避免。默认合并大小为 50 个目录条目。

活动阈值

除了根据大小分割碎片外,如果目录碎片的活动超过阈值,MDS 也可能分割目录碎片。

MDS 为目录碎片的读和写操作维护单独的时间衰减负载计数器。衰减负载计数器基于mds_decay_halflife设置进行指数衰减。

在写操作中,写计数器被增加,并与mds_bal_split_wr比较以触发分割,如果超过阈值。写操作包括元数据 IO,如重命名、解链接和创建。

The mds_bal_split_rd阈值基于读操作负载计数器应用,该计数器跟踪 readdir 操作。

The mds_bal_split_rdmds_bal_split_wrconfigs 代表流行度阈值。在 MDS 中,这些被测量为“读/写温度”,这与相应的读/写操作数量密切相关。默认情况下,读阈值是 25000 次操作,写阈值是 10000 次操作,即需要 2.5 倍的读操作数量才能触发分割。

由于活动阈值导致碎片被分割后,它们只根据大小阈值mds_bal_merge_size进行合并,所以

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.