Ceph IO 层快速分析

shan

本次小规模分析的目标是确定 Ceph 产生的开销。 另一个重要一点是估计 Ceph 带来的偏差,即磁盘原始 IO 与 Ceph IO 之间的偏差。

基准测试计划

  • 基准测试磁盘以获取原始性能
  • 运行 Ceph IO。 然后验证性能,基本上我希望它们接近原始基准测试的结果。
  • 运行 RADOS 基准测试。 然后估计第一次写入 OSD 和文件存储刷新带来的影响。

测试在 7.2K RPM 的 1TB 磁盘上运行。

工作负载的运行目的是模拟 RBD 对象写入。 使用的 fio 模板如下

[global]
ioengine=libaio
invalidate=1
ramp_time=5
exec_prerun="echo 3 > /proc/sys/vm/drop_caches"
iodepth=1
runtime=300
time_based
direct=1 
bs=4m
filename=/dev/sdb1

[seq-write]
stonewall
rw=write

[seq-read]
stonewall
rw=read

以下是 FIO 结果

seq-write: (groupid=0, jobs=1): err= 0: pid=4230
  write: io=44900MB, bw=153016KB/s, iops=37 , runt=300475msec

seq-read: (groupid=2, jobs=1): err= 0: pid=4272
  read : io=48204MB, bw=164268KB/s, iops=40 , runt=300490msec

FIO 宣布的顺序写入带宽为 149.4MB/sec,顺序读取带宽为 160.4MB/sec。

然后,我将我的原始结果与 Ceph IO 进行比较

1
2
3
4
$ ceph tell osd.0 bench
osd.0: { "bytes_written": 1073741824,
  "blocksize": 4194304,
  "bytes_per_sec": "145153639.000000"}

因此,从 ceph osd 基准测试中获得 138.4MB/sec,而 FIO 为 149.4MB/sec。 我认为这很好,因为 FIO 运行了 43GB,而 ceph osd 基准测试只写入了 1GB。

最后,我运行了一个本地的写入 RADOS 基准测试 ,并发率为 1,池的副本大小为 1,持续时间为 300 秒。 基本上,所有 IO 都是逐个发送的,每次等待 OSD 的确认。

单个对象写入副本为 1 会导致 2 个 IO

  • 客户端将请求发送到主 OSD
  • 第一个 IO 以 o_direct 和 aio 写入 Ceph 日志
  • 文件存储以缓冲 IO 将 IO 刷新到后端 fs

我使用的命令

1
$ rados -p leseb bench 300 write -b 4194304 -t 1 --no-cleanup

以下是结果

Total time run:         300.097605
Total writes made:      6188
Write size:             4194304
Bandwidth (MB/sec):     82.480

Stddev Bandwidth:       8.39157
Max bandwidth (MB/sec): 100
Min bandwidth (MB/sec): 0
Average Latency:        0.0484891
Stddev Latency:         0.0146481
Max latency:            0.329817
Min latency:            0.029509

据我所见,原始结果(FIO 运行)与 ceph osd 之间的差异并不大,这最终是正常的。 RADOS 基准测试也不错,对驱动器的影响小于预期。 请记住,测试是在本地运行的,因此没有涉及网络通信,并且只设置了一个副本。