突破存储性能瓶颈:Ubicloud中的iSCSI与NVMe over Fabrics实现解析
在云计算环境中,存储性能往往是制约业务响应速度的关键瓶颈。随着数据量爆炸式增长和应用对低延迟的极致追求,传统存储架构已难以满足需求。Ubicloud作为开源云平台,通过创新的存储虚拟化技术,特别是基于SPDK(Storage Performance Development Kit)的块存储实现,为用户提供了接近物理设备性能的存储体验。本文将深入解析Ubicloud如何通过iSCSI与NVMe over Fabrics技术突破存储性能瓶颈,以及其在代码层面的实现细节。
存储性能挑战与Ubicloud的解决方案
传统云存储面临三大核心挑战:协议开销、硬件利用率不足和扩展性限制。iSCSI作为成熟的存储网络协议,虽然兼容性好,但TCP/IP协议栈的固有开销限制了其性能。NVMe over Fabrics(NVMe-oF)则通过RDMA技术大幅降低延迟,但部署复杂度较高。Ubicloud创新性地结合了两者的优势,基于SPDK构建高性能存储后端,同时提供灵活的协议支持。
在Ubicloud的存储架构中,主要通过以下组件实现高性能存储服务:
- SPDK Installation:提供用户态存储驱动,绕过传统内核I/O栈,降低延迟。
- Vhost Block Backend:实现vhost-user协议,支持虚拟机直接访问存储设备。
- VM Storage Volume:管理虚拟机存储卷,支持加密、快照等高级功能。
- Storage Device:抽象物理存储设备,提供统一的管理接口。
存储架构核心组件关系
SPDK与用户态存储驱动
SPDK(Storage Performance Development Kit)是Ubicloud高性能存储的核心。它通过用户态驱动直接访问NVMe设备,避免了内核态与用户态之间的数据拷贝,显著提升I/O性能。在Ubicloud中,SpdkInstallation模型负责管理SPDK的安装与版本控制。
SPDK版本管理与特性支持
SpdkInstallation类通过版本字符串判断是否支持bdev_ubi功能,这是Ubicloud定制的块设备驱动,提供增强的性能和可靠性。
# [model/spdk_installation.rb](https://link.gitcode.com/i/8dc77feb719b78d41aae1f5b87cd834b)
def supports_bdev_ubi?
# We version stock SPDK releases similar to v23.09, and add a ubi version
# suffix if we package bdev_ubi along with it, similar to v23.09-ubi-0.1.
version.match?(/^v[0-9]+\.[0-9]+-ubi-.*/)
end
SPDK安装实例与虚拟机主机(VM Host)关联,每个主机可以有多个SPDK安装,支持不同版本的并存,便于平滑升级和功能测试。
存储设备识别与管理
StorageDevice类负责识别和管理物理存储设备,特别针对SSD和NVMe设备提供了优化的识别逻辑。通过/dev/disk/by-id路径,Ubicloud能够可靠地识别设备,避免因设备命名变化导致的问题。
# [model/storage_device.rb](https://link.gitcode.com/i/5439d8d476d7bf9cce3085220d43a2c5)
def self.convert_device_name_to_device_id(sshable, device_name)
if device_name.start_with?("sd")
sshable.cmd("ls -l /dev/disk/by-id/ | grep '#{device_name}$' | grep 'wwn-' | sed -E 's/.*(wwn[^ ]*).*/\\1/'").strip
elsif device_name.start_with?("nvme")
sshable.cmd("ls -l /dev/disk/by-id/ | grep '#{device_name}$' | grep 'nvme-eui' | sed -E 's/.*(nvme-eui[^ ]*).*/\\1/'").strip
else
device_name
end
end
这段代码展示了Ubicloud如何通过WWN(World Wide Name)和NVMe EUI标识符唯一识别存储设备,确保在系统重启或设备重命名后仍能正确关联。
高性能存储卷实现
VM Storage Volume是连接虚拟机与物理存储的关键组件,在model/vm_storage_volume.rb中定义。它支持多种存储后端,包括SPDK和Vhost Block Backend,并提供QoS控制、加密等功能。
存储卷性能优化
Ubicloud通过以下机制优化存储卷性能:
- 多队列支持:根据后端类型自动调整队列数量。
- I/O优先级:支持设置读写带宽限制。
- 加密加速:集成硬件加密加速功能。
# [model/vm_storage_volume.rb](https://link.gitcode.com/i/853ed6a6f70e527edeab8c95d51cf480)
def num_queues
@num_queues ||= if vhost_block_backend
vring_workers
else
# SPDK volumes
1
end
end
def queue_size
@queue_size ||= if vhost_block_backend
64
else
# SPDK volumes
256
end
end
这段代码展示了如何根据存储后端类型动态调整队列参数,SPDK后端使用更大的队列深度以提高吞吐量,而Vhost后端则优化队列数量以降低延迟。
存储协议选择策略
Ubicloud根据虚拟机位置和存储类型自动选择最优协议:
- AWS环境:使用NVMe设备路径(
/dev/nvmeXn1)。 - 本地环境:使用virtio-blk设备(
/dev/disk/by-id/virtio-*)。
# [model/vm_storage_volume.rb](https://link.gitcode.com/i/853ed6a6f70e527edeab8c95d51cf480)
def device_path
vm.location.aws? ? "/dev/nvme#{disk_index}n1" : "/dev/disk/by-id/virtio-#{device_id}"
end
这种自适应策略确保在不同环境中都能获得最佳性能,同时保持接口一致性。
实践应用与性能调优
存储性能测试
Ubicloud提供了多种工具评估存储性能。通过CLI命令可以创建不同配置的存储卷并进行基准测试:
# 创建使用SPDK的存储卷
ubi volume create --size 100 --spdk --name test-volume
# 创建使用vhost的存储卷
ubi volume create --size 200 --vhost --vring-workers 4 --name high-iops-volume
性能调优建议
- 队列配置:对于随机I/O密集型应用,增加队列数量(vring_workers)。
- 块大小:根据应用特性调整块大小,大文件传输适合较大块大小。
- 存储后端选择:低延迟需求优先使用SPDK,兼容性优先选择Vhost。
未来展望
Ubicloud存储团队正在开发以下增强功能:
- NVMe-oF原生支持:直接支持RDMA传输,进一步降低延迟。
- 存储分层:基于应用访问模式自动调整存储层级。
- 分布式缓存:跨节点存储缓存,提高热点数据访问速度。
这些功能将进一步提升Ubicloud在高性能计算、AI训练等场景的竞争力,为用户提供更灵活、更高性能的存储服务。
通过深入理解Ubicloud的存储架构和实现细节,用户可以更好地规划存储资源,优化应用性能,充分利用现代存储硬件的潜力。无论是构建低延迟数据库集群还是高吞吐量文件服务,Ubicloud的高性能存储后端都能提供坚实的基础。
更多技术细节请参考:
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



