注意
本文档适用于 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,例如重命名、取消链接和创建。
mds_bal_split_rd 阈值应用于跟踪 readdir 操作的读取操作负载计数器。
mds_bal_split_rd 和 mds_bal_split_wr 配置代表流行度阈值。在 MDS 中,这些被测量为“读/写温度”,这与相应的读/写操作次数密切相关。默认情况下,读取阈值为 25000 次操作,写入阈值为 10000 次操作,即需要 2.5 倍的读取次数才能触发拆分。
碎片因活动阈值而拆分后,它们仅根据大小阈值 (mds_bal_merge_size) 合并,因此活动峰值可能导致目录永久保持碎片化,除非取消链接一些条目。