注意

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

清除队列

MDS 维护一个称为 清除队列 的数据结构,负责管理和执行文件的并行删除。每个 MDS 秩都有一个清除队列。清除队列由清除项组成,其中包含来自 inode 的名义信息,例如大小和布局(即,所有其他不需要的元数据信息都会被丢弃,使其独立于所有元数据结构)。

删除过程

当客户端请求删除目录(例如 rm -rf)时

  • MDS 将文件和子目录(清除项)从 pq(清除队列)日志排入清除队列。

  • 在后台以小块和可管理块的方式处理 inode 的删除。

  • MDS 指示底层 OSD 清理数据池中相关的对象。

  • 更新日志。

注意

如果用户删除文件的速度快于清除队列处理的速度,那么数据池的使用量可能会随着时间的推移而大幅增加。在极端情况下,清除队列积压会变得非常庞大,以至于会减缓容量回收,并且 CephFS 的 linux du 命令报告的数据可能与 CephFS 数据池不一致。

MDS 在内部使用一些可调配置来限制清除队列处理

filer_max_purge_ops

清除条带范围(例如 MDS 日志)的最大正在进行的操作数

类型:

uint

默认值:

10

mds_max_purge_files

要并行清除的最大已删除文件数

类型:

uint

默认值:

64

mds_max_purge_ops

并行执行的最大清除操作数

类型:

uint

默认值:

8Ki

mds_max_purge_ops_per_pg

每个 PG 执行的并行清除操作数

类型:

float

默认值:

0.5

通常,默认值足以满足大多数集群的需求。但是,对于非常庞大的集群,如果出现诸如 pq_item_in_journal(待删除项的计数器)达到天文数字的情况,则可以将配置调整为默认值的 4-5 倍作为起点,进一步的增量取决于更多要求。

从最简单的配置 filer_max_purge_ops 开始,这应该有助于更快地回收空间

$ ceph config set mds filer_max_purge_ops 40

增加 filer_max_purge_ops 应该适用于大多数集群,但如果不行,则继续调整其他配置

$ ceph config set mds mds_max_purge_files 256
$ ceph config set mds mds_max_purge_ops 32768
$ ceph config set mds mds_max_purge_ops_per_pg 2

注意

设置这些值不会立即破坏任何东西,除非它们控制了我们向底层 RADOS 集群发出的删除操作数量,但是如果设置的值高得惊人,可能会占用一些集群性能。

注意

清除队列不是一个根据正在发生的事情自动调整其工作限制的系统。因此,建议在根据集群大小和工作负载调整配置时做出有意识的决定。

检查清除队列性能计数器

分析 MDS 性能转储时,清除队列统计信息如下所示

"purge_queue": {
    "pq_executing_ops": 56655,
    "pq_executing_ops_high_water": 65350,
    "pq_executing": 1,
    "pq_executing_high_water": 3,
    "pq_executed": 25,
    "pq_item_in_journal": 6567004
}

让我们了解每个的含义

名称

描述

pq_executing_ops

正在进行的清除队列操作

pq_executing_ops_high_water

记录的最大正在执行的清除操作数

pq_executing

正在删除的清除队列文件

pq_executing_high_water

最大正在执行的文件清除数

pq_executed

已删除的清除队列文件

pq_item_in_journal

日志中剩余的清除项(文件)

注意

pq_executingpq_executing_ops 看起来可能相似,但有一个细微差别。pq_executing 跟踪清除队列中的文件数,而 pq_executing_ops 是清除队列中所有文件的 RADOS 对象计数。

由 Ceph 基金会为您呈现

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