注意
本文档适用于 Ceph 开发版本。
crimson
Crimson 是下一代crimson-osd
的代码名称,它在使用快速网络和存储设备时提高了性能,采用了包括 DPDK 和 SPDK 在内的最先进技术。BlueStore 继续支持 HDD 和较慢的 SSD。Crimson 旨在向后兼容经典ceph-osd
. It improves performance when using fast network
and storage devices, employing state-of-the-art technologies including
DPDK and SPDK. BlueStore continues to support HDDs and slower SSDs.
Crimson aims to be backward compatible with the classic ceph-osd
.
构建Crimson
Crimson 默认情况下未启用。通过在构建时运行以下命令来启用它:
$ WITH_CRIMSON=true ./install-deps.sh
$ ./do_cmake.sh -DWITH_CRIMSON=ON
请注意,ASan。git
.
使用 cephadm 测试 crimson
Ceph CI/CD 管道构建了容器,用crimson-osd
替换ceph-osd
.
一旦提交 <sha1> 的分支构建完成并且可在shaman
中获得,您就可以使用Cephadm中概述的 cephadm 说明进行部署,并进行以下调整。
首先,在执行初始引导时,使用--image
标志使用 Crimson 构建:
cephadm --image quay.ceph.io/ceph-ci/ceph:<sha1>-crimson --allow-mismatched-release bootstrap ...
您可能需要提供--allow-mismatched-release
标志来使用非发布分支。
使用 Bluestore 配置 Crimson
由于 Bluestore 不是 Crimson 原生的对象存储后端的说明,将 Bluestore 作为后端部署 Crimson 需要设置以下两个配置选项之一:
Note
这两个选项以及
crimson_alien_op_num_threads
,部署后无法更改。vstart.sh使用
--crimson-smp
标志指示 cephadm 移除主机以及 CRUSH 桶。
crimson_seastar_num_threads
设置这些选项。为了更容易地部署集群,此选项可以代替手动为每个 OSD 设置 CPU 掩码。
建议让每个主机的OSD 数量乘以
crimson_seastar_num_threads
小于节点的 CPU 核心数 (nproc
).例如,部署两个具有八个 CPU 核心和每个节点两个 OSD 的节点:
conf: # Global to all OSDs osd: crimson seastar num threads: 3
Note
为了获得最佳性能
crimson_seastar_cpu_cores
应该设置。
crimson_seastar_cpu_cores
和crimson_alien_thread_cpu_cores
.为每个
crimson-osd
和 BlueStore 后端显式设置 CPU 核心分配。建议每个集合是互斥的。例如,部署两个具有八个 CPU 核心和每个节点两个 OSD 的节点:
conf: # Both nodes osd: crimson alien thread cpu cores: 6-7 # First node osd.0: crimson seastar cpu cores: 0-2 osd.1: crimson seastar cpu cores: 3-5 # Second node osd.2: crimson seastar cpu cores: 0-2 osd.3: crimson seastar cpu cores: 3-5
对于单个具有八个节点和三个 OSD 的节点:
conf: osd: crimson alien thread cpu cores: 6-7 osd.0: crimson seastar cpu cores: 0-1 osd.1: crimson seastar cpu cores: 2-3 osd.2: crimson seastar cpu cores: 4-5
运行 Crimson
Note
Crimson 处于技术预览阶段。正如您可能预期的,Crimson 目前还没有 ceph-osd 那么广泛的功能集。预计会出现故障,包括崩溃和数据丢失。
启用 Crimson
在构建 Crimson 并启动您的集群后,但在部署 OSD 之前,您需要使用 Bluestore 配置 Crimson并启用 Crimson 以将默认池创建为 Crimson 池。在您拥有运行中的集群后,可以通过运行以下命令继续操作:
Note
vstart.sh在--crimson时生成。
ceph config set global 'enable_experimental_unrecoverable_data_corrupting_features' crimson
ceph osd set-allow-crimson --yes-i-really-mean-it
ceph config set mon osd_pool_default_crimson true
第一个命令启用crimson
实验性功能。
第二个命令启用allow_crimson
OSDMap 标志。监控器将不允许crimson-osd
在没有该标志的情况下启动。
最后一个导致默认情况下使用crimson
标志创建池。Crimson 池仅限于 Crimson 支持的操作。Crimson-osd
不会从非 Crimson 池中实例化 PG。
vstart.sh
以下选项可用于vstart.sh
.
--crimson
启动
crimson-osd
instead ofceph-osd
.--nodaemon
不要将服务守护化。
--redirect-output
将
stdout
和stderr
toout/$type.$num.stdout
.--osd-args
传递额外的命令行选项到
crimson-osd
或ceph-osd
。crimson-osd
时很有用。例如,可以提供--osd-args "--memory 2G"
来设置要使用的内存量。请参阅crimson-osd --help-seastar
的输出以获取额外的 Seastar 特定命令行选项。
--crimson-smp
为每个 OSD 使用的核心数。nproc确定)将分配给对象存储。
--bluestore
使用 alienized BlueStore 作为对象存储后端。这是默认值(见下文关于对象存储后端的说明了解更多细节)
--cyanstore
使用 CyanStore 作为对象存储后端。
--memstore
使用 alienized MemStore 作为对象存储后端。
--seastore
使用 SeaStore 作为后端对象存储。
--seastore-devs
指定 SeaStore 使用的块设备。
--seastore-secondary-devs
可选。SeaStore 支持多个设备。通过将块设备传递到此选项来启用此功能。
--seastore-secondary-devs-type
可选。指定次要设备类型。当次要设备比传递给
--seastore-devs
的主设备慢时,较快的设备中的冷数据将随时间推移被驱逐到较慢的设备。有效类型包括HDD
,SSD``(default), ``ZNS
, andRANDOM_BLOCK_SSD
注意次要设备不应比主设备快。
要使用单个 Crimson 节点启动集群,请运行:
$ MGR=1 MON=1 OSD=1 MDS=0 RGW=0 ../src/vstart.sh \
--without-dashboard --bluestore --crimson \
--redirect-output
另一个 SeaStore 示例:
$ MGR=1 MON=1 OSD=1 MDS=0 RGW=0 ../src/vstart.sh -n -x \
--without-dashboard --seastore \
--crimson --redirect-output \
--seastore-devs /dev/sda \
--seastore-secondary-devs /dev/sdb \
--seastore-secondary-devs-type HDD
通过运行以下命令停止此vstart
集群:
$ ../src/stop.sh --crimson
对象存储后端
目前,crimson-osd
提供原生和 alienized 对象存储后端。原生对象存储后端使用 SeaStar 反应器执行 IO。它们是:
- cyanstore
CyanStore 模仿了经典 OSD 中的 memstore。
- seastore
Seastore 仍在积极开发中。
Alienized 对象存储后端由线程池支持,该线程池是 alienstore 适配器在 Seastar 中运行的代理。代理向在 alien 线程中运行的对象存储发出请求,即不由 Seastar 框架管理的 worker 线程。它们是:
- memstore
内存后端对象存储
- bluestore
经典
ceph-osd
守护化
与ceph-osd
, crimson-osd
即使启用了daemonize
选项,它也不会将自己守护化。为了读取此选项,crimson-osd
需要准备好其分片服务,但此分片服务存在于 Seastar 反应器中。如果我们启动 Seastar 引擎后 fork 一个子进程并在父进程中退出,那将留下一个单线程,它是调用fork()的线程的副本。在 Crimson 中解决这个问题会不必要地使代码复杂化。
由于支持的 GNU/Linux 发行版使用systemd
,它能够守护化进程,因此无需自己守护化。start-stop-daemon
来守护化crimson-osd
。
日志记录
Crimson-osd
目前使用 Seastar 提供的日志记录实用程序。参见src/common/dout.h
以了解 Ceph 日志级别与 Seastar 严重级别之间的映射。例如,发送到derr
的消息将使用logger::error()
发出,并且调试级别大于20
的消息将使用logger::trace()
.
ceph |
seastar |
< 0 |
错误 |
0 |
警告 |
[1, 6) |
info |
[6, 20] |
调试 |
> 20 |
跟踪 |
注意crimson-osd
不会将日志消息直接发送到指定的log_file
。它将日志消息写入 stdout 和/或 syslog。此行为可以使用--log-to-stdout
和--log-to-syslog
命令行选项更改。默认情况下,log-to-stdout
是启用的,而--log-to-syslog
是禁用的。
Crimson 提供三种报告统计信息和指标的方法。
向 mgr 报告的 PG 统计信息
Crimson 收集每个 PG、每个池和每个 OSD 的统计信息,并将其保存在一个MPGStats消息中,该消息发送到 Ceph 管理器。管理器模块可以使用MgrModule.get()方法的最后一个参数。
Asock 命令查询它们。
提供了一个管理员套接字命令来转储指标:
$ ceph tell osd.0 dump_metrics
$ ceph tell osd.0 dump_metrics reactor_utilization
这里reactor_utilization是一个可选字符串,允许我们通过前缀过滤转储的指标。
Prometheus 文本协议
监听端口和地址可以使用--prometheus_port参见Prometheus for more details.
分析 Crimson
Fio
crimson-store-nbd
暴露可配置的FuturizedStore
内部作为 NBD 服务器,用于与fio
.
为了使用fio
一起测试crimson-store-nbd
,执行以下步骤。
您需要安装
libnbd
,并将其编译到具有块设备的fio
apt-get install libnbd-dev git clone git://git.kernel.dk/fio.git cd fio ./configure --enable-libnbd make
构建
crimson-store-nbd
cd build ninja crimson-store-nbd
,则表示你位于正确的目录中。运行
crimson-store-nbd
服务器中。指定原始设备的路径,例如/dev/nvme1n1
,以代替为使用块设备测试创建的文件。export disk_img=/tmp/disk.img export unix_socket=/tmp/store_nbd_socket.sock rm -f $disk_img $unix_socket truncate -s 512M $disk_img ./bin/crimson-store-nbd \ --device-path $disk_img \ --smp 1 \ --mkfs true \ --type transaction_manager \ --uds-path ${unix_socket} &
以下是这些命令行参数的描述:
--smp
要使用的 CPU 核心数(对称多处理器)
--mkfs
首先初始化设备。
--type
要使用的后端。如果
transaction_manager
指定,则 SeaStore 的TransactionManager
和BlockSegmentManager
用于模拟块设备。否则,此选项用于选择FuturizedStore
的后端,其中整个“设备”被分成多个固定大小的对象,其大小由--object-size
指定。因此,如果您只对测试 SeaStore 的较低级别实现感兴趣,例如逻辑地址转换层和垃圾回收,而不考虑对象存储语义,transaction_manager
将是一个更好的选择。
创建一个
fio
job 文件名nbd.fio
[global] ioengine=nbd uri=nbd+unix:///?socket=${unix_socket} rw=randrw time_based runtime=120 group_reporting iodepth=1 size=512M [job0] offset=0
使用刚刚构建的
fio
测试 Crimson 对象存储./fio nbd.fio
CBT
我们可以使用cbt进行性能测试:
$ git checkout main
$ make crimson-osd
$ ../src/script/run-cbt.sh --cbt ~/dev/cbt -a /tmp/baseline ../src/test/crimson/cbt/radosbench_4K_read.yaml
$ git checkout yet-another-pr
$ make crimson-osd
$ ../src/script/run-cbt.sh --cbt ~/dev/cbt -a /tmp/yap ../src/test/crimson/cbt/radosbench_4K_read.yaml
$ ~/dev/cbt/compare.py -b /tmp/baseline -a /tmp/yap -v
19:48:23 - INFO - cbt - prefill/gen8/0: bandwidth: (or (greater) (near 0.05)):: 0.183165/0.186155 => accepted
19:48:23 - INFO - cbt - prefill/gen8/0: iops_avg: (or (greater) (near 0.05)):: 46.0/47.0 => accepted
19:48:23 - WARNING - cbt - prefill/gen8/0: iops_stddev: (or (less) (near 0.05)):: 10.4403/6.65833 => rejected
19:48:23 - INFO - cbt - prefill/gen8/0: latency_avg: (or (less) (near 0.05)):: 0.340868/0.333712 => accepted
19:48:23 - INFO - cbt - prefill/gen8/1: bandwidth: (or (greater) (near 0.05)):: 0.190447/0.177619 => accepted
19:48:23 - INFO - cbt - prefill/gen8/1: iops_avg: (or (greater) (near 0.05)):: 48.0/45.0 => accepted
19:48:23 - INFO - cbt - prefill/gen8/1: iops_stddev: (or (less) (near 0.05)):: 6.1101/9.81495 => accepted
19:48:23 - INFO - cbt - prefill/gen8/1: latency_avg: (or (less) (near 0.05)):: 0.325163/0.350251 => accepted
19:48:23 - INFO - cbt - seq/gen8/0: bandwidth: (or (greater) (near 0.05)):: 1.24654/1.22336 => accepted
19:48:23 - INFO - cbt - seq/gen8/0: iops_avg: (or (greater) (near 0.05)):: 319.0/313.0 => accepted
19:48:23 - INFO - cbt - seq/gen8/0: iops_stddev: (or (less) (near 0.05)):: 0.0/0.0 => accepted
19:48:23 - INFO - cbt - seq/gen8/0: latency_avg: (or (less) (near 0.05)):: 0.0497733/0.0509029 => accepted
19:48:23 - INFO - cbt - seq/gen8/1: bandwidth: (or (greater) (near 0.05)):: 1.22717/1.11372 => accepted
19:48:23 - INFO - cbt - seq/gen8/1: iops_avg: (or (greater) (near 0.05)):: 314.0/285.0 => accepted
19:48:23 - INFO - cbt - seq/gen8/1: iops_stddev: (or (less) (near 0.05)):: 0.0/0.0 => accepted
19:48:23 - INFO - cbt - seq/gen8/1: latency_avg: (or (less) (near 0.05)):: 0.0508262/0.0557337 => accepted
19:48:23 - WARNING - cbt - 1 tests failed out of 16
在这里,我们编译并运行针对两个分支的相同测试:main
和yet-another-pr
。
Hacking Crimson
Seastar 文档
请参阅Seastar 教程。
$ cd seastar
$ ./configure.py --mode debug
$ ninja -C build/debug docs
$ python3 -m http.server -d build/debug/doc/html
您可能需要事先安装pandoc
和其他依赖项。
调试 Crimson
使用 GDB 调试
The 提示用于调试 Scylla 的提示也适用于 Crimson。
使用 addr2line 获取人类可读的回溯
当 Seastar 应用程序崩溃时,它留下一个地址回溯,如下所示:
Segmentation fault.
Backtrace:
0x00000000108254aa
0x00000000107f74b9
0x00000000105366cc
0x000000001053682c
0x00000000105d2c2e
0x0000000010629b96
0x0000000010629c31
0x00002a02ebd8272f
0x00000000105d93ee
0x00000000103eff59
0x000000000d9c1d0a
/lib/x86_64-linux-gnu/libc.so.6+0x000000000002409a
0x000000000d833ac9
Segmentation fault
The seastar-addr2line
Seastar 提供的实用程序可用于将这些地址映射到函数。脚本期望在stdin
上输入,因此我们需要复制并粘贴上述地址,然后在终端中输入control-D
发送 EOF。您可以使用echo
或cat
:
$ ../src/seastar/scripts/seastar-addr2line -e bin/crimson-osd
0x00000000108254aa
0x00000000107f74b9
0x00000000105366cc
0x000000001053682c
0x00000000105d2c2e
0x0000000010629b96
0x0000000010629c31
0x00002a02ebd8272f
0x00000000105d93ee
0x00000000103eff59
0x000000000d9c1d0a
0x00000000108254aa
[Backtrace #0]
seastar::backtrace_buffer::append_backtrace() at /home/kefu/dev/ceph/build/../src/seastar/src/core/reactor.cc:1136
seastar::print_with_backtrace(seastar::backtrace_buffer&) at /home/kefu/dev/ceph/build/../src/seastar/src/core/reactor.cc:1157
seastar::print_with_backtrace(char const*) at /home/kefu/dev/ceph/build/../src/seastar/src/core/reactor.cc:1164
seastar::sigsegv_action() at /home/kefu/dev/ceph/build/../src/seastar/src/core/reactor.cc:5119
seastar::install_oneshot_signal_handler<11, &seastar::sigsegv_action>()::{lambda(int, siginfo_t*, void*)#1}::operator()(int, siginfo_t*, void*) const at /home/kefu/dev/ceph/build/../src/seastar/src/core/reactor.cc:5105
seastar::install_oneshot_signal_handler<11, &seastar::sigsegv_action>()::{lambda(int, siginfo_t*, void*)#1}::_FUN(int, siginfo_t*, void*) at /home/kefu/dev/ceph/build/../src/seastar/src/core/reactor.cc:5101
?? ??:0
seastar::smp::configure(boost::program_options::variables_map, seastar::reactor_config) at /home/kefu/dev/ceph/build/../src/seastar/src/core/reactor.cc:5418
seastar::app_template::run_deprecated(int, char**, std::function<void ()>&&) at /home/kefu/dev/ceph/build/../src/seastar/src/core/app-template.cc:173 (discriminator 5)
main at /home/kefu/dev/ceph/build/../src/crimson/osd/main.cc:131 (discriminator 1)
注意seastar-addr2line
提取地址,因此您也可以粘贴日志消息,如下所示:
2020-07-22T11:37:04.500 INFO:teuthology.orchestra.run.smithi061.stderr:Backtrace:
2020-07-22T11:37:04.500 INFO:teuthology.orchestra.run.smithi061.stderr: 0x0000000000e78dbc
2020-07-22T11:37:04.501 INFO:teuthology.orchestra.run.smithi061.stderr: 0x0000000000e3e7f0
2020-07-22T11:37:04.501 INFO:teuthology.orchestra.run.smithi061.stderr: 0x0000000000e3e8b8
2020-07-22T11:37:04.501 INFO:teuthology.orchestra.run.smithi061.stderr: 0x0000000000e3e985
2020-07-22T11:37:04.501 INFO:teuthology.orchestra.run.smithi061.stderr: /lib64/libpthread.so.0+0x0000000000012dbf
与经典ceph-osd
不同,Crimson 在处理SIGSEGV或SIGABRT等致命信号时不会打印人类可读的回溯。对于剥离的二进制文件来说,这也更复杂。因此,我们可以在 Crimson 中为这些信号种植信号处理程序,而是使用script/ceph-debug-docker.sh来映射回溯中的地址:
# assuming you are under the source tree of ceph
$ ./src/script/ceph-debug-docker.sh --flavor crimson master:27e237c137c330ebb82627166927b7681b20d0aa centos:8
....
[root@3deb50a8ad51 ~]# wget -q https://raw.githubusercontent.com/scylladb/seastar/master/scripts/seastar-addr2line
[root@3deb50a8ad51 ~]# dnf install -q -y file
[root@3deb50a8ad51 ~]# python3 seastar-addr2line -e /usr/bin/crimson-osd
# paste the backtrace here
代码分析
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.