APP下载

减少上下文切换的虚拟密码设备中断路径优化方法

2018-08-27郭松辉

计算机应用 2018年7期
关键词:内核中断加密

李 帅,孙 磊,郭松辉

(信息工程大学,郑州 450001)(*通信作者电子邮箱2650536170@qq.com)

0 引言

近年来,随着云计算的不断发展,其重要性越来越受到科学界和工业界的关注,同时其安全性也面临着重大的挑战[1],尤其是虚拟资源可迁移性引发的云中数据不可控问题[2],导致云中存在数据泄露的安全风险[3]。2016年云安全联盟(Cloud Security Alliance, CSA)公布的十二大安全威胁中就包括数据泄露和用户身份凭证被盗等重大安全风险。目前,各云服务提供商对于云计算面临的安全风险也提出了各种解决方案。例如:阿里云安全解决方案在数据层提供了加密服务,该服务可记录、分析和汇报用户访问数据库的行为,并对生成的数据进行加密,提高了数据安全。从云数据中心到云用户,每一层都应该对其安全性采取有效措施来降低安全风险,提高数据的安全性[4]。密码云[2]技术将对称加密、数字签名和完整性校验等密码技术运用到云计算中来提供密码运算,大幅度地提高了云环境下数据的安全性。密码云采用虚拟化技术将密码设备虚拟成多个虚拟密码设备提供给上层虚拟密码机(Virtual Cipher Machine, VCM)[2]使用,满足了云环境下的密码运算需求。

为了使虚拟密码机的密码运算性能更高,密码设备采用了单根I/O虚拟化(Single-Root I/O Virtualization, SR-IOV)技术为虚拟密码机提供高效密码服务。SR-IOV技术采用Passthrough I/O传输方式,不需要虚拟机监控器(Virtual Machine Monitor, VMM)对虚拟机进行监控,通过硬件直接与虚拟机进行I/O传输[5],并且在传输过程中,通过输入/输出内存管理单元(Input/Output Memory Management Unit, IOMMU)减少了存储保护和地址转换的开销,大幅度提高了传输效率[6],实现了虚拟密码机的高效密码服务;但是,在实验过程中发现,虚拟密码机加密速度明显低于主机加密速度,而且随着加密字节块的增大,虚拟密码机加密速度和主机加密速度的差距逐渐增大,这说明,当外部中断请求过多时会严重影响虚拟密码机加密性能。而造成虚拟密码机加密性能降低的根本原因是虚拟密码机中断请求需要陷入到主机内核中进行处理,该过程会导致至少两次non-root到root模式切换即VM-exit。当云环境下大量的外部中断请求需要调用密码算法时就会导致VCM和VMM之间频繁的上下文切换[7],严重影响了中断传输的效率,继而影响虚拟密码机加密性能。

为了解决中断传输路径中上下文切换导致系统开销大的问题,文献[8]提出了一种直接中断传输的方法,清除了虚拟机控制结构(Virtual Machine Control Structure, VMCS)中的外部中断退出位,那么外部中断将不会触发VM-exit;但是该方法需要判断虚拟机是否正在运行以及运行时在哪个物理CPU核上运行,增加了复杂度。文献[9]提出了一种更少中断退出的方法(Exit-Less Interrupt, ELI),采用软件模拟的方式在客户虚拟机内建立影子中断描述符表(Interrupt Description Table, IDT)直接处理中断;但是在ELI机制中,影子IDT只能接收来自对应用户对应的中断,其他中断仍需要主机的参与。文献[10]提出了一种针对I/O虚拟化的高效和相应事件系统(Efficient and reSponsive Event System for I/O virtualization, ES2),该系统改善了虚拟机和硬件设备之间的双向I/O传输。该机制可以提供高效I/O请求交付和增强I/O响应能力,并且不需要修改虚拟机操作系统,但是该机制并没有在SR-IOV环境中实现。本文对SR-IOV环境下虚拟密码机的中断机制进行了优化,提出了一种减少上下文切换(Reducing Context Switching, RCS)的中断传输机制。该机制保留了第一次VM-exit,当外部中断陷入到主机内核区时,由主机判断外部中断是否发送给虚拟密码机,然后在虚拟密码机内核建立了一个由主机到虚拟密码机的关系映射表,通过对注入到虚拟密码机中未被分配的中断进行注册,注册完成后直接在虚拟密码机内核对该中断进行处理,避免了中断再次陷入主机内核,优化了虚拟密码机的中断传输路径,提高了虚拟密码机中断传输的效率。

1 相关技术

1.1 SR-IOV技术

SR-IOV是PCI-SIG组织发布的PCIe规范的扩展,它采用Passthrough I/O技术在数据传输过程中绕过VMM,使用IOMMU在虚拟内存中直接寻址,即直接将虚拟地址转换为物理地址[5],可让实体设备在虚拟内存环境中工作,扩展了系统内存容量,提升了性能。每一个PCIe设备可以配置1到8个物理功能(Physical Function, PF),各个PF之间是相互独立的。每个PF都具有标准的PCIe功能,可以对其进行完全的配置管理。可以通过PF配置或者控制PCIe设备,也可以通过PF对数据的输入和输出进行管理。同时,在PCIe设备中,具有SR-IOV功能的设备可创建多个虚拟功能(Virtual Function, VF)。相比PF,VF仅具有轻量级的PCIe功能,只能进行数据的传输;但是每个VF对应唯一的资源标识符(Resource IDentifier, RID),每个RID可用于索引IOMMU页表,因此,每个VF可以独立接收和传输数据包。而且每个VF都拥有与性能相关的资源,比如传输和接收描述符,同时共享其他主要设备资源[11]。在SR-IOV中,每个PF关联多个VF,由PF对多个VF进行配置管理。在配置SR-IOV实验环境时,可以对每一个VCM分配一个或者多个VF,由于每个VF都对应唯一的RID,所以VCM之间是相互隔离的,这有效提高了I/O传输的性能。

基于SR-IOV技术,将每个VCM对应于一个VF,VCM和VF之间通过VFIO驱动进行通信,并且不受VMM的干预[12]。其基于SR-IOV的密码设备基本架构如图1所示。

图1 基于SR-IOV的密码设备基本架构

1.2 x86虚拟环境下的中断处理机制

x86服务器多采用消息信号中断(Message Signaled Interrupt, MSI)和它的扩展形式MSI-X发送中断信号。服务器一旦启动,本地高级可编程中断控制器(Local Advanced Programmable Interrupt Controller, LAPIC)就会对每一个I/O设备分配MSI地址,其中描述中断的MSI地址确定了中断的目的CPU核地址。同时,MSI数据存放了中断向量号和中断传输模式,通过执行内存写操作触发消息信号中断[8]。目前绝大部分PCIe设备也使用MSI/MSI-X机制发送中断请求。在PCIe设备中,触发MSI中断的每一个内存写操作都直接穿过PCIe层级进入root模式进行处理。每个CPU核上都配置一个LAPIC,同时在每个I/O子系统上也存在一个输入输出高级可编程中断控制器(Input/Output Advanced Programmable Interrupt Controller, IOAPIC)。IOAPIC支持I/O重定向表,IOMMU支持中断重映射表,两者同时为每个PCIe设备中断提供中断目的地址、触发模式和传输路径。

当一个I/O设备发出一个中断消息,该中断消息将对一个特殊地址执行内存写操作来中断CPU,这会导致一个物理中断被发送到CPU。服务器当前执行的代码被中断,执行将跳转到一个预定义的处理程序,该处理程序由中断描述符表指定。x86架构CPU最多可定义256个中断向量,每个表项都对应于一个中断处理函数的地址,当触发相应的中断时,对应函数将被调用。通常,I/O设备发出一个请求,该请求通过对一个特殊地址执行内存写操作来中断CPU,这会导致一个物理中断被发送到CPU。当一个MSI中断传输到目的CPU,在IDT中将触发相应的中断处理器(Interrupt Handler)处理中断。

然而,在虚拟环境下,外部中断的处理依然需要VMM的参与。从外部中断触发VM-exit到整个中断处理完成至少需要两次VM-exit,每次VM-exit都会对应于一次VM-entry,这样在每次的中断处理过程中便会引起至少4次上下文切换。当同一时间存在大量的外部中断请求时,系统就会因为频繁的上下文切换产生大量的上下文开销和cache污染[13],使得在中断密集的时候,虚拟密码机的加密性能严重降低。虚拟环境下I/O中断处理过程如图2所示。

当虚拟机收到外部中断时,IOMMU首先作出响应并执行相应的中断重映射,由于x86架构本身VT-x技术的限制,VMM将截获中断引起VM-exit事件,该事件通过主机中断描述符初始化相应的中断处理程序进行传送。当中断在主机中断处理程序中处理完成,会生成一个结束中断信号(End Of Interrupt, EOI),VMM识别到EOI信号后就把主机向量映射到相应的虚拟机向量。然后,在目标处理器的虚拟本地高级可编程中断控制器(virtual Local Advanced Programmable Interrupt Controller, vLAPIC)上更新虚拟中断请求注册(virtual Interrupt Request Register, vIRR)和虚拟中断服务注册(virtual Interrupt Service Register, vISR),并且在虚拟机的虚拟机控制结构中建立VM-entry中断信息域。通过一个VM-entry注入把虚拟中断传输给虚拟机。虚拟机内核接收到中断信号后,更新LAPIC,并在虚拟机IDT中运行相应的中断处理程序。中断请求在虚拟机内核处理完成后,也会生成一个EOI信号,该信号使中断再次陷入VMM,重新更新vLAPIC后将生成一个虚拟EOI信号,执行VM-entry,恢复虚拟机的正常运行[7]。在虚拟环境下的中断处理过程中,每次I/O中断处理过程都会导致至少两次VM-exit,如果大量的外部中断请求到来时,过多的上下文切换必将严重影响整个系统的性能。

图2 虚拟环境下的中断处理

2 RCS中断传输机制的设计与实现

2.1 RCS中断传输机制设计

在SR-IOV环境中,VMM和虚拟机操作系统共享硬件资源,因此底层硬件需要一个物理内存区域来自动保存或恢复彼此执行的上下文,这个区域称为虚拟机控制结构区。该区域包括虚拟机状态区、主机状态区和执行控制区。当发生VM-exit时,硬件自动将虚拟机操作系统的上下文保存在虚拟机状态区,并且从主机状态区中加载VMM的通用事件处理函数地址,之后VMM执行相应的操作。由图2可知,虚拟环境下的中断处理过程导致了至少两次VM-exit,每次VM-exit都会有VMM的参与,这严重影响了中断传输的效率。在SR-IOV环境中,虽然VF直连虚拟密码机,但是由于VMM具有对处理器和平台硬件完全的控制权,在对处理器资源、物理内存、中断处理和I/O的处理中同时也具有选择控制的权利,也就是说,如果外部中断的控制权在虚拟密码机手中,那么虚拟密码机向量就可以对应于物理设备中断服务注册在虚拟密码机描述符的位置,即物理设备ISR完全由虚拟密码机执行;如果外部中断的控制权掌握在VMM手中,那么当发生外部中断时,将触发VM-exit,VMM执行其控制权,所以密码设备的VF产生的某些中断依然需要VMM处理。其处理方式是VMM触发相应的虚拟中断并将该中断注入虚拟密码机,因此,有必要对密码设备的中断机制进行优化以此来进一步提高密码设备的性能。

假设系统中的每一台虚拟密码机仅对应一个VF,在这种情况下,VF只能中断它所对应的虚拟密码机。为了减少在每次中断过程中由于VMM的介入导致的上下文切换次数,本文提出了一种减少上下文切换的中断传输机制——RCS中断传输机制。RCS中断传输机制过程如图3所示。

该中断传输机制基于KVM实现。由于虚拟密码机中断请求的处理需要进入到KVM内核进行实现,因此该机制保留了第一次VM-exit。这样做的好处是:当发送给虚拟密码机的外部中断请求到来时,直接将该中断交给KVM内核进行处理,从而避免不能识别的中断类型以及大量中断到来时可能会造成的错误传输。当该中断在KVM内核注册完成并找到对应的中断类型后会触发虚拟机所对应的vCPU,由vCPU执行VM-entry,之后中断开始进入虚拟机执行。为了避免EOI写操作导致的再次VM-exit,该机制在虚拟机内核建立了由主机到虚拟密码机内核的关系映射表。关系映射表有两个功能:第一是判断该中断类型是否已在虚拟密码机IDT中存在,如果存在则直接交由虚拟密码机的中断处理器进行处理;第二是如果该中断类型在虚拟密码机IDT中不存在,那么该映射将对该中断进行注册,重新分配中断类型号,然后交由虚拟密码机中断处理器进行处理。在虚拟密码机内核直接处理中断比中断再次陷入主机内核进行处理效率更高,可明显减少大量中断请求带来的频繁上下文切换。

图3 RCS中断传输机制

2.2 RCS中断传输机制实现

RCS中断传输机制是在KVM环境下提出的。KVM本身是集成到Linux内核的虚拟机监控器,是一种全虚拟化解决方案。在Linux内核中,KVM是其中一个很小的模块,可利用Linux实现硬件设备交互、任务调度和内存管理等功能。其中,QEMU作为一个独立的虚拟化解决方案,可以模拟一个完全不同的系统环境,但是QEMU模拟本身性能比较低,一般结合KVM提供的功能来提升性能[14]。系统架构如图4所示。

在KVM环境下,当密码设备接收到外部中断信号时,首先加载相应的驱动程序,然后向主机CPU发送中断请求信号,主机CPU接收到中断信号后,判断中断请求类型是发给主机还是虚拟密码机,如果是发给主机,则直接交给主机的中断处理器进行处理;如果是发送给虚拟密码机,中断将陷入KVM内核,由KVM内核进行处理。在中断注入KVM过程中,会加载驱动程序中ioctl函数,其功能是专门对设备的I/O通道进行管理,也可对设备的一些特性进行控制,并且具有传输中断的作用。

图4 系统架构

在KVM内核区,首先提取中断路由表中对应的实体,触发对应路由实体的触发函数;然后进行中断的注册、中断类型的检查、中断请求的发送和处理。当中断在主机KVM内核执行结束后,进入虚拟密码机内核执行。中断进入虚拟密码机内核后先触发关系映射表,通过关系映射表中的IOAPIC来判断中断类型,如果该中断类型在虚拟密码机IDT中已存在,则退出中断映射表,直接在虚拟密码机内核中由虚拟密码机中断处理器处理中断;如果该中断类型在虚拟密码机IDT中不存在,则在关系映射表中进行中断注册,注册完成后退出关系映射表,然后更新LAPIC,再交由虚拟密码机中断处理器处理中断。关系映射表的中断处理过程伪代码如下:

Process interruption handling of relational mapping table

1) procedure relational mapping

2)notification: //Label 1

3) waked up by an interrupt request

4)handling:

5) judge the interrupt type

6) if the interrupt type is not exist then //Label 2

7) register by relational mapping

8) handle the interrupt

9) else handle the interrupt directly

10) end if

11) ifnotify_enabledthen

12) execute thehandling

13) end if

14)workload← 0

15) While this queue is not empty do

16) polling one interrupt request from this queue

17)workload←workload+1

18) ifworkload>=quotathen

19) gotohandling//Wait for next turn

20) end if

21) end while

22)enable_notify//Return to notification mode

23) gotonotification

24) end procedure

在中断注册过程中,会调用与IOAPIC相关的一些函数,其主要的功能除了进行中断的注册和中断类型的检查外,IOAPIC还将通过APIC总线将中断信息分配给每颗CPU的LAPIC,然后由LAPIC决定是否接收总线上传送来的中断信息。在中断信息发送到LAPIC之前,需要通过IOAPIC设置中断请求的目的地址、中断请求向量和中断传输模式等请求信息,然后将中断请求发送给LAPIC。LAPIC根据传入的irq参数获取目标LAPIC编号目的地址,再根据目的地址找到其对应的vCPU,然后设置目标LAPIC的中断请求寄存器,根据其传送模式向当地的LAPIC添加一个即将到来的中断,最后vCPU检查这个中断请求并将中断注入虚拟密码机内核,即执行VM-entry。

中断在虚拟密码机内核处理完成后,恢复虚拟密码机执行当前的操作。该过程避免了由EOI写操作带来的VM-exit,减少了上下文切换,在中断密集时可有效降低性能开销。

3 实验结果与分析

为了验证RCS机制提高了虚拟密码机密码运算能力,本章针对对称密码算法AES和杂凑算法SHA256分别在主机、SR-IOV方式和RCS方式下的加密速度进行了测试,并对不同机制下的加密速度进行了对比分析,通过加密速度提升来体现RCS机制性能优势。实验并没有测试非对称密码算法的加密速度,因为对于非对称密码算法来说,其加密运算不是传输密集型的操作,只能作为计算密集型的操作,I/O中断传输路径的优化对其体现并不明显。而对于对称密码算法和杂凑算法,其加密运算是传输密集型的操作,因此实验研究对对称密码算法和杂凑算法在中断路径上的优化具有实际意义。

本实验环境为:主机和虚拟密码机操作系统均为CentOS7.1,内核版本为Linux 3.10.0,处理器Intel Xeon CPU E5- 2620 v3 @2.40 GHz 12核,内存128 GB,支持VT-x技术,支持SR-IOV,密码设备为Intel Corporation DH895XCC Series QAT。测试工具为crytodev,crytodev是调用密码设备的一个benchmark工具,可以测试密码设备中密码算法的运算速度,其中包含AES、SHA256等加密算法。测试过程是:通过对不同字节块大小进行加密,选取5 s内的总加密字节数,求其平均值作为该加密字节块大小下的加密速度。

首先,为了验证当存在大量中断请求时,VCM的性能会显著降低,对VCM进行空转测试,仅测试其中断传输效率。由VCM向主机发出中断请求,测试不同加密字节下主机和虚拟密码机的加密速度。其测试结果如图5所示。从图5实验结果中可以看到:随着加密字节块的增大,主机加密速度和虚拟密码机加密速度差距越来越大。由于只是空转测试,不存在加密运算的影响,因此造成该差距的主要因素即中断传输过程中导致的频繁上下文切换,恰恰验证了本文要解决的问题。

图5 加密空字节时的加密速度

然后,为了比较RCS机制相对于SR-IOV方式在加密性能上有一定的提升,本文分别对两种加密算法在SR-IOV方式下和在RCS方式下的加密速度进行了对比分析。实验测试结果如图6(a)和图6(b)所示。

对图6(a)中数据进行分析,结果表明:采用AES算法加密时,RCS方式下虚拟密码机加密速度比SR-IOV方式下虚拟密码机加密速度平均提高了16.35%;对图6(b)中数据进行分析,结果表明:采用SHA256算法加密时,RCS方式下虚拟密码机加密速度比SR-IOV方式下虚拟密码机加密速度平均提高了12.25%。而且,从实验结果中可以看出,加密字节块越大,加密速度提高越明显。

图6 虚拟密码机使用SR-IOV和RCS加密时的加密速度

为了进一步验证RCS机制下虚拟密码机密码运算能力能达到接近主机的密码运算性能,实验分别测试了主机和RCS方式下虚拟密码机在AES和SHA256加密算法下的加密速度,其测试结果如图7(a)和图7(b)所示。

图7 主机和虚拟密码机RCS加密时的加密速度

分析图7(a)和图7(b)的实验测试结果,可得出结论:在RCS机制下,虚拟密码机使用AES加密算法加密的速度达到了主机的88.37%~98.48%,用SHA256加密算法加密的速度达到了主机的90.44%~95.63%。而且,加密字节块越大,该机制下的加密速度越接近于主机加密速度,该结果对于云环境下高效密码服务的要求具有良好的现实意义。

同时,从图6(a)和图7(a)中也可以看出:加密字节在32 768之前,主机加密速度和虚拟密码机加密速度一直在增大,当加密字节为32 768时,主机加密速度和虚拟密码机加密速度达到最大。当加密字节再继续增大时主机加密速度和虚拟密码机加密速度开始减小,说明此时由于中断频率的增加只能导致性能的下降,这正是由于大量中断导致的VM-exit使中断处理过程多次陷入KVM内核导致的频繁上下文切换引起的性能降低[15]。同时,在32 768 B之前,主机加密速度和虚拟密码机加密速度并不是线性增长,而是随着字节块的增大,其增长速度变化越来越平缓,这也验证了大量中断导致的虚拟密码机性能降低问题。

4 结语

针对虚拟化环境下密码设备中断传输开销过大影响密码运算性能的问题,在SR-IOV技术的基础上,本文提出了一种减少上下文切换的虚拟密码设备中断路径优化方法,实现了虚拟密码机直接处理中断的功能,降低了虚拟中断处理过程中上下文切换次数,有效解决了由于主机和虚拟密码机之间频繁上下文切换导致的系统过高开销,提高了虚拟密码机加密性能。下一步将在现有硬件平台的基础上,研究加密字节块、加密速度和中断频率之间的关系,进一步优化虚拟密码机加密性能。

猜你喜欢

内核中断加密
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
保护数据按需创建多种加密磁盘
电力安全防护加密装置
“单片机中断概述”微课教学设计
一种考虑GPS信号中断的导航滤波算法
微软发布新Edge浏览器预览版下载换装Chrome内核
Linux中断线程化分析及中断延时测试
跟踪导练(二)(5)