经典 OSD 与 Seastore Crimson 的性能比较

2025年10月6日 Jose Juan Palacios Perez (IBM) Jose Juan Palacios Perez (IBM)

Crimson 中使用 Seastore 作为原生对象存储

我们非常高兴地向大家展示 Classic OSD 和 Seastore(Crimson OSD 中的原生对象存储引擎)之间的性能比较。Crimson OSD。

我们表明,对于 4K 随机读取,Seastore 的性能优于 Classic OSD,并且对于顺序 64K 读取和写入工作负载,两者具有相同的性能。只有随机写入 4k 显示 Seastore 的性能略低,我们正在积极努力进行优化,Samuel Just 领导这项工作。

这些结果保持一致,并且在性能方面没有相对于 2025 年 5 月(内部技术报告,可在 Crimson slack 频道 中找到)中显示的 build 6aab5c07ae 的结果出现倒退。

简而言之,以下是比较的关键点

  • 我们对所有测试运行使用了来自 main 分支的相同的 Ceph dev 构建(哈希值为 785976e3179)。

  • 单个 OSD,32 个大小为 2 GB 的 RBD 卷,每个卷四个 FIO 作业。

  • Crimson 的所有配置均使用平衡的 OSD 算法,在单个 NUMA socket 上(这与之前的测试保持一致)。

  • 我们使用了传统的 workload(随机读取 4k、随机写入 4k、顺序读取 64k 和顺序写入 64k)。

  • 我们使用了 Seastore 的双反应堆配置(使用 NUMA socket 0 中的最大 56 个 CPU 核心),同样也用于 Classic OSD。有关详细信息,请参阅我们之前的 博客文章

Seastore vs Classic OSD - 最大 CPU 核心配置

在本节中,我们将展示双反应堆配置下 OSD Classic 与 Crimson/Seastore 之间的性能比较。这包括使用系统(Intel(R) Xeon(R) Platinum 8276M CPU @ 2.20GHz)的 NUMA socket 0 中的最大 56 个 CPU 核心。这是与 2025 年 5 月 29 日发布的报告中使用的相同 CPU 配置。测试是在相同的硬件和软件配置下进行的,有关详细信息,请参阅下面的附录。

Randread 4k

Seastore vs Classic (dual reactor config) - randread - IOPS vs
Latency

与 Classic 相比,Seastore 在此 workload 上显示出显著的性能提升,最大吞吐量为 400K IOPS,而 Classic 为 130K IOPS。

点击查看 CPU 利用率。
ClassicSeastore
classic_randread_osd_cpuseastore_randread_osd_cpu
  • 注意:我们不在图表中显示内存利用率,因为其基本保持恒定,并且对分析没有太大帮助。

    在下表中,我们显示了每个 workload 的详细测量结果。所有小写字母的列名都来自基准测试 FIO,而只有两个大写字母的列是使用 top 命令测量的,即 OSD CPU 和 OSD 内存利用率。

Classic OSD - rand4read k - 详细统计信息

iodepthiopstotal_iosclat_msclat_stdevusr_cpusys_cpuOSD_cpuOSD_mem
1108365.8732509868.000.290.111.411.26353.2053.66
2124779.6137434134.000.510.311.551.40426.7666.35
4130072.3339022090.000.980.861.591.44440.6266.60
8130657.6139197807.001.962.591.561.43442.4066.60
16131217.6239366729.003.908.301.401.36437.5866.60
24132017.4639607879.005.8118.941.301.30429.8366.60
32131567.9939477765.006.8127.081.371.42418.1266.60
40134032.4940220335.006.2226.811.781.87416.3566.60
52135246.3640576206.005.3424.462.572.71414.8666.60
64136637.7940993659.004.8523.903.323.44408.2366.60

Seastore OSD - randread 4k - 详细统计信息

iodepthiopstotal_iosclat_msclat_stdevusr_cpusys_cpuOSD_cpuOSD_mem
1126108.0537832541.000.250.071.751.624259.313479.04
2186270.3855881299.000.340.132.502.344792.023628.80
4272327.6081698825.000.470.203.563.185148.663628.80
8313378.5794014512.000.810.473.562.975258.813628.80
16396901.06119071509.001.290.894.363.185365.523628.80
24362284.30108688913.002.124.813.672.755362.523639.44
32387618.69116296461.002.6414.404.363.235368.533645.60
40346395.63103929773.003.6918.483.652.735354.853645.60
52371220.47111386558.004.4833.794.243.115349.683645.60
64328832.7898673511.006.2350.753.512.695328.603645.60

Randwrite 4k

Seastore vs Classic - randwrite - IOPS vs
Latency

Seastore 在此 workload 上的性能有明显提升的空间。这是 Samuel Just 领导的一个非常活跃的领域,涉及对 Seastore 的许多优化。

点击查看 CPU 利用率。
ClassicSeastore
classic_randwrite_osd_cpuseastore_randwrite_osd_cpu

Classic OSD - randwrite 4k - 详细统计信息

iodepthiopstotal_iosclat_msclat_stdevusr_cpusys_cpuOSD_cpuOSD_mem
165903.7019771176.000.481.001.361.01781.4175.73
286286.0725885995.000.730.522.031.50993.7057.47
496025.2228807854.001.330.702.511.911094.5374.25
8103263.4230979542.002.471.033.342.571158.5376.47
16103583.2331075901.004.945.422.231.301158.3176.22
24103991.8131199311.007.3810.901.991.091143.3675.73
32104675.9831405724.009.7817.081.860.981145.6175.73
40104459.7731342317.0012.2523.811.810.891144.9676.47
52104192.4031264494.0015.9734.901.720.821142.1475.97
64104833.3031463618.0019.5347.701.640.791137.1076.22

Seastore OSD - randwrite 4k - 详细统计信息

iodepthiopstotal_iosclat_msclat_stdevusr_cpusys_cpuOSD_cpuOSD_mem
131367.499410655.001.012.370.620.493648.143941.28
242493.1712748376.001.503.970.750.594160.045390.00
458204.7317461826.002.193.760.950.734680.486027.28
865861.8919759489.003.885.341.060.794748.006194.16
1669801.8020942843.007.3329.561.110.814928.676199.20
2468240.3520477292.0011.2546.161.110.794815.886199.20
3271570.2021477716.0014.3160.141.160.82390.356199.20
4010710.193363.00354.63691.850.080.074281.696199.20
5216412.435810.00160.41334.380.250.174969.026199.20
647648.092608.00394.05527.430.080.164545.876199.20

Seqread 64k

Seastore vs Classic - seqread - IOPS vs
Latency

请注意,Seastore 的性能比 Classic 低不到 10%,在实际应用中,它们可以被认为是相同的。

点击查看 CPU 利用率。
ClassicSeastore
classic_seqread_osd_cpuseastore_seqread_osd_cpu

Classic OSD - seqread 64k - 详细统计信息

iodepthbwtotal_iosclat_msclat_stdevusr_cpusys_cpuOSD_cpuOSD_mem
12259.5410591650.000.900.450.490.44244.6978.03
22252.2510557518.001.821.160.470.43264.2680.91
42226.4110436444.003.682.350.460.43260.6079.92
82229.9010453186.007.344.710.450.43258.8779.67
161867.488754162.0016.2826.080.400.40226.6378.19
241771.648304783.0016.6330.380.530.59224.7878.19
321686.787906337.0015.3224.540.720.84226.8778.44
401620.787597046.0015.3630.580.841.03215.5079.18
521537.757207264.0015.8140.050.961.27213.5979.18
641457.196829824.0014.7646.981.211.59215.7777.95

Seastore OSD - seqread 64k - 详细统计信息

iodepthbwtotal_iosclat_msclat_stdevusr_cpusys_cpuOSD_cpuOSD_mem
11473.666907887.001.380.780.420.382849.745953.20
21690.217923018.002.421.610.440.412957.456199.20
41780.628346807.004.603.250.450.433092.816199.20
81868.708759887.008.767.660.460.432992.766199.20
161957.459176207.0016.7415.610.480.443235.706199.20
242037.469552208.0024.1226.460.470.463335.786199.20
322130.589988723.0030.7635.760.490.483437.996199.20
402181.1910227339.0037.5549.960.490.483284.566199.20
522293.9310757006.0046.4259.170.520.503502.086199.20
642241.9710514348.0042.6561.720.630.653315.776199.20

Seqwrite 64k

Seastore vs Classic - seqwrite - IOPS vs
Latency

与之前的 workload 类似,Seastore 的性能在 Classic 的 10% 以内,因此可以被认为是相同的。

点击查看 CPU 利用率。
ClassicSeastore
classic_seqwrite_osd_cpuseastore_seqwrite_osd_cpu

Classic OSD - seqwrite 64k - 详细统计信息

iodepthbwtotal_iosclat_msclat_stdevusr_cpusys_cpuOSD_cpuOSD_mem
12413.6011313833.000.830.361.900.65597.7440.63
22629.7512326994.001.540.552.020.75684.4948.59
42679.7612561442.003.041.281.950.69698.0355.99
82688.7212603496.006.083.871.990.51716.5060.68
162701.1612661982.0012.1115.452.330.43697.2661.17
242703.4312673303.0018.1734.592.480.41682.3361.91
322596.5812173046.0024.7657.192.540.41679.3761.91
402672.8312533910.0023.3455.863.290.49674.9261.91
522607.4912226048.0020.8647.364.620.69650.5562.16
642655.0112446451.0019.1042.896.060.88639.8461.67

Seastore OSD - seqwrite 64k - 详细统计信息

iodepthbwtotal_iosclat_msclat_stdevusr_cpusys_cpuOSD_cpuOSD_mem
11895.088883327.001.071.121.210.433177.556001.82
22220.3610408096.001.831.971.290.483184.466249.60
42244.2010519929.003.643.361.270.483345.726249.60
82301.5410788847.007.116.381.530.493213.676249.60
162381.8611165433.0013.7412.082.160.493493.736249.60
242479.9911627449.0019.8020.332.430.503431.816249.60
321557.107299365.0042.0736.082.050.503732.996249.60
401521.377131945.0053.8349.442.030.483723.616249.60
521563.377328734.0068.1064.742.130.493810.176249.60
641571.507367144.0070.1871.462.520.583860.276249.60

结论

在本篇博文中,我们展示了 Seastore OSD 与 Classic OSD 的性能。结果表明,Seastore 在随机读取 4k 方面性能更好,在顺序读取和写入 64k 工作负载方面性能相同。只有随机写入 4k 显示 Seastore 的性能较低,我们正在积极进行优化。我们将继续监控 Seastore OSD 的性能,并在未来的博文中报告任何重大变化。我们感谢 Samuel Just 对 Seastore 性能的见解,如在 Crimson 社区会议电话中所讨论的。

附录:配置详细信息

测试是在 Sepia Lab 中的单个节点集群 o05 上执行的。

以下是硬件和软件配置的摘要

  • CPU:2 x Intel(R) Xeon(R) Platinum 8276M CPU @ 2.20GH (每个 56 个核心)

  • 内存:384 GB

  • 存储:驱动器:8 x 93.1 TB NVMe

  • OS:Centos 9.0 on kernel 5.14.0-511.el9.x86_64

  • 内核:5.4.0-91-generic

  • Ceph:squid dev 构建来自 main 分支,哈希值为 785976e3179 (Fri Aug 29 2025)

  • podman 版本 5.2.2

  • FIO:3.28(使用 librbd 引擎进行 workload,使用 AIO 引擎对 NVMe 驱动器进行预处理)。

我们以开发模式构建 Ceph,选项如下

WITH_CRIMSON=true ./install-deps.sh
$ ./do_cmake.sh -DWITH_CRIMSON=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_CXX_FLAGS="-fno-omit-frame-pointer" -DWITH_TESTS=OFF && ninja -C build -j 20 -l 20 -k 20 && ninja -C build install

本报告的所有测试均使用 vstart.sh 进行集群创建,使用单个节点。在存储方面,测试的单个配置涉及 32 个 RBD 卷,每个卷的大小为 2 GB。

RBD 池是无复制创建的(大小为 1)。在下面的代码片段中,我们显示了用于 RBD 池和卷的选项。

点击查看 RBD 配置详细信息。

    if pgrep crimson; then
    	bin/ceph daemon -c /ceph/build/ceph.conf osd.0 dump_metrics > /tmp/new_cluster_dump.json
    fi

    # basic setup
    bin/ceph osd pool create rbd 128
    bin/ceph osd pool application enable rbd rbd
    bin/ceph osd pool set rbd size 1 --yes-i-really-mean-it

    [ -z "$NUM_RBD_IMAGES" ] && NUM_RBD_IMAGES=1
    [ -z "$RBD_SIZE" ] && RBD_SIZE=2GB
    for (( i=0; i<$NUM_RBD_IMAGES; i++ )); do
      bin/rbd create --size ${RBD_SIZE} rbd/fio_test_${i}
      rbd du fio_test_${i}
      echo "Prefilling rbd/fio_test_${i}"
      bin/rbd bench -p rbd --image fio_test_${i} --io-size 64K --io-threads 1\
        --io-total ${RBD_SIZE} --io-pattern seq --io-type write  && rbd du fio_test_${i}
    done

    bin/ceph status
    bin/ceph osd dump | grep 'replicated size'

    # Show pool’s utilization statistics:
    rados df
    # Turn off auto scaler for existing and new pools - stops PGs being split/merged
    bin/ceph osd pool set noautoscale
    # Turn off balancer to avoid moving PGs
    bin/ceph balancer off
    # Turn off deep scrub
    bin/ceph osd set nodeep-scrub
    # Turn off scrub
    bin/ceph osd set noscrub
    # Turn off RBD coalescing
    bin/ceph config set client rbd_io_scheduler none