注意
本文档适用于 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_executing 和 pq_executing_ops 看起来可能相似,但有一个细微差别。pq_executing 跟踪清除队列中的文件数,而 pq_executing_ops 是清除队列中所有文件的 RADOS 对象计数。