iSCSI是现代企业级存储系统中的一项重要技术, 开源iSCSI 服务器tgt存在单线程性能问题,而相关的优化补丁效果参差不齐,尚未真正解决问题,本文介绍网易数帆存储团队如何通过一系列独特的创新实现tgt性能的大幅提升,并将其用于开源云原生软件定义存储Curve,让Curve块设备系统在不同操作系统环境下保持高性能。

背景

1. CurveBS

Curve(github.com/opencurve/curve)是网易数帆开源的云原生分布式存储系统,包括块设备系统CurveBS和文件系统CurveFS。其中CurveBS承担了大量的任务,例如作为KVM虚拟机和K8s PV等的云盘,是云平台的基础设施。CurveBS也可以被用户使用在其他业务场景,例如企业里的SAN存储系统可以用CurveBS来替代——因为CurveBS使用Raft副本一致性和CopySet概念可以自动修复损坏的副本,无论在可靠性还是稳定性方面,这些特色足以替代传统的SAN,在可扩容、性价比方面甚至超过了传统的SAN。

2. iSCSI

说到SAN等传统存储设备,我们不得不提到SCSI,SCSI作为外部块设备的连接和传输协议,是最广泛的块设备协议,于1979首次提出,是为小型机研制的一种接口技术,现在已完全普及到了小型机、服务器以及普通PC上。为了能够在TCP/IP上进行数据块传输,Cisco和IBM两家发起iSCSI协议,并且得到了各大存储厂商的大力支持。iSCSI可以实现在IP网络上传输SCSI协议,使其能够在诸如高速以太网上进行快速的数据存取备份操作。iSCSI标准在2003年2月11日由IETF(互联网工程任务组)认证通过。iSCSI继承了两大最传统技术:SCSI和TCP/IP协议。这为iSCSI的发展奠定了坚实的基础。基于iSCSI的存储系统只需要不多的投资便可实现SAN存储功能,甚至直接利用现有的TCP/IP网络。特别是对于非Linux系统例如Windows系统,如果想使用CurveBS作为Windows的硬盘,让CurveBS支持iSCSI协议即可。

3. tgt是什么

为了支持iSCSI,必须要有iSCSI服务器软件,tgt(Linux target framework)就是一个开源的iSCSI服务器,详情请见 https://github.com/opencurve/curve-tgt/blob/master/README。

相对业界目前其他的开源的iSCSI服务器软件,我们发现tgt是最合适的方案,因为它是纯用户态的,不依赖于操作系统内核,不需要针对不同内核版本编写不同的代码,可以让开发工作变得简单很多。

我们在开发Curve块设备服务器时,想让更多的系统能够使用CurveBS块设备,而不仅仅是Linux系统,于是我们修改tgt以便让CurveBS提供iSCSI服务,为此我们为tgt增加了原生的CurveBS驱动,直接通过curvebs part 1接口读写CurveBS,绕过了内核块设备层,节省了系统资源和对内核块设备层的调用。

4. 使用tgt中碰到的问题

我们观察到原版tgt使用单一主线程epoll event loop来处理iSCSI命令,还包括管理平面的unix domian socket也在这个主线程里。在10 Gbit/s网络上甚至更快的网络上,单线程(即单CPU)处理iSCSI命令的速度已经跟不上需要了,一个线程对付多个target的情况下,多个ISCSI Initiator的请求速度稍微高一点,这个单线程的iSCSI使用率就100%忙碌了。于是优化tgt的事情提上日程,国内也早有业界同行说过tgt的单线程实现有性能问题,还有sheepdog的开发者也提过如何优化的方法。经过认真研究,抱着一定要成功的决心,我们仔细分析了tgt的架构,找到了优化它的方法。这个方法是Curve团队独创的,完全不参考任何外部补丁,因为我们觉得那些补丁都不能真正解决问题。

网易数帆优化策略

1. 使用多个线程做epoll

现代CPU的性能依然遵守摩尔定律,但是摩尔定律的实现路径发生了变化,单CPU时钟频率不再提高,而是代之以更多的物理CPU核。为此,我们必须要实现多个epoll event loop线程,每个线程负责一定数量的socket connection上的iscsi命令处理,这样才能发挥多CPU的处理能力。

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

具体到实现过程中,为了避免多个target共享一个epoll线程时依然可能出现超过单个CPU处理能力的问题,我们为每一个target设置了一个epoll线程。target epoll 线程的CPU使用由OS调度器负责调度,这样在各target上可以实现公平的cpu使用,如果CPU足够多,每个target都可以有一个CPU来服务,这会大大提高性能。当然如果网络速度再快些,SSD的IO性能再好些,依然会出现单个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里的数据结构都用这把锁保护,当target epoll线程在运行时,这把锁是被该线程锁住的,这样该线程可以任意结束一个session或connection,当线程进入epoll_wait时,这把锁是释放了的,epoll_wait返回时又会锁住这把锁。我们修改了相关代码,让这个target epoll线程不用遍历target list,只存取它服务的target相关结构,这样我们不需要target列表锁。管理面也会修改target里面的数据结构,移动一个登录connection,删除一个session或者connection,这都需要锁住这个target锁。所以管理面和target epoll线程使用这个mutex来互斥,这样就可以安全地访问对应target了。因为管理面是单线程的,而众多target epoll线程不遍历target list,所以我们整个系统里都不需要target list锁,我们唯一增加的就是target锁。

5. connection建立session

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

6. connection加入到session

通常一个新的连接产生一个新的session,就如上面讲的login_finish一样。但是有一种情况,iSCSI允许一个session里有多个连接,这样connection直接加入到这个session里,这是由login_security_done做的。

7. 什么时候做connection迁移

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

8. 设置pthread name

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

9. 一个实现例子

假如管理面要删除一个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* 线程一起共享,必须在target event loop线程释放了锁时进行*/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);}

优化效果

1. 性能对比

我们为tgt配置了3块盘,包括1块CurveBS卷,2块本地盘

<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。

可见tgt性能得到大幅度提高,随着target的增加,我们再也不用担心系统的里CPU被浪费了。

2. Windows测试

本系统对Windows经过初步测试,运行良好。具体怎么在Windows上配置iSCSI客户端,可以参照:https://jingyan.baidu.com/article/e4511cf37feade2b845eaff8.html

需要注意的是,在Windows上设置CHAP认证时,密码必须设置为12到16个字符,并且和tgt上保持一致。如果密码设置不在这个长度范围内,就会出现了奇怪的Windows iSCSI错误。

tgt与Curve

我们为tgt提供了访问CurveBS的驱动,详见doc/README.curve, 这样用户就可以在任何支持iSCSI的操作系统上(例如Windows、Mac)使用CurveBS块设备存储。

为tgt增加了扩容感知功能,因为CurveBS的块设备是可以扩容的,而原来tgt只能在创建lun时确定块设备的大小,此后不能改变,我们增加了代码,让tgtadm命令可以通知tgt扩容信息。iSCSI客端可以重新读取lun的大小以完成扩容。具体怎么重新读取lun的大小,可以参见doc/README.curve。

小结

本文介绍了网易数帆Curve团队在使用tgt中遇到的问题,对tgt的独门优化手段和取得的效果,以及tgt在CurveBS中的应用。当前iser target服务依然归属于主线程服务,鉴于RDMA的普及程度,这部分代码还没有修改。预计随着RDMA环境的普及,我们将会做出进一步的优化。

了解更多

  1. Curve项目主页:http://www.opencurve.io/

  2. tgt使用文档:https://github.com/opencurve/curveadm/wiki/others#部署-tgt

  3. 网易数帆专家将于Curve社区线上双周会解读tgt优化及其他Curve相关技术,欢迎微信扫描以下二维码加入Curve用户群,查看Curve双周会时间/议题安排及更多动态。

本文作者:网易数帆Curve团队

网易数帆开源iSCSI服务器tgt独门优化,彻底解决性能问题相关推荐

  1. Kyuubi: 网易数帆开源的企业级数据湖管理平台(架构篇)

    Kyuubi是网易数帆旗下易数大数据团队开源的一个企业级数据湖管理平台,建立在Apache Spark之上.Kyuubi提供一个高性能的通用JDBC和SQL执行引擎,通过它,用户能够像处理普通数据一样 ...

  2. 性能 1.84 倍于 Ceph!网易数帆开源分布式存储系统 Curve

    作者 | 陈利鑫 头图 | CSDN 下载自东方 IC 出品 | CSDN(ID:CSDNnews) 也许是厂家+"云"的后缀会让人产生这些厂商都是竞争关系的错觉,网易云最近宣布品 ...

  3. Hango Rider:网易数帆开源 Envoy 企业级自定义扩展框架

    可扩展性是网络代理软件最为关键的特性之一,灵活强大的可扩展性可以大大拓展网络代理软件的能力边界.作为新兴的开源高性能网络代理软件,Envoy 本身提供了相对丰富的可扩展能力,如基于 C++ 的原生扩展 ...

  4. 网易数帆发布自主开源计划,聚焦云原生生产落地

    10月21日,一年一度的网易数字+大会在杭州拉开帷幕,网易数帆在会上发布了围绕云原生生产落地的自主开源计划,在这一主题下开源的KubeDiag.KubeCube.Hango(函谷)等云原生项目,以及未 ...

  5. 网易数帆 Envoy Gateway 实践之旅:坚守 6 年,峥嵘渐显

    服务网格成熟度不断提升,云原生环境下流量处理愈发重要, Envoy Gateway 项目于近日宣布开源,"旨在大幅降低将 Envoy 作为 API 网关的使用门槛",引发了业界关注 ...

  6. 网易数帆Curve加入PolarDB开源数据库社区

    简介:Curve社区签署阿里巴巴开源CLA(Contribution License Agreement, 贡献许可协议), 正式与阿里云PolarDB 开源数据库社区牵手. Curve社区签署阿里巴 ...

  7. Arctic开源!网易数帆×华泰证券,推动湖仓一体落地

    数字化转型趋势下,各行业对数据生产力的探索与追求逐步进入深水区.现实的问题是,企业数据仓库存储.数据湖多种技术并存的局面将长期存在,如何才能摆脱技术协同的内耗,让大数据直通生产力的彼岸? 8月11日下 ...

  8. Arctic开源!网易数帆X华泰证券,推动湖仓一体落地

    数字化转型趋势下,各行业对数据生产力的探索与追求逐步进入深水区.现实的问题是,企业数据仓库存储.数据湖多种技术并存的局面将长期存在,如何才能摆脱技术协同的内耗,让大数据直通生产力的彼岸? 8月11日下 ...

  9. 基于OpenStack Ironic与DPU的网易数帆裸金属方案实践

    背景 目前,所有号称性能损耗小的VM技术,实际上都会有5-15%甚至更高的损耗.作为替代方案,如Gartner在2015年发布的报告"Market Trends: The Rise of B ...

最新文章

  1. 某程序员毕业进UC,被阿里收购!跳去优酷土豆,又被阿里收购!再跳去饿了么,还被阿里收购!难道阿里想收购的是他?...
  2. 手把手教你创建自己的Altium Designer集成元件库
  3. 荧光皮肤有哪些_价格适中又显白的口红有哪些?MAC占大头,KIKO卡拉泡泡超平价...
  4. ABAP:从例子学习ABAP
  5. 【C语言】文件程序设计实践
  6. jvm初体验:堆溢出处理
  7. canvas全局合成画月牙_教你用Python将自己喜欢的图片转成字符画,居然还有动态的 - 松鼠爱吃饼干...
  8. linux vsftp配置用户目录,RedHat 5下VSFTP的配置与公共目录的设置
  9. python遗传算法
  10. Navicat注册机报错No all pattern found! file already patched
  11. java源码中的生词摘录成有道词典单词本
  12. Faster RCNN详解
  13. 【界面设计】针对应力强度模型使用Monte-Carlo进行可靠性仿真
  14. 100个开源C/C++项目中的bugs(一)数组和字符串处理的错误
  15. 光阴似锦,关于身体保养的那些事
  16. 滑环在机电行业的应用
  17. AD域批量的导入账号
  18. 版图匹配之差分电流镜
  19. 国内下载android源码,Android国内源码下载——亲测成功-Go语言中文社区
  20. 医学检验技术与计算机的发展,医学检验专业发展现状与前景

热门文章

  1. linux(redhat)之火狐浏览器的升级(平滑升级)与更新flash 插件
  2. 《骑战三国》框架分析
  3. 会话技术(Session、Cookie)详细介绍
  4. 畅享10plus可以升级鸿蒙系统吗,华为哪些手机可以升级鸿蒙系统
  5. 爬虫接单考试入群【python技术学习内部】
  6. C语言练习实例——排序
  7. Win10桌面图标出现蓝色边框怎么去掉?
  8. python排序算法
  9. css3 3d翻转效果
  10. 苹果手机数据线充不了电_严选|同时充4台手机的充电宝!容量大充电快、自带数据线,还能显示电量|数据线|电池|手机|安卓|硅胶...