Ceph优化系列(三):osd_op_num_shards/threads_per_shard相关参数源码分析

转发:bluestore性能调优测试

摘要:

调节如下参数值,对比IOPS的变化:

osd_op_num_shards

osd_op_num_shard_hdd

osd_op_num_shards_ssd

osd_op_num_threads_per_shard

osd_op_num_threads_per_shard_hdd

osd_op_num_threads_per_shard_ssd

1、 环境搭建

在基于任务一基础上的环境(3-osd),来完成该任务
默认osd_op_num_shards=0,

Ceph优化系列(三):osd_op_num_shards/threads_per_shard相关参数源码分析_第1张图片

[email protected]:/etc/ceph$ vim ceph.conf
osd_op_num_shards=4

2、 osd_op_num_shards参数分析

阅读ceph源码,查看osd_op_num_shards参数的计算源码,如下所示(主要看第二幅图):

Ceph优化系列(三):osd_op_num_shards/threads_per_shard相关参数源码分析_第2张图片Ceph优化系列(三):osd_op_num_shards/threads_per_shard相关参数源码分析_第3张图片

源码中有两个函数,get_num_op_shards()get_num_op_threads(),是分别求OSD::op_shardedwq中存储io的队列个数及OSD::op_shardedwq中总的io分发线程数
总线程数=队列数*每个队列线程数
可看出,当osd_op_num_shards为true时,返回osd_op_num_shards的值;否则就看返回osd_op_num_shards_hhdosd_op_num_shards_ssd的值,源码中store_is_rotational是bool类型,表示设备属性(默认是true也即是hhd)。
而求线程数函数get_num_op_threads(),同理也是以变量osd_op_num_threads_per_shardstore_is_rotational来决定用哪个公式。

(1)默认情况下,查看相关参数值:

Ceph优化系列(三):osd_op_num_shards/threads_per_shard相关参数源码分析_第4张图片

可看到osd_op_num_shards=0osd_op_num_threads_per_shard=0,所以计算线程总数公式=osd_op_num_shards_ssd*osd_op_num_threads_per_shard_ssd=8*2=16

(2)通过ceph.conf文件设置参数osd_op_num_shards=2,重启集群

Ceph优化系列(三):osd_op_num_shards/threads_per_shard相关参数源码分析_第5张图片

通过上面分析,因此总线程数=osd_op_num_shards*osd_op_num_threads_per_shard_ssd=2*2=4

  • 测试 在客户端运行fio的4k-randwrite操作,同时在服务端多次运行 top -H -p $pid -n 1 | grep tp_osd_tp ,计算有多少个线程,如下:

    Ceph优化系列(三):osd_op_num_shards/threads_per_shard相关参数源码分析_第6张图片Ceph优化系列(三):osd_op_num_shards/threads_per_shard相关参数源码分析_第7张图片

    看得出一直都是4个线程。故我们的计算方式是正确的。下面来看真正的实验吧。

    3、 实验设置

    共20组实验
    (1)osd_op_num_shards=0(默认),即总线程数=8*2=16
    实验1-1:1-client随机写1个image
    实验1-2:1-client随机写8个image
    实验1-3:1-client随机写15个image
    实验1-4:1-client随机写30个image
    (2)osd_op_num_shards=2,即总线程数=2*2=4
    实验2-1:1-client随机写1个image
    实验2-2:1-client随机写8个image
    实验2-3:1-client随机写15个image
    实验2-4:1-client随机写30个image
    (3)osd_op_num_shards=4,即总线程数=4*2=8
    实验3-1:1-client随机写1个image
    实验3-2:1-client随机写8个image
    实验3-3:1-client随机写15个image
    实验3-4:1-client随机写30个image
    (4)osd_op_num_shards=8,即总线程数=8*2=16
    实验4-1:1-client随机写1个image
    实验4-2:1-client随机写8个image
    实验4-3:1-client随机写15个image
    实验4-4:1-client随机写30个image
    (5)osd_op_num_shards=16,即总线程数=16*2=32
    实验5-1:1-client随机写1个image
    实验5-2:1-client随机写8个image
    实验5-3:1-client随机写15个image
    实验5-4:1-client随机写30个image

    4、实验结果

Ceph优化系列(三):osd_op_num_shards/threads_per_shard相关参数源码分析_第8张图片Ceph优化系列(三):osd_op_num_shards/threads_per_shard相关参数源码分析_第9张图片

5、结果分析及总结

由上图可以看出,五组实验的各四小组实验结果的IOPS都相差不大,参数osd_op_num_shards效果不明显。
(1)当1-image时,5组实验中,osd_op_num_shards默认参数的IOPS最高,性能最好。
(2)当8-image时,各组实验都不差,默认参数第二高,表示调参没起到效果。
(3)当15-image时,默认参数IOPS最高,性能最好。
(4)当30-image时,默认参数IOPS最高,性能最好。
综上所述,参数osd_op_num_shards对集群IOPS性能影响不明显。

你可能感兴趣的:(Ceph)