Curve 块存储应用实践 -- iSCSI

这篇具有很好参考价值的文章主要介绍了Curve 块存储应用实践 -- iSCSI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

Curve 块存储应用实践 -- iSCSI

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

Curve 块存储应用实践 -- iSCSI

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

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

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

【点击了解更多网易技术】文章来源地址https://www.toymoban.com/news/detail-427210.html

到了这里,关于Curve 块存储应用实践 -- iSCSI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iSCSI共享存储搭建

    iSCSI:Internet Small Computer System Interface,Internet小型计算机系统接口,又称为IP-SAN,是一种基于因特网及SCSI-3协议下的存储技术。 基于客户端和服务端架构的虚拟磁盘技术,服务端提供磁盘空间,客户端连接并且可以当成本地磁盘来用。 backstore 后端存储:对应到服务端提供实

    2024年02月08日
    浏览(41)
  • 基于IP网络的存储协议——iSCSI

    文章首发地址 iSCSI(Internet Small Computer System Interface)是一种基于IP网络的存储协议,它能够在TCP/IP网络上实现SCSI协议,使得不同的主机可以通过网络共享存储设备。iSCSI可以将存储设备映射到本地主机上,使得主机可以像本地磁盘一样使用存储设备。 iSCSI Initiator: iSCSI发起端

    2024年02月09日
    浏览(34)
  • TrueNas Scale 配置iSCSI存储服务

    iSCSI协议的可将存储服务器的硬盘作为实体盘加载至计算机当中,读写速度取决于客户机与存储服务器之间的链路速度和磁盘的读写速度,假设磁盘的读写速度是W:500MB/s,R:700MB/s,此时客户机与存储服务器之间的链路速度为1Gbps,那么磁盘的实际读写速度不会超过W:100MB/s,R:100MB/s,但

    2024年02月10日
    浏览(44)
  • 利用iSCSI服务部署IP SAN网络存储服务

    一、配置环境(Vmware WorkStation虚拟环境) 服务端与客户端OS:openEuler 22.03-LTS CPU:1U1C 内存:2G 硬盘:5个SCSI磁盘,其中一个作为系统盘,另外四个配置为RAID5阵列 服务器IP:192.168.17.200 二、详细配置过程 1、配置RAID5 其中,-Cv参数为创建阵列并显示过程,/dev/md0为生成的阵列组

    2024年02月21日
    浏览(41)
  • 字节跳动 ByteHouse 云原生之路 – 计算存储分离与性能优化

    01 起源 ByteHouse 的故事从字节跳动对于先进数据处理和分析的需求开始,这一需求随着公司业务规模的迅速扩张而日益增长,起源是对开源数据库管理系统 ClickHouse 的改造和增强。面对数据处理的高延迟、大规模数据操作的复杂性以及数据存储和处理成本的上升,字节跳动的

    2024年01月21日
    浏览(43)
  • SpringBoot与SpringCloudAzure:微软云原生应用实践

    微软的Azure是一款云计算平台,它为开发者提供了一系列的云服务,包括计算、存储、数据库、AI等。Spring Boot是一款Java应用程序开发框架,它简化了开发人员的工作,使得他们可以快速地构建出高质量的应用程序。Spring Cloud是一款基于Spring Boot的云原生应用开发框架,它提供

    2024年02月21日
    浏览(33)
  • 开源云原生数仓引擎ByConity 存储计算分离架构和优势

    供稿 | ByConity技术团队 出品 | CSDN 云计算 ByConity是一款字节跳动开源的云原生数仓引擎。它的一个重要优势是 采用存储计算分离的架构,实现了读写分离和弹性扩缩容 。这种架构确保读操作和写操作不会相互影响,使得计算资源和存储资源解耦,两者可以按需的且独立的扩缩

    2024年02月06日
    浏览(48)
  • 云计算:从基础架构原理到最佳实践之:云计算网络与存储

    作者:禅与计算机程序设计艺术 云计算作为一种新型的服务方式,无疑将会成为下一个发展阶段的计算模式。很多企业或个人都认为云计算将改变传统IT的格局。传统的IT环境主要面临以下三个问题: 1.硬件成本高 云计算需要大量的服务器、存储设备和带宽等资源,因此价格

    2024年02月07日
    浏览(45)
  • 从传统应用程序迁移到云原生:最佳实践和挑战

    作者:禅与计算机程序设计艺术 在现代企业应用架构中,应用程序往往作为整个业务线的支柱之一。许多公司都在追求更高效、更简洁、更可靠的架构,并逐渐将传统应用系统迁移到基于云平台的容器化部署模型。其中一种迁移方式就是使用Cloud Native计算模型(CNCF)。Cloud Na

    2024年02月05日
    浏览(51)
  • 云原生数据湖以存储、计算、数据管理等能力通过信通院评测认证

    又一项大能力-云原生数据湖获得信通院认证啦! 近日,中国信息通信研究院 (以下简称“信通院”) 正式公布了第十四批“大数据产品能力评测”结果,腾讯云云原生数据湖 基于对象存储 COS,数据湖加速器 GooseFS、数据万象 CI 和容器服务 TKE 的数据湖解决方案 V5.0 ,在存储能

    2024年02月02日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包