Ceph性能瓶颈分析与优化(混合盘篇)

背景

企业级存储中,SSD+HDD的混合盘是一种典型应用场景,可以兼顾成本、性能与容量。

但网易数帆存储团队经过测试(4k随机写)发现,加了NVMe SSD做Ceph的WAL和DB后,性能提升不足一倍且NVMe盘性能余量较大。所以我们希望通过瓶颈分析,探讨能够进一步提升性能的优化方案。

测试环境

Ceph性能分析一般先用单OSD来分析,这样可以屏蔽很多方面的干扰。 我们的测试环境如下所示,1个OSD:

usrname@hostname:~/cluster$ sudo ceph osd tree
ID CLASS WEIGHT  TYPE NAME                 STATUS REWEIGHT PRI-AFF
-5       1.09099 root single-wal-db
-6       1.09099     host single-wal-db-69
 1   hdd 1.09099         osd.1                 up  1.00000 1.00000


====== osd.1 =======
  devices                   /dev/sdc

  [ wal]    /dev/sdv2

      PARTUUID                  6b3f8b48-99ad-4ede-a4ab-0c23d5b5e162

  [  db]    /dev/sdv1

      PARTUUID                  b7debf8e-0907-4b80-90b9-04443a2e5c82

性能优化初览

在这里插入图片描述

上图主要是BlueStore 对于defer write写的一个总体流程。可以看到这里的性能优化主要是两个点:

  1. 重耗时模块影响上下文

问题:返回客户端写成功函数+落盘在同一个线程(_kv_finalize_thread)
优化:返回写成功前保证元数据写成功即可,故可把这两个阶段拆分到不同的线程:

  1. 重耗时模块在IO核心路径

问题:刷盘函数fdatasync在IO关键路径上(kv_sync_thread)
优化:函数目的是确保数据落盘。故可把其移动到非IO核心路径(_deferred_aio_finish)

IO瓶颈分析

[global]
ioengine=rbd
pool=single_wal_db
rbdname=volume01(100g)
invalidate=0  
rw=randwrite
bs=4k
runtime=180
[rbd_iodepth32]
iodepth=128

write: IOPS=1594, BW=6377KiB/s (6530kB/s)(374MiB/60106msec); 0 zone resets
    slat (nsec): min=1249, max=721601, avg=5098.70, stdev=6069.83
    clat (usec): min=1157, max=589139, avg=80279.11, stdev=77925.94
     lat (usec): min=1166, max=589141, avg=80284.20, stdev=77926.06
# osd
 "op_w_latency": {
            "avgcount": 95824,
            "sum": 7593.745711498,
            "avgtime": 0.079246803
        },
        "op_w_process_latency": {
            "avgcount": 95824,
            "sum": 597.747938957,
            "avgtime": 0.006237977
        },
     "op_before_queue_op_lat": {
            "avgcount": 95887,
            "sum": 3.172325348,
            "avgtime": 0.000033083
        },
        "op_before_dequeue_op_lat": {  
            "avgcount": 95895,
            "sum": 7001.039474373,
            "avgtime": 0.073007346
        },

# bluestore    

     "state_kv_queued_lat": {
            "avgcount": 95858,
            "sum": 103.287853014,
            "avgtime": 0.001077508
        },
        "state_kv_commiting_lat": {
            "avgcount": 95858,
            "sum": 49.291618042,
            "avgtime": 0.000514214
        },

    "throttle_lat": {
            "avgcount": 95858,
            "sum": 280.404541330,
            "avgtime": 0.002925207
        },

        "commit_lat": {
            "avgcount": 95858,
            "sum": 436.058305735,
            "avgtime": 0.004549002
        },

代码深度分析与代码优化

从上面耗时分析可以看出,op_before_dequeue_op_lat这个阶段的耗时占了大头,从如下代码可以看出,该阶段是从收到op到op出队列的时间:

void OSD::dequeue_op()
{
    utime_t now = ceph_clock_now();
    utime_t latency = now - op->get_req()->get_recv_stamp();
    logger->tinc(l_osd_op_before_dequeue_op_lat, latency);

    pg->do_request(op, handle);
}

另外发现还有一个关键阶段的耗时统计,即op_before_queue_op_lat,如如下代码可以看出,该阶段是从收到op到op入队列之前的时间:

void OSD::enqueue_op(spg_t pg, OpRequestRef& op, epoch_t epoch)
{
    utime_t latency = ceph_clock_now() - op->get_req()->get_recv_stamp();
    ogger->tinc(l_osd_op_before_queue_op_lat, latency);

    op_shardedwq.queue(make_pair(pg, PGQueueable(op, epoch)));
}

从OSD的时延统计可以看出,op_before_dequeue_op_lat耗时很长,但是op_before_queue_op_lat耗时很短,这可以说明耗时主要花费在工作线程入队到出队这块。

基于这个认识,所以首先考虑到的便是PG锁或者线程数太少处理不过来,第一步便是考虑调大Ceph逻辑pool的pg数,但是调大后,发现性能未有改变;所以进一步考虑调大线程数量,如下:

#osd_op_num_shards_hdd = 5(10)
#osd_op_num_threads_per_shard_hdd = 1(2)

 write: IOPS=1571, BW=6286KiB/s (6437kB/s)(369MiB/60057msec); 0 zone resets
    slat (nsec): min=1169, max=459761, avg=4347.07, stdev=5058.94
    clat (usec): min=1903, max=8069.2k, avg=81438.80, stdev=294739.08
     lat (usec): min=1919, max=8069.2k, avg=81443.15, stdev=294739.04

 # osd
        "op_w_latency": {
            "avgcount": 94385,
            "sum": 7544.120278825,
            "avgtime": 0.079929228
        },
        "op_w_process_latency": {
            "
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: ceph源码分析pdf是一本关于ceph分布式文件系统的源代码深度剖析的著作,通过详细分析ceph系统的架构、实现、核心代码等方面,帮助读者深入理解ceph系统的设计思路和工作原理。 本书主要分为三个部分,第一部分介绍了ceph系统的概述和架构,包括ceph系统的目标、特点、架构分层等;第二部分主要探讨了ceph系统的核心组件,包括RADOS、MDS、OSD等,深入剖析了它们的工作原理和实现方式;第三部分则是关于ceph系统的进阶主题,如分布式存储、数据一致性、故障处理等等。 本书的特点在于对ceph源代码的深度剖析,对每个核心组件都逐一分析了其关键代码,帮助读者了解ceph系统的实现方式。此外,本书也提供了一些示例代码,可以帮助读者更好地理解ceph的设计思路和实现细节。 总之,ceph源码分析pdf具有深入、全面、实用的特点,可以帮助ceph开发者和用户深入理解ceph系统的工作原理,快速掌握ceph的使用和开发技巧。 ### 回答2: Ceph是一个采用分布式架构的开源存储系统,具有高可用性、高可扩展性和高性能等优点。对于想要深入了解Ceph存储系统的开发者来说,ceph源码分析pdf是一个非常有价值的资源,可以帮助他们全面理解Ceph的架构和运行机制。 ceph源码分析pdf主要分为以下几部分: 1. Ceph的整体架构介绍 介绍Ceph的整体架构,包括Ceph分布式存储、元数据管理、数据访问、数据一致性、数据恢复等方面。同时,还会涉及到Ceph的各种组件和组件之间的关系。 2. Ceph的核心代码解析 对Ceph的核心代码进行深度解析,包括存储服务、客户端库、管理工具等部分。这部分内容非常重要,可以帮助开发者全面了解Ceph的代码,并有助于他们进行相关的开发工作。 3. Ceph性能优化 介绍Ceph性能优化方法,包括IO性能优化、网络性能优化、CPU性能优化等方面。这对于想要将Ceph应用于实际场景并且需要进行性能优化的开发者来说非常有价值。 总之,ceph源码分析pdf是一个非常有价值的资源,可以帮助开发者全面了解Ceph存储系统的架构和运行机制,并深入了解Ceph的核心代码和性能优化方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网易杭研

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值