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命令,还包括管理平面的un