注意
本文档适用于 Ceph 的开发版本。
crushtool -- CRUSH map 操作工具
概要
描述
crushtool 是一个实用程序,允许您创建、编译、反编译和测试 CRUSH map 文件。
CRUSH 是一种伪随机数据分布算法,可有效地将输入值(在 Ceph 中对应于放置组)映射到异构的、分层结构的设备 map 中。该算法最初在以下论文中详细描述(尽管此后有所发展)
http://www.ssrc.ucsc.edu/Papers/weil-sc06.pdf
该工具有四种操作模式。
- --compile|-c map.txt
将把纯文本 map.txt 编译成二进制 map 文件。
- --decompile|-d map
将获取已编译的 map 并将其反编译为纯文本源文件,适合编辑。
- --build --num_osds {num-osds} layer1 ...
将创建具有给定层结构的 map。有关详细说明,请参阅下文。
- --test
将对一系列输入值
[--min-x,--max-x](默认[0,1023])执行 CRUSH 映射的空运行,这些值可以被视为模拟的放置组。有关更详细的说明,请参阅下文。
与其他 Ceph 工具不同,crushtool 不接受诸如 --debug-crush 之类的通用命令行选项。但是,可以通过 CEPH_ARGS 环境变量提供它们。例如,要禁用 CRUSH 子系统的所有输出
CEPH_ARGS="--debug-crush 0" crushtool ...
使用 --test 运行测试
测试模式将使用输入的 crush map(通过 -i map 指定)并执行 CRUSH 映射或随机放置的空运行(如果设置了 --simulate)。完成后,可以创建两种报告。1) --show-... 选项在 stderr 上输出可读信息。2) --output-csv 选项创建 CSV 文件,这些文件由 --help-output 选项记录。
注意:每个放置组 (PG) 都有一个整数 ID,可以从 ceph pg dump 中获取(例如 PG 2.2f 表示 pool id 2,PG id 32)。pool 和 PG ID 通过一个函数组合起来,得到一个值,该值被赋予 CRUSH 以将其映射到 OSD。crushtool 不知道 PG 或 pool;它只通过映射 [--min-x,--max-x] 范围内的值来运行模拟。
- --show-statistics
显示分布摘要。例如
rule 1 (metadata) num_rep 5 result size == 5: 1024/1024
显示名为 metadata 的规则 1 成功将 1024 个值映射到 result size == 5 个设备,当时试图将它们映射到 num_rep 5 个副本。当它未能提供所需的映射时,可能是因为必须增加 tries 的数量,则会显示故障的细分。例如
rule 1 (metadata) num_rep 10 result size == 8: 4/1024 rule 1 (metadata) num_rep 10 result size == 9: 93/1024 rule 1 (metadata) num_rep 10 result size == 10: 927/1024
显示尽管需要 num_rep 10 个副本,但 1024 个值中的 4 个(4/1024)仅映射到 result size == 8 个设备。
- --show-mappings
显示范围
[--min-x,--max-x]中每个值的映射。例如CRUSH rule 1 x 24 [11,6]
显示值 24 被规则 1 映射到设备 [11,6]。
使用
--show-mappings选项时,需要满足以下条件之一--num-rep同时使用
--min-rep和--max-rep
--num-rep代表“副本数”,指示池中的副本数,用于指定精确的副本数(例如--num-rep 5)。--min-rep和--max-rep一起用于指定副本范围(例如--min-rep 1 --max-rep 10)。
- --show-bad-mappings
显示哪个值未能映射到所需的设备数。例如
bad mapping rule 1 x 781 num_rep 7 result [8,10,2,11,6,9]
显示当规则 1 需要映射 7 个设备时,它只能映射六个:[8,10,2,11,6,9]。
- --show-utilization
显示每个设备在每个副本数下的预期和实际利用率。例如
device 0: stored : 951 expected : 853.333 device 1: stored : 963 expected : 853.333 ...
显示设备 0 存储了 951 个值,而预期存储 853 个。暗示 --show-statistics。
- --show-utilization-all
显示与 --show-utilization 相同的内容,但不抑制设备权重为零时的输出。暗示 --show-statistics。
- --show-choose-tries
显示查找设备映射所需的尝试次数。例如
0: 95224 1: 3745 2: 2225 ..
显示 95224 个映射成功,没有重试;3745 个映射成功,有一次尝试;等等。行数与 --set-choose-total-tries 选项的值一样多。
- --output-csv
创建 CSV 文件(在当前目录中),其中包含由 --help-output 记录的信息。这些文件以收集统计信息时使用的规则命名。例如,如果使用规则:“metadata”,则 CSV 文件将为
metadata-absolute_weights.csv metadata-device_utilization.csv ...
文件的第一行简要解释了列布局。例如
metadata-absolute_weights.csv Device ID, Absolute Weight 0,1 ...
- --output-name NAME
在指定 --output-csv 时生成的文件名前加上 NAME。例如 --output-name FOO 将创建文件
FOO-metadata-absolute_weights.csv FOO-metadata-device_utilization.csv ...
--set-... 选项可用于修改输入 crush map 的可调参数。输入 crush map 在内存中被修改。例如
$ crushtool -i mymap --test --show-bad-mappings
bad mapping rule 1 x 781 num_rep 7 result [8,10,2,11,6,9]
可以通过如下增加 choose-total-tries 来修复
- $ crushtool -i mymap --test
--show-bad-mappings --set-choose-total-tries 500
使用 --build 构建地图
构建模式将生成分层 map。第一个参数指定 CRUSH 层次结构中的设备(叶子)数。每层描述应如何对前面一层(或设备)进行分组。
每层由以下组成
bucket ( uniform | list | tree | straw | straw2 ) size
bucket 是层中 bucket 的类型(例如“rack”)。每个 bucket 名称将通过在 bucket 字符串后附加一个唯一数字来构建(例如“rack0”,“rack1”...)。
第二个组件是 bucket 的类型:大多数时候应使用 straw。
第三个组件是 bucket 的最大大小。大小为零表示具有无限容量的 bucket。
示例
假设我们有两行,每行有两个机架,每个机架有 20 个节点。假设每个节点包含 4 个用于 Ceph OSD Daemons 的存储设备。此配置允许我们部署 320 个 Ceph OSD Daemons。假设一个 42U 机架,带有 2U 节点,留下额外的 2U 用于机架交换机。
为了反映我们的设备、节点、机架和行的层次结构,我们将执行以下操作
$ crushtool -o crushmap --build --num_osds 320 \
node straw 4 \
rack straw 20 \
row straw 2 \
root straw 0
# id weight type name reweight
-87 320 root root
-85 160 row row0
-81 80 rack rack0
-1 4 node node0
0 1 osd.0 1
1 1 osd.1 1
2 1 osd.2 1
3 1 osd.3 1
-2 4 node node1
4 1 osd.4 1
5 1 osd.5 1
...
创建 CRUSH 规则以便可以测试生成的 crushmap。它们与创建新 Ceph 集群时默认创建的规则相同。它们可以进一步编辑
# decompile
crushtool -d crushmap -o map.txt
# edit
emacs map.txt
# recompile
crushtool -c map.txt -o crushmap
重新分类
reclassify 函数允许用户从维护不同类型 OSD 并行层次结构的旧版 map 转换为使用 device class 功能的现代 CRUSH map。有关详细信息,请参阅 https://docs.ceph.net.cn/en/latest/rados/operations/crush-map-edits/#migrating-from-a-legacy-ssd-rule-to-device-classes。
--test 的示例输出
有关示例 crushtool --test 命令及其产生的输出,请参阅 https://github.com/ceph/ceph/blob/master/src/test/cli/crushtool/set-choose.t。
可用性
crushtool 是 Ceph 的一部分,Ceph 是一个大规模可扩展的开源分布式存储系统。有关更多信息,请参阅 https://docs.ceph.net.cn 上的 Ceph 文档。
另请参阅
ceph(8), osdmaptool(8),