注意

本文档适用于 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

请注意,ASangit.

使用 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

  1. 这两个选项以及crimson_alien_op_num_threads,部署后无法更改。

  2. vstart.sh使用--crimson-smp标志指示 cephadm 移除主机以及 CRUSH 桶。

  1. 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

    1. 为了获得最佳性能crimson_seastar_cpu_cores应该设置。

  2. crimson_seastar_cpu_corescrimson_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_crimsonOSDMap 标志。监控器将不允许crimson-osd在没有该标志的情况下启动。

最后一个导致默认情况下使用crimson标志创建池。Crimson 池仅限于 Crimson 支持的操作。Crimson-osd不会从非 Crimson 池中实例化 PG。

vstart.sh

以下选项可用于vstart.sh.

--crimson

启动crimson-osd instead of ceph-osd.

--nodaemon

不要将服务守护化。

--redirect-output

stdoutstderrtoout/$type.$num.stdout.

--osd-args

传递额外的命令行选项到crimson-osdceph-osdcrimson-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, and RANDOM_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,执行以下步骤。

  1. 您需要安装libnbd,并将其编译到具有块设备的fio

    apt-get install libnbd-dev
    git clone git://git.kernel.dk/fio.git
    cd fio
    ./configure --enable-libnbd
    make
    
  2. 构建crimson-store-nbd

    cd build
    ninja crimson-store-nbd
    
  3. ,则表示你位于正确的目录中。运行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 的TransactionManagerBlockSegmentManager用于模拟块设备。否则,此选项用于选择FuturizedStore的后端,其中整个“设备”被分成多个固定大小的对象,其大小由--object-size指定。因此,如果您只对测试 SeaStore 的较低级别实现感兴趣,例如逻辑地址转换层和垃圾回收,而不考虑对象存储语义,transaction_manager将是一个更好的选择。

  4. 创建一个fiojob 文件名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
    
  5. 使用刚刚构建的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

在这里,我们编译并运行针对两个分支的相同测试:mainyet-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-addr2lineSeastar 提供的实用程序可用于将这些地址映射到函数。脚本期望在stdin上输入,因此我们需要复制并粘贴上述地址,然后在终端中输入control-D发送 EOF。您可以使用echocat

$ ../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 在处理SIGSEGVSIGABRT等致命信号时不会打印人类可读的回溯。对于剥离的二进制文件来说,这也更复杂。因此,我们可以在 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. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.