暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Curve 块存储性能调优指南

OpenCurve 2023-03-01
380

前言

Curve 是云原生计算基金会 (CNCF) Sandbox 项目,是网易主导自研和开源的高性能、易运维、云原生的分布式存储系统。

Curve 块存储的参数是如何影响性能的,以及要如何调整,可以使得性能到达最优。本篇文章是 Curve 块存储应用实践中的性能调优篇,该系列文章包括:


参考性能

试场景:3台机器*10块/盘
盘的型号:Intel® Solid State Drive DC S3510 Series
测试工具:curve-fio
https://github.com/opencurve/fio#readme
测试版本:v1.2.5 配置copyset.enable_odsync_when_open_chunkfile=true。这个选项默认为false,可以优化性能,但是会有iops或者带宽抖动,请根据业务场景进行确定
测试卷大小:100GB

条带化卷参数:stripeUnit=16k stripeCount=64(大io建议创建条带化卷测试)

8k随机写测试数据

客户端个数:3
fio 配置:
    [global]
    bs=8K
    iodepth=128
    rw=randwrite
    direct=1
    numjobs=1
    size=100G
    ioengine=cbd
    runtime=999999
    time_based
    group_reporting
    ramp_time=10s
    性能数据:
    iops(k)avg lat(us)avg lat(us)
    27.94590
    27919
    27.74614
    27919
    28.14549
    27657

    512k顺序写测试数据

    客户端个数:3
    fio 配置:
      [global]
      bs=512k
      iodepth=128
      rw=write
      direct=1
      numjobs=1
      size=100G
      ioengine=cbd
      group_reporting
      runtime=90
      ramp_time=10s
      bandwidth(MB/s)avg lat(ms)99th lat(ms)
      338
      189372
      338
      189485
      343
      186397

      影响性能的关键指标

      能指标的查看途径有两种:
      • 直接通过服务的 ip:port 获取

      • 通过监控查看(块存储监控部署[1])

      环境配置

      环境配置可以参考: 推荐配置设置[2]
      需要特别说明的是,对于使用 RAID/SAS 卡及 Sata SSD 的环境,需要在关闭磁盘缓存后,重启机器,使 RAID/SAS 卡识别磁盘缓存已经关闭。如果磁盘缓存打开,对文件的 sync 操作会发送至磁盘,导致磁盘性能下降。启后,对 SSD 盘上的文件系统,进行 fio 测试,验证缓存是否关闭。
      fio 脚本:
        [global]
        rw=randwrite
        iodepth=1
        ioengine=psync
        fdatasync=1
        bsrange=4k-4k
        size=4G
        numjobs=32
        group_reporting
        time_based=1
        thread=1
        runtime=10000


        [disk0]
        filename=/data/chunkserver0/data
        [disk1]
        filename=/data/chunkserver1/data

        如果有多个SSD盘,在 fio 脚本的后面加上对应的盘。

        fio 测试写入的文件,最好提前通过 dd 命令创建或覆盖写一遍,dd if=/dev/zero of=/data/chunkserver0/data bs=1M count=4096 oflag=direct

        如果关闭成功,fio 报告的 IOPS 与 iostat -mtx 1 看到的 SSD 盘上的 w/s 是一致的:
        如果缓存未关闭或机器未重启,会出现 fio 报告的 IOPS 只有 SSD 盘上 w/s 一半的情况:

        服务端

        1. 复制组的 leader 在 chunkserver 上的分布是否均衡
        在 Curve 块存储中,所有的读写请求都是发往 leader 处理的,如果复制组的 leader 在 chunkserver 上分布不均衡,会导致 chunkserver 上接受到请求的压力不同,导致无法完全发挥集群性能。
        • metric 指标查看:curl leadermdsip:leadermdsport/vars | grep leadernum_range 查看 chunkserver上leader 数量最大和最小的差值,一般这个值在5以内认为集群是均衡的

          topology_metric_logical_pool_default_logical_pool_leadernum_range : 1.000
          • 监控:MDS DashBord/chunkserver 状态 panel

          • leader 不均衡时可以通过命令触发快速均衡:curve_ops_tool rapid-leader-schedule。这个命令创建的配置变更任务是随着心跳上报的,所以均衡效果在几个心跳周期之后可以看到(默认心跳周期是10s)。
          2. 复制组之间的心跳周期
          在 Curve 块存储中,复制组的心跳周期通过 chunkserver 的配置项 copyset.election_timeout_ms=1000 确定,默认是1s。由于复制组的心跳和用户数据的复制都是使用的 bthread,当集群压力特别大时,会导致复制组心跳超时,复制组的 leader 在不断的切换。有三个表现:
          • 从监控上可以看到每个 chunkserver 上的 leader 不均衡,并且单个 chunkserver 上的 leader 总是在变动(参考 1. 复制组的 leader 在 chunkserver 上的分布是否均衡)

          • 监控项 chunkserver Dashbord/线程指标 Panels 中 bthread 的使用率持续飙高。更多信息的获取可以参考 brpc 线程数量查看:

          • chunkserver 的日志中有大量 leader 选举日志:
                LOG(INFO) << "node " << _group_id << ":" << _server_id
            << " received PreVoteResponse from " << peer_id
            << " term " << response.term() << " granted " << response.granted();
            这会导致 client 端有很多重试的 rpc,加剧集群压力。
            这种情况可以通过增大心跳周期规避 leader 频繁切换对性能的影响,即 chunkserver 配置项 copyset.election_timeout_ms=1000。但这种规避方法不建议在生产环境中使用,复制组的心跳周期变大,会导致异常情况下 IO 的卡顿时间变长。复制组的心跳不受 IO 压力影响已经在优化中了,预计 Q1 会发布版本。
            3. 查看chunkserver节点上磁盘的压力
            Curve 块存储性能测试时,理想的状态是可以把磁盘跑满。如果发现有性能瓶颈,可以先查询一下,磁盘是否被打满。
            • 通过 linux 命令 iostat 查看磁盘压力情况,一般看观察 util 是否接近100%,cpu 的 idle 是否接近0;

            • 通过查看监控项 chunkserver Dashbord/Raft 关键指标 Panels

              storage_append_entries_latency : 写盘的延迟(一般ssd的延时在百us~几ms级别;hdd延迟在数十ms级别)

              raft_send_entries_latency: 一次写盘延迟+一次rpc延迟(一般rpc的延迟在百us~几ms级别)

            如果底层磁盘已经压满,理论上就已经达到了集群性能上限。

            客户端
            1. 大 IO 顺序写场景建议使用条带化卷
            条带化卷的原理可以参考:条带化设计[3]。概括来说,条带化是将大 IO 按照指定的配置,分发到多个复制组上,从而提高性能。

            条带化卷的创建:

            curve_ops_tool create -fileName=/test -userName=test -password=123 -fileLength=20 -stripeUnit=32768 -stripeCount=32
            2. 直接使用 Curve fio 测试

            当前 Curve 块存储支持的几个协议 nbd、openstack、iscsi 都是要跟 Curve 热升级[4]模块对接的,在 IO 链路上会多一次 RPC。当前 Curve 块存储版本已经稳定,如果不考虑热升级,可以去掉热升级模块,提高性能。

            Curve 块存储 fio 的使用方式可以参考:Fio for Curve README[5]

            其他指标简析

            详见 Curve 块存储监控项说明[6]

            IO 过程中全链路关键阶段时延的 metric 查看(DashBord/Pannel,指标的具体含义请查看 Curve 块存储监控项说明[7]):

              client端:
              用户接口层指标/client_write_latency
              rpc层指标/write_rpc_latency


              chunkserver端:
              rpc层读写指标/avg_write_lat
              chunkserver层读写指标/avg_write_lat
              Raft关键指标/raft_send_entries_latency
              Raft关键指标/raft_service_append_entries_latency
              Raft关键指标/storage_append_entries_latency

              <原作者:李小翠,Curve Maintainer>




              参考[1]:

              https://github.com/opencurve/curveadm/wiki/curvebs-monitor-deployment

              参考[2]:

              https://github.com/opencurve/curve/blob/master/docs/cn/%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83%E9%85%8D%E7%BD%AE%E4%BF%A1%E6%81%AF.md

              参考[3]:

              https://github.com/opencurve/curve/blob/master/docs/cn/curve-stripe.pdf

              参考[4]:

              https://github.com/opencurve/curve/blob/master/docs/cn/nebd.md

              参考[5]:

              https://github.com/opencurve/fio#readme

              考[6]:

              https://github.com/opencurve/curve/blob/master/docs/cn/Curve%E7%9B%91%E6%8E%A7%E6%8C%87%E6%A0%87%E8%A7%A3%E6%9E%90.md

              考[7]:
              https://github.com/opencurve/curve/blob/master/docs/cn/Curve%E7%9B%91%E6%8E%A7%E6%8C%87%E6%A0%87%E8%A7%A3%E6%9E%90.md



              ------ END. ------

              🔥 推荐用户案例阅读:
              Curve 文件存储在 Elasticsearch 冷热数据存储中的应用实践
              扬州万方:基于申威平台的 Curve 块存储在高性能和超融合场景下的实践
              创云融达:基于 Curve 块存储的超融合场景实践 
              🔥 推荐硬核技术解析阅读:
              ChunkServer 优化使用 bthread 的思考
              通过 Samba 来使用 CurveFS 
              Curve 块存储 IO 链路零拷贝



              关于 Curve 

              Curve 是一款高性能、易运维、云原生的开源分布式存储系统。可应用于主流的云原生基础设施平台:对接 OpenStack 平台为云主机提供高性能块存储服务;对接 Kubernetes 为其提供 RWO、RWX 等类型的持久化存储卷;对接 PolarFS 作为云原生数据库的高性能存储底座,完美支持云原生数据库的存算分离架构。

              Curve 亦可作为云存储中间件使用 S3 兼容的对象存储作为数据存储引擎,为公有云用户提供高性价比的共享文件存储。

              • GitHub:https://github.com/opencurve/curve
              • 官网https://opencurve.io/
              • 用户论坛:https://ask.opencurve.io/
                微信群:搜索群助手微信号 OpenCurve_bot

              文章转载自OpenCurve,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论