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 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
| |
以下是结果
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 基准测试也不错,对驱动器的影响小于预期。 请记住,测试是在本地运行的,因此没有涉及网络通信,并且只设置了一个副本。