云计算的出现,造成计算任务从本地迁移到了云端,客户端通过网络发起请求,在云计算提供商的数据中心的服务器集群上进行计算,其结果经由网络返回,在客户端进行呈现。新的计算模型的提出,必然伴随着新的问题需要解决,这其中就包括I/O瓶颈的问题。

部署闪存明显是解决数据中心存储瓶颈的一个重要手段,特别是PCIe SSD,对数据中心性能的提升是立竿见影的。本文以KVM架构为例,对闪存在虚拟化环境中的优化和实践做个介绍。

KVM(Kernel-basedVirtual Machine,基于Linux内核的虚拟机)是开源的Linux全虚拟化解决方案,目前支持X86架构下的Intel VT及AMD-V硬件虚拟化技术。使用KVM,一台主机能运行使用不经修改的Linux或Windows镜像的多个虚拟机,每一个虚拟机使用其自己的虚拟硬件(网卡、磁盘、图形适配器等)。比较典型的KVM架构如图1所示:

kvm nfs性能 kvm ssd_kvm nfs性能

图1:KVM虚拟化架构

KVM传统的方式是使用QEMU来模拟I/O设备,其优点是可以通过软件模拟出各种各样的硬件设备,包括一些不常用的或者很老的经典设备。而且对硬件平台依赖性低,不需要宿主机和客户机额外的支持,兼容性好。这种方式的缺点是每次I/O操作的路径比较长,需要多次上下文切换多次数据复制,因此性能较差。

相比QEMU,Virtio路径更短而且更加灵活,进而成为当下最佳的KVM方案。virtio是一个在Hypervisor之上的抽象API接口,让客户机能够感知到自己所处的虚拟化环境,进而根据Virtio标准与Hypervisor协作,使客户机I/O设备达到更好的性能。典型的Virtio框架如图2所示:

kvm nfs性能 kvm ssd_kvm nfs性能_02

图2:Virtio框架

通过Virtio可以获得很好的性能,几乎可以达到与原生系统差不多的I/O性能。

Virtio设备中,由于virtio设备以img文件存放在宿主机,同时因为闪存和磁盘I/O访问方式不同,Linux下常用的I/O调度算法对闪存来说并不是最优化的。针对virtio设备,提供了几条相关参数优化方法,对虚拟机I/O性能有所提升。

1、 QEMU/KVM存储池所在设备驱动I/O调度算法需要修改为noop,以本文档/dev/memdiska设备为例:

kvm nfs性能 kvm ssd_闪存_03

2、  对闪存卡的I/O访问进行cpu绑定,绑定方法如下:

a)/etc/init.d/irqbalancestop,首先停止irqbalance

b)cat/proc/cpuinfo  | grep 'physical id' ,找出每个逻辑cpu的物理ID

c)cat/proc/cpuinfo  | grep 'core id' ,  找出每个逻辑cpu的coreID

本文档涉及测试服务器经查看为2路服务器,共有processor40个(0~39):其中processor0,1,20,21的core id为 1,processor0,20 的physical id为0,processor1,21的physical id为1;其他processor依次类推

d)cat  /proc/interrupts  | grep mem,查看中断使用情况;

以本次使用测试为例:经查看中断号为114~177

e)将中断前一半绑定processor0,后一半绑定processor2,即绑定同一个physicalid的不同processor。在本次测试中前一半绑定processor0,后一半绑定processor2

echo  "1" > /proc/irq/114/smp_affinity

……

echo  "1" > /proc/irq/145/smp_affinity

echo  "4" > /proc/irq/146/smp_affinity

……

echo  "4" > /proc/irq/177/smp_affinity

f)将pb相关的进程绑定与中断绑定的processor同physical id的其他processor

ps -aux| grep pb

taskset  –pc 4 ****(为进程号),在本次测试中绑定processor4

g)将qemu-kvm及其virtio命令运行于与上述绑定的cpu同physical id但是不同core id的其他processor上

3、  虚拟I/O设备的img文件为raw格式,qcow2格式的性能不如raw,并且在添加I/O设备时选择“StorageFormat”为raw。

 

应用了Memblaze Pblaze3在KVM下的解决方,最终一块2TB的Pblaze3闪存加速卡性能表现如下:

 


测试性能对比 

12vm性 能总和

带 宽

IOPS

Read4k_rand

2.19GB/s

561873

Write4k_rand

271MKB/s

67875

Read64k_seq

2.16GKB/s

33704

Write64_seq

1.04GB/s

16342


 

可以看到一块Pblaze3可以在单一节点上支撑12台虚机达到接近44万的4k随机读,6.8万的4k随机写性能。连续读写带宽也达到了读2.16GB/s,写1.04GB/s的性能。

本文作者:王玮,Memblaze工程师,KVM技术专家。对闪存在虚拟化场景中的优化有深刻理解。

附录:

最新的测试结果截图

kvm nfs性能 kvm ssd_虚拟化_04


kvm nfs性能 kvm ssd_闪存_05

kvm nfs性能 kvm ssd_硬件_06

kvm nfs性能 kvm ssd_kvm nfs性能_07


kvm nfs性能 kvm ssd_硬件_08