Curve 块存储应用实践 -- iSCSI

news2024/10/6 14:27:19

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

为了让大家更容易使用以及了解 Curve,我们期望接下来通过系列应用实践文章,以专题的形式向大家展示 Curve。

本篇文章是Curve块存储应用实践的第一篇,该系列文章包括:

  • Curve块存储应用实践一部曲之iSCSI
  • Curve块存储应用实践二部曲之nbd
  • Curve块存储应用实践三部曲之云主机
  • Curve块存储应用实践四部曲之云原生数据库
  • Curve块存储应用实践五部曲之性能调优

iSCSI 及 tgt 简介

tgt 是一个开源 iSCSI 服务器,详情请见 tgt githu[1]。我们在开发 Curve 块设备服务器时,想让更多的系统能够使用 Curve 块设备,而不仅仅是 Linux 系统,iSCSI 协议是一个广泛使用的块设备协议,我们想修改 tgt 以便让 Curve 提供 iSCSI 服务。

Curve 块存储

为tgt提供了访问 Curve 的驱动,详见部署网络高性能版本tgt[2] , 文档里有操作步骤,这样用户就可以在任何支持 iSCSI 的操作系统上使用 Curve 块设备存储,例如Windows。

Curve 在初步使用 tgt 时也遇到一些问题:

我们观察到原版 tgt 使用单一主线程 epoll 来处理 iSCSI 命令,还包括管理平面的 unix domian socket 也在这个主线程里。

在10 Gbit/s 网络上甚至更快的网络上,单线程(也即单cpu)处理 iSCSI 命令的速度已经跟不上需求了,一个线程对付多个target的情况下,多个iSCSI Initiator的请求速度稍微高一点,这个单线程的cpu使用率就100%忙碌。

所以本文的重点就是介绍tgt的性能优化。同时社区用户使用过程中还遇到了nebd服务的单点和性能问题,社区用户对此也进行了优化,详情可参考创云融达基于 Curve 的智慧税务场景实践。

Curve 对 tgt 的性能优化实践

 1.使用多个线程做 epoll

实现多个event loop线程,每个线程负责一定数量的socket connection上的iSCSI命令处理。这样就能发挥多cpu的处理能力。

2.为每个 target 创建一个 epoll 线程

为了避免多个target共享一个epoll时依然可能出现超过单个cpu处理能力的问题,我们为每一个 target设置了一个epoll线程。target epoll的cpu使用由OS负责调度,这样在各target上可以 实现公平的cpu使用。当然如果网络速度再快,依然会出现单个epoll线程处理不过来一个iSCSI target上的请求,但是目前这个方案依然是我们能做的最好方案。

3. 管理平面

管理平面保持了与原始tgt的兼容性。从命令行使用方面来说,没有任何区别,没有任何修改。管理平面在程序的主线程上提供服务,主线程也是一个epoll loop线程,这与原始的tgt没有区别,它负责target,lun,login/logout,discover,session, connection等的管理。当Intiator连接到iSCSI 服务器时,总是先被管理平面线程所服务,如果该connection最后需要创建session去访问某个target,那么该connection会被迁移到对应的target的epoll线程上去。

4. 数据结构的锁

为每一个target提供一个mutex,当target epoll线程在运行时,这把锁是被该线程锁住的,这样该线程可以任意结束一个sesssion或connection,当线程进入epoll_wait时,这把锁是释放了的,epoll_wait返回时又会锁住这把锁。我们修改了相关代码,让这个epoll线程不用遍历target list,只存取它服务的target相关结构,这样我们不需要target列表锁。管理面也会增加、删除一个session或者connection时,也需要锁住这把target锁。所以管理面和target epoll线程使用这个mutex来互斥,这样就可以安全地访问对应target上的session和connection了。

5. connection 建立 session

当login_finish成功时,login_finish有时候会创建session(如果没有session存在)。login_finish在connection结构的字段migrate_to里设置目标iSCSItarget。

6. 什么时候做 connection 迁移

当调用返回到iscsi_tcp_event_handler时,因为login_finish设置了migrate_to目标target,iscsi_tcp_event_handler就锁住目标iscsi target结构,并把该connection的fd插入到目标target的evloop 里面,完成迁移。

7. 设置 pthread name

设置各target event loop的线程在top中的名为tgt/n, n为target id,这样容易用top之类的工具观察哪一个target占用的cpu高。

8. 举个例子

假如MGMT要删除一个target,下面的代码说明了流程:

/* called by mgmt */
tgtadm_err tgt_target_destroy(int lld_no, int tid, int force)
{
        struct target *target;
        struct acl_entry *acl, *tmp;
        struct iqn_acl_entry *iqn_acl, *tmp1;
        struct scsi_lu *lu;
        tgtadm_err adm_err;

        eprintf("target destroy\n");

        /*
         * 这里因为控制面是单线程的,而且SCSI IO线程不会删除target,
         * 所以我们找target的时候并不需要锁
         */

        target = target_lookup(tid);                                  
        if (!target)                                            
                return TGTADM_NO_TARGET;

        /*
         * 这里要锁住target,因为我们要删除数据结构,所以不能和iscsi io
         * 线程一起共享,必须在scsi 线程释放了锁时进行
         */        target_lock(target);                                            
        if (!force && !list_empty(&target->it_nexus_list)) {
                eprintf("target %d still has it nexus\n", tid);
                target_unlock(target);                 
                return TGTADM_TARGET_ACTIVE;
        }        
 …
        /* 以上步骤删除了所有资源 ,可以释放锁了 */
        target_unlock(target);                                               
        if (target->evloop != main_evloop) {
                /* 通知target上的evloop停止,并等待evloop 线程退出 */
                tgt_event_stop(target->evloop);                         
                if (target->ev_td != 0)                                 
                        pthread_join(target->ev_td, NULL);
                /* 下面把evloop的资源删除干净 */
                work_timer_stop(target->evloop);                      
                lld_fini_evloop(target->evloop);
                tgt_destroy_evloop(target->evloop);
       }

性能优化结果

我们为tgt配置了3块盘,一块 Curve 块存储卷,两块本地盘

 <target iqn.2019-04.com.example:curve.img01>
    backing-store cbd:pool//iscsi_test_
    bs-type curve
</target>

<target iqn.2019-04.com.example:local.img01>
    backing-store /dev/sde
</target><target iqn.2019-04.com.example:local.img02>
    backing-store /dev/sdc
</target>

使用本机登录iscsi iscsiadm --mode node --portal 127.0.0.1:3260 --login

为fio设置存取这些 iSCSI 的块设备,使用:

[global]
rw=randread
direct=1
iodepth=128
ioengine=aio
bsrange=16k-16k
runtime=60
group_reporting

[disk01]
filename=/dev/sdx

[disk02]
filename=/dev/sdy
size=10G

[disk03]
filename=/dev/sdz
size=10G

测试结果如下:

下面是未经优化的fio成绩,IOPS 38.8K

下面是经过多线程优化的fio成绩,IOPS 60.9K

<原创作者:徐逸锋,Curve PMC>

参考[1]:https://github.com/fujita/tgt

参考[2]:https://github.com/opencurve/...

【点击了解更多网易技术】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/66511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

activiti框架搭建及问题记录

activiti应用什么是activitiactiviti配置首先创建项目配置pom依赖配置文件那么审批&#xff08;流程&#xff09;怎么创建呢&#xff1f;流程启动任务处理activiti问题分享数据库创建问题activiti事件监听器没有对象的问题什么是activiti activiti是一个业务流程管理的框架&am…

LeetCode中等题之使括号有效的最少添加

题目 只有满足下面几点之一&#xff0c;括号字符串才是有效的&#xff1a; 它是一个空字符串&#xff0c;或者 它可以被写成 AB &#xff08;A 与 B 连接&#xff09;, 其中 A 和 B 都是有效字符串&#xff0c;或者 它可以被写作 (A)&#xff0c;其中 A 是有效字符串。 给定一…

开发工具系列IDEA:配置注释自动生成

一、类、接口、枚举配置&#xff0c;进入idea后&#xff0c;依次打开 File -> Settings -> Editor -> File and Code Templates -> Files /*** FileName: ${NAME}* Author: ${USER}* Date: ${DATE} ${TIME}* Description: ${DESCRIPTION}* History:* <aut…

中国电信移动物联网发展成果与创新实践 ,干货满满

近日&#xff0c;首届移动物联网大会&#xff08;2022&#xff09;&#xff08;以下简称“大会”&#xff09;在江苏省无锡市举办。本次大会由工信部指导&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;、中国通信学会、无锡市人民政府、人民邮…

产品工作流| 项目评估

一、什么是项目评估 根据已有的公开招标书要求&#xff0c;销售侧拿到招标要求&#xff0c;让研发评估项目。 1、需求满足度评估。 2、需求开发项&#xff0c;以及成本评估。 3、总结项目评估。 二、项目评估流程 材料依据&#xff1a; 1、投标材料。 2、项目评估表&#x…

路由器,集线器,交换机,网桥,光猫有啥区别?

网络分层 网线替代了上面的灰色部分&#xff0c;实现物理层互联。 如果想要两台电脑互联成功&#xff0c;还需要确保每一层所需要的步骤都要做到位&#xff0c;这样数据才能确保正确投送并返回。 从数据链路层到物理层&#xff0c;数据会被转为01比特流。 此时需要把比特流传…

【软件测试】小陈她的测试追梦之路,实习开端到测试第一人......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 小陈&#xff1a;我…

中华黄金·金生态合伙人颁奖典礼在珠海站开幕完美收官!!

11月18-19日在广东珠海举行&#xff0c;近百位合伙人亲临现场&#xff0c;强者能人共聚天下&#xff0c;中华黄金合伙人&#xff0c;强强联手引爆市场&#xff0c;汇聚一堂。 本次活动以“金生态”为主题。CNG金生态是中华黄金集团旗下平台&#xff0c;运用WEB3.0核心技术聚合了…

Flink CDC入门实践--基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL

文章目录前言1.环境准备2.准备数据2.1 MySQL2.2 postgres3.启动flink和flink sql client3.1启动flink3.2启动flink SQL client4.在flink SQL CLI中使用flink DDL创建表4.1开启checkpoint4.2对于数据库中的表 products, orders, shipments&#xff0c; 使用 Flink SQL CLI 创建对…

iOS开发之iOS15.6之后拉流LFLiveKit,画面模糊及16.1马赛克问题

更新了iOS15.6系统后&#xff0c;发现拉取LFLiveKit进行直播的流&#xff0c;竟然是这样的&#xff1a; 模糊不清&#xff0c;于是思考是什么原因导致的。 1、是不是拉流端出现的问题&#xff1f; 使用安卓拉取iOS的直播流&#xff0c;是同样的效果&#xff0c;又考虑到两端使…

【DL】Windows 10系统下安装TensorRT教程

Windows 10系统下安装TensorRT教程(手把手教程): Windows 10系统下安装TensorRT教程: 1.下载 https://developer.nvidia.com/nvidia-tensorrt-download EA 版本代表抢先体验(在正式发布之前)。 GA 代表通用性。表示稳定版,经过全面测试。 TensorRT、cuda、cudnn各版本…

与目前主流的消费返利平台对比,共享购模式有什么优势呢?

大家好&#xff0c;我是林工&#xff0c;之前几期内容都有介绍过共享购的商业模式&#xff0c;同时大家应该都对消费返利这方面有所了解。今天给大家分享一下整套模式的优劣势。 什么是消费返利&#xff1f;消费返利是互联网常见的一个商业模式&#xff0c;是指互联网平台将自…

毕业设计 基于STM32与wifi的天气预报网时钟系统 - 物联网 单片机

文章目录0 前言1 设计内容2 软件设计3 关键代码4 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不…

为社区成员提供的全新在线分析仪表板(Analytics Dashboard)!

开发者们大家好&#xff01; 我们非常激动地与您分享我们为每个社区成员提供的在线分析仪表板(Online Analytics Dashboard)这一全新的强大功能&#x1f525; 从现在开始&#xff0c;您可以看到您自己的当周、月和所有时间的详细统计数据&#xff0c;包括&#xff1a; 浏览量&a…

The Sandbox Alpha 第三季排行榜公布

排行榜名单已经揭晓&#xff0c;祝贺所有玩家&#xff01; Alpha 第三季已于 11 月 1 日落下帷幕&#xff0c;这是我们目前最大的一季活动&#xff0c;也是展示社区和合作伙伴在过去一年中所创造的诸多体验的机会。 这次也是我们测试新的「边玩边赚」机制的机会&#xff0c;其中…

Vue响应式系统的作用与实现(二)

响应式系统的作用与实现&#xff08;二&#xff09; 这章主要是介绍非原始值的响应式方案。 1.理解Proxy和Reflect&#xff1a; Vue3的响应式数据是基于Proxy实现的&#xff0c;那么我们非常有必要了解Proxy和Refelct。 参考资料&#xff1a;阮一峰的 官方参考资料 简单来…

Python Flask框架 入门详解与进阶

Python Flask框架 入门详解与进阶1.Flask框架 入门2.环境搭建2.1.安装flask1.创建虚拟环境2.激活虚拟环境3.安装flask2.2.flask程序编写1.创建test.py文件2.启动运行2.3.参数说明1.Flask对象的初始化参数第一种 &#xff1a;从配置对象中加载 app.config.from_object(DefaultCo…

chrome108 版本跨域问题

前言 近期&#xff0c;chrome又更新了&#xff0c;自动更新到了chrome的108.0.5359.95&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09;&#xff0c;更新到这个版本后&#xff0c;公司业务收到了一个故障&#xff0c;下面我们就来看看。背景&#xff1a; 客户…

Python——requests模块详解

1、模块说明 requests是使用Apache2 licensed 许可证的HTTP库。 用python编写。 比urllib2模块更简洁。 Request支持HTTP连接保持和连接池&#xff0c;支持使用cookie保持会话&#xff0c;支持文件上传&#xff0c;支持自动响应内容的编码&#xff0c;支持国际化的URL和POS…

公众号查题系统

公众号查题系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳转…