注意
本文档适用于 Ceph 开发版本。
清理队列
MDS 维护一个称为清理队列的数据结构,负责管理和执行文件的并行删除。每个 MDS 等级都有一个清理队列。清理队列由清理项组成,这些项包含来自 inode 的标称信息,例如大小和布局(即所有其他不需要的元数据信息都被丢弃,使其独立于所有元数据结构)。
删除过程
当客户端请求删除目录(例如rm -rf
):
MDS 将文件和子目录(清理项)从 pq(清理队列)日志中排队。
在后台以小而可管理的块处理 inode 的删除。
MDS 指示底层 OSD 清理数据池中的相关对象。
更新日志。
Note
如果用户删除文件的速度比清理队列处理的速度快,那么数据池的使用率可能会随着时间的推移而大幅增加。在极端情况下,清理队列的积压可能会变得非常庞大,以至于它会减缓容量回收,并且 CephFS 的du
命令可能与 CephFS 数据池报告不一致的数据。
有几个可调节的配置,MDS 内部使用它们来限制清理队列的处理:
- filer_max_purge_ops
最大并行删除条带范围的操作(例如,MDS 日志)
- type:
uint
- default:
10
- mds_max_purge_files
最大并行删除的文件数量
- type:
uint
- default:
64
- mds_max_purge_ops
最大并行执行的清理操作数量
- type:
uint
- default:
8Ki
- mds_max_purge_ops_per_pg
每个PG执行的并行清理操作数量
- type:
float
- default:
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
Note
设置这些值不会立即破坏任何东西,除非它们控制我们向底层 RADOS 集群发出多少删除操作,但如果设置的值非常高,可能会消耗一些集群性能。
Note
清理队列不是根据其工作限制进行自动调整的系统,与正在发生的事情相比。因此,建议根据集群大小和工作负载在调整配置时做出有意识的决定。
检查清理队列性能计数器
在分析 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 |
日志中剩余的清理项(文件) |
Note
pq_executing
和pq_executing_ops
可能看起来相似,但有一个小细节。pq_executing
跟踪清理队列中的文件数量,而pq_executing_ops
是清理队列中所有文件的 RADOS 对象计数。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.