CN107807843B - 虚拟机中的i/o请求处理方法、设备及计算机可读介质 - Google Patents

虚拟机中的i/o请求处理方法、设备及计算机可读介质 Download PDF

Info

Publication number
CN107807843B
CN107807843B CN201711018956.4A CN201711018956A CN107807843B CN 107807843 B CN107807843 B CN 107807843B CN 201711018956 A CN201711018956 A CN 201711018956A CN 107807843 B CN107807843 B CN 107807843B
Authority
CN
China
Prior art keywords
chain
request
memory
initial position
equipment
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201711018956.4A
Other languages
English (en)
Other versions
CN107807843A (zh
Inventor
赵锐
倪勋
谢永吉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Beijing Baidu Netcom Science and Technology Co Ltd
Original Assignee
Beijing Baidu Netcom Science and Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Beijing Baidu Netcom Science and Technology Co Ltd filed Critical Beijing Baidu Netcom Science and Technology Co Ltd
Priority to CN201711018956.4A priority Critical patent/CN107807843B/zh
Publication of CN107807843A publication Critical patent/CN107807843A/zh
Priority to US16/167,197 priority patent/US10997099B2/en
Application granted granted Critical
Publication of CN107807843B publication Critical patent/CN107807843B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/14Handling requests for interconnection or transfer
    • G06F13/20Handling requests for interconnection or transfer for access to input/output bus
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/4555Para-virtualisation, i.e. guest operating system has to be modified
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • G06F2009/45579I/O management, e.g. providing access to device drivers or storage
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • G06F2009/45583Memory management, e.g. access or allocation

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)
  • Storage Device Security (AREA)

Abstract

本发明提供一种虚拟机中的I/O请求处理方法、设备及计算机可读介质。其方法包括:Guest kernel的后端设备在开始处理Guest kernel的前端设备提交至共享的I/O处理内存中的I/O请求链时,从I/O处理内存中获取I/O请求链的起始位置;根据I/O请求链的起始位置,将I/O状态数组中与I/O请求链的起始位置对应的元素置位为与所有位置的初始值不同的数值;在处理完该I/O请求链时,将I/O请求状态数组中与该I/O请求链的起始位置对应的元素置位为与初始值相同的数值。本发明的技术方案,可以保证Guest kernel的前端设备和Guest kernel的后端设备的信息的同步,保证Guest kernel的后端设备中断的故障恢复之后,可以继续进行I/O请求的处理,而不会导致I/O处理hung死。

Description

虚拟机中的I/O请求处理方法、设备及计算机可读介质
【技术领域】
本发明涉及计算机应用技术领域,尤其涉及一种虚拟机中的I/O请求处理方法、设备及计算机可读介质。
【背景技术】
Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,而Virtio在半虚拟化Hypervisor中位于设备之上的抽象层,也可以称之为半虚拟化抽象层。
其中Virtio为Guest内核(kernel)的前端和后端提供了通信的通用接口。Guestkernel的前端和Guest kernel的后端具体可以通过Virtio中的Virtio-ring(简称Vring)结构体进行数据传递。具体地,首先Guest kernel的前端将数据写入至Virtio的Virtio-ring(简称Vring)结构体中,然后再由Hypervisor作为Guest kernel的后端根据数据对设备进行读写,读写完成之后再通知Guest kernel的前端。随着技术的发展,Hypervisor逐步推出了Vhost技术,该Vhost技术可以让Guest kernel的后端直接通过Virtio-ring与Guestkernel的前端进行交互,减少了数据在用户态到内核态的重复拷贝。该Vhost技术可以让Guest kernel的后端位于用户态,因此也可以称之为Vhost-user(虚拟机后端用户态)技术。由于该Vhost技术,可以让Guest kernel的后端程序位于用户态,在减小宕机概率的同时,也增加了后端程序开发的灵活性。目前广泛应用的Guest kernel的后端程序有dpdk、spdk等等,这些程序可以将网络和输入/输出(Input/Output;I/O)的性能提升1至数倍。
但是现有Vhost技术中的Guest kernel的后端和Guest kernel的前端使用Virtio进行通信时,若Guest kernel的后端的用户态程序出现bug或者维护人员的误操作等异常中断,造成了I/O读写时卡死。由于Guest kernel的后端并不记录处理的状态,在卡死并重新交互信息之后Guest kernel的后端和Guest kernel的前端会出现信息不同步,导致无法继续处理后续的I/O请求,从而导致I/O处理hung死。
【发明内容】
本发明提供了一种虚拟机中的I/O请求处理方法、设备及计算机可读介质,用于保证Guest kernel的后端卡死后重启能够继续处理后续的I/O请求,防止I/O处理hung死。
本发明提供一种虚拟机中的I/O请求处理方法,所述方法包括:
Guest内核的后端设备在开始处理Guest内核的前端设备提交至共享的I/O处理内存中的I/O请求链时,从所述I/O处理内存中获取所述I/O请求链的起始位置;
根据所述I/O请求链的起始位置,将I/O状态数组中与所述I/O请求链的起始位置对应的元素置位为与所有位置的初始值不同的数值;
在处理完所述I/O请求链时,将所述I/O请求状态数组中与所述I/O请求链的起始位置对应的元素置位为与所述初始值相同的数值。
进一步可选地,如上所述的方法中,根据所述I/O请求链的起始位置,将I/O状态数组中与所述I/O请求链的起始位置对应的元素置位为与所有位置的初始值不同的数值之前,所述方法还包括:
与中间软件层Hypervisor交互,获取所述中间软件层Hypervisor申请I/O状态数组内存的句柄和所述I/O状态数组的长度;
根据申请所述I/O状态数组内存的句柄和所述I/O状态数组的长度,映射所述I/O状态数组的地址空间,以与所述中间软件层Hypervisor共享所述I/O状态数组的内存。
进一步可选地,如上所述的方法中,根据所述I/O请求链的起始位置,将I/O状态数组中与所述I/O请求链的起始位置对应的元素置位为与其余位置的初始值不同的数值之后,在处理完所述I/O请求链之前,所述方法还包括:
所述Guest内核的后端设备异常中止后,重启并与所述中间软件层Hypervisor重连后,重新映射所述I/O状态数组的地址空间和所述I/O处理内存的地址空间,以与所述中间软件层Hypervisor共享所述I/O状态数组的内存,与所述Guest内核的前端设备共享所述I/O处理内存;
从所述I/O请求状态数组中获取异常中止时处理的所述I/O请求链的起始位置,以根据所述I/O请求链的起始位置,重新处理所述I/O处理内存中的所述I/O请求链。
进一步可选地,如上所述的方法中,从所述I/O请求状态数组中获取异常中止时处理的所述I/O请求链的起始位置,以根据所述I/O请求链的起始位置,重新处理所述I/O处理内存中的所述I/O请求链之后,所述方法还包括:
从所述I/O处理内存中获取第一已完成的I/O请求链的索引标识;
根据所述第一已完成I/O请求链的索引标识,重置本地的已提交的I/O请求链的索引标识和第二已完成的I/O请求链的索引标识。
进一步可选地,如上所述的方法中,所述Guest内核的后端设备在开始处理Guest内核的前端设备提交至共享的I/O处理内存中的I/O请求链之前,所述方法还包括:
与所述中间软件层Hypervisor交互,获取所述中间软件层Hypervisor申请的I/O处理内存的句柄、所述I/O处理内存的长度、所述I/O处理内存中的虚拟请求队列的起始位置;
根据申请所述I/O处理内存的句柄、所述I/O处理内存的长度以及所述I/O处理内存中的虚拟请求队列的起始位置,映射所述I/O处理内存的地址空间,以与所述Guest内核的前端设备共享所述I/O处理内存。
本发明提供一种Guest内核的后端设备,所述设备包括:
位置获取模块,用于在开始处理Guest内核的前端设备提交至共享的I/O处理内存中的I/O请求链时,从所述I/O处理内存中获取所述I/O请求链的起始位置;
置位模块,用于根据所述I/O请求链的起始位置,将I/O状态数组中与所述I/O请求链的起始位置对应的元素置位为与所有位置的初始值不同的数值;
所述置位模块,还用于在处理完所述I/O请求链时,将所述I/O请求状态数组中与所述I/O请求链的起始位置对应的元素置位为与所述初始值相同的数值。
进一步可选地,如上所述的设备中,还包括:
内存信息获取模块,用于与中间软件层Hypervisor交互,获取所述中间软件层Hypervisor申请I/O状态数组内存的句柄和所述I/O状态数组的长度;
映射模块,用于根据申请所述I/O状态数组内存的句柄和所述I/O状态数组的长度,映射所述I/O状态数组的地址空间,以与所述中间软件层Hypervisor共享所述I/O状态数组的内存。
进一步可选地,如上所述的设备中,所述映射模块,还用于在所述Guest内核的后端设备异常中止后,重启并与所述中间软件层Hypervisor重连后,重新映射所述I/O状态数组的地址空间和所述I/O处理内存的地址空间,以与所述中间软件层Hypervisor共享所述I/O状态数组的内存,与所述Guest内核的前端设备共享所述I/O处理内存;
所述位置获取模块,还用于从所述I/O请求状态数组中获取异常中止时处理的所述I/O请求链的起始位置,以根据所述I/O请求链的起始位置,重新处理所述I/O处理内存中的所述I/O请求链。
进一步可选地,如上所述的设备中,还包括:
索引标识获取模块,用于从所述I/O处理内存中获取第一已完成的I/O请求链的索引标识;
重置模块,用于根据所述第一已完成I/O请求链的索引标识,重置本地的已提交的I/O请求链的索引标识和第二已完成的I/O请求链的索引标识。
进一步可选地,如上所述的设备中,所述内存信息获取模块,还用于与所述中间软件层Hypervisor交互,获取所述中间软件层Hypervisor申请的I/O处理内存的句柄、所述I/O处理内存的长度、所述I/O处理内存中的虚拟请求队列的起始位置;
所述映射模块,还用于根据申请所述I/O处理内存的句柄、所述I/O处理内存的长度以及所述I/O处理内存中的虚拟请求队列的起始位置,映射所述I/O处理内存的地址空间,以与所述Guest内核的前端设备共享所述I/O处理内存。
本发明还提供一种计算机设备,所述设备包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如上所述的虚拟机中的I/O请求处理方法。
本发明还提供一种计算机可读介质,其上存储有计算机程序,该程序被处理器执行时实现如上所述的虚拟机中的I/O请求处理方法。
本发明的虚拟机中的I/O请求处理方法、设备及计算机可读介质,通过由Guestkernel的后端设备在开始处理Guest kernel的前端设备提交至共享的I/O处理内存中的I/O请求链时,从I/O处理内存中获取I/O请求链的起始位置;根据I/O请求链的起始位置,将I/O状态数组中与I/O请求链的起始位置对应的元素置位为与所有位置的初始值不同的数值;在处理完该I/O请求链时,将I/O请求状态数组中与该I/O请求链的起始位置对应的元素置位为与初始值相同的数值。通过采用本发明的上述技术方案,可以保证Guest kernel的前端设备和Guest kernel的后端设备的信息的同步,保证Guest kernel的后端设备中断的故障恢复之后,可以继续进行I/O请求的处理,而不会导致I/O处理hung死。
【附图说明】
图1为一种虚拟机中的I/O请求处理的架构图。
图2为Vring结构体的一种抽象图。
图3为图2的Vring的结构体的一种示例图。
图4为本发明的虚拟机中的I/O请求处理方法实施例一的流程图。
图5为本发明的虚拟机中的I/O请求处理方法实施例二的流程图。
图6为图2的Vring的结构体的另一种示例图。
图7为本发明的Guest内核的后端设备实施例一的结构图。
图8为本发明的Guest内核的后端设备实施例二的结构图。
图9为本发明的计算机设备实施例的结构图。
图10为本发明提供的一种计算机设备的示例图。
【具体实施方式】
为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。
图1为一种虚拟机中的I/O请求处理的架构图。如图1所示的架构为现有的Vhost技术中I/O请求处理的架构。根据图1所示的架构,I/O请求处理的流程具体可以包括如下步骤:
1、中间软件层即Hypervisor进程以shmget的方式为Guest kernel的前端即图1中的Guest kernel申请I/O处理内存,Hypervisor进程可以记录申请的I/O处理内存的句柄、I/O处理内存的长度以及I/O处理内存中的虚拟请求队列(Virtio-queue)的起始位置,即Guest kernel的前端能够看到的虚拟设备的Virtio-queue的起始位置;
2、Hypervisor进程创建端口(socket),与Guest kernel的后端即图1中的后端(Backend)程序进行通信,这样后端用户态进程即Backend程序可以获取到申请I/O处理内存的句柄、I/O处理内存的长度以及I/O处理内存中的Virtio-queue的起始位置;然后Backend程序可以采用mmap的方式映射I/O处理内存的地址空间,并根据I/O处理内存中的Virtio-queue的起始位置,在映射的I/O处理内存的地址空间中定位的Virtio-queue的位置,这样,Guest kernel的前端与Guest kernel的后端,即图1中的Guest kernel与Backend程序,便能够共享I/O处理内存,即图1中的Host memory中的shared memory,其中Virtio-queue位于I/O处理内存即图1中的shared memory中。Guest kernel的前端与Guest kernel的后端shared memory时,在Guest kernel的前端和Guest kernel的后端虽然访问该shared memory的地址不相同,但均能够访问到该shared memory以及其中的Virtio-queue中的数据结构;
3、待Guest kernel启动之后,访问shared memory中的Virtio-queue,并向Virtio-queue中写入I/O请求链;
4、Backend程序轮询Virtio-queue中的Vring结构体,对于新加入Vring的I/O请求链进行处理。
其中Vring结构体是Virtio-queue底层最基本的结构体,它是每个Virtio-queue数据通信的载体。一个虚拟设备可以具有多个Virtio-queue。
图2为Vring结构体的一种抽象图。如图2所示,VRing结构主要包含3部分,分别是Description ring(简称Desc环),avail环和used环,图2中的avail环和used环分别采用数组表示,即avail数组和used数组。
其中Desc环用于存放承载虚拟机I/O请求链的物理起始地址,长度以及偏移量等信息,一个I/O请求通常需要占用多个元素,元素之间靠next域相连,构成一个I/O请求链。当该Desc环中存放三个I/O请求链时,例如,可以在第0、1、2和3位置存放一个I/O请求链,在第4、5、6、7和8位置存放一个I/O请求链,在第9、10、11和12位置存放一个I/O请求链。此时free_head可以指向第13个位置,以指示下一个用于存放I/O请求链的空闲位置。该Desc环也可以理解为一个数组,例如该Desc环可以为长度为128的数组,即从第0个位置开始到第127个存储格子。每个I/O请求链中可以包括一个或者多个I/O请求,每个I/O请求的多个元素在存储时占用一个存储格子。
avail数组用于存放Guest kernel提交的I/O请求链对应于Desc环中的起始位置,图3为图2的Vring的结构体的一种示例图。如图3所示,avail数组分别存放Desc环中第1个、第2个和第3个I/O请求链的起始位置,即分别指向Desc环中第1个、第2个以及第3个位置,avail数组中还记录有已提交的I/O请求链的索引标识,可以称之为第一已提交的I/O请求链的索引标识,采用Avail_idx表示,在avail数组中,该Avail_idx指向下一个空闲的待提交的I/O请求链的起始位置。其中Avail_idx的初始值为0,Guest kernel每提交一个I/O请求链,Avail_idx的值累加1,例如图3中,Guest kernel提交了3个I/O请求链,此时Avail_idx的值此时等于3。
used数组用于存放Backend程序处理完成的I/O请求链对应的起始位置;同时在used数组中还记录有已完成的I/O请求链的索引标识,可以称之为第一已完成的I/O请求链的索引标识,采用Used_idx来表示,在used数组中,该Used_idx指向下一个待完成的I/O请求链的起始位置。Used_idx的初始值为0,Backend程序每处理完一个I/O请求链,Used_idx的值累加1。如图3所示,此时的Used_idx的值可以等于2。
Guest kernel可以一次性向Desc环中提交多个I/O请求链,最多可以填满整个Desc环。同时将每个I/O请求链的起始位置依次填入avail数组中。
然后,Backend程序在轮询的时候,处理每个I/O请求链,但是请求完成的顺序不一定是按照提交的顺序。I/O请求链完成后,将按照完成的顺序依次将完成的I/O请求链的起始位置填入used数组中,同时在完成后向Guest kernel发送中断。如图3所示,表示起始位置在Desc环的第1个位置的I/O请求链和起始位置在Desc环的第3个位置的I/O请求链处理完成。另外,需要说明的是,由于图3中第1个位置的I/O请求链和第3个位置的I/O请求链处理完成,所以Desc环释放对应位置的空间,可以存储新的I/O请求链,将剩下的空闲存储格子连接起来构成一个环。
在Guest kernel侧即Guest kernel的前端侧,每次提交一个I/O请求链到Desc环中,就将在Guest kernel侧保存的变量last_Avail_idx累加1,该变量last_Avail_idx为第二已提交的I/O请求链的索引标识,其初始值为0。同时将Vring结构的中的avail数组中的Avail_idx累加1。同理,该last_Avail_idx的初始值也为0。
在Backend程序中,也会维护一个last_Avail_idx变量,该变量last_Avail_idx初始值也为0。Backend程序每提交一个待处理的I/O请求链,将变量last_Avail_idx累加1,并开始处理该I/O请求链。每次比较该值和Vring中的avail数组中的Avail_idx,通过两者的差值找到待处理的avail数组起始位置,进而通过avail数组中的值来找到待处理的I/O请求链的起始位置。
在Backend程序中,还会保存当前已处理过的I/O请求链的索引标识,即last_Used_idx,可以称之为第二已完成的I/O请求链的索引标识,每次在完成一个I/O请求链之后,将该last_Used_idx的值累加1,并且将Vring结构中的Used_idx累加1。同理,该last_Used_idx的初始值也为0。
在Guest kernel侧,同样会维护last_Used_idx变量,通过该值与Vring中的Used_idx值来对比完成了used数组中的位置,通过used数组中的值来返回对应I/O请求链的处理结果。
因此,在整个Guest kernel(即Guest kernel的前端)和Backend程序(即Guestkernel的后端)的配合中,Guest kernel不断的提交I/O请求链,Backend程序不断地处理I/O请求链,每个I/O请求链既不能够被重复处理,也不能够被漏处理。
但是在处理过程中,Backend程序处理I/O请求链的完成顺序并不是按照提交的顺序完成,而是乱序完成的。例如Guest kernel侧提交的I/O请求链为1、2、3,因此Vring里面的avail数组中保存着1、2、3的I/O请求链,Avail_idx的数值为3,指向第4个位置,而这时候Backend程序完成了两个I/O请求链,I/O请求链1和3,Used_idx的数值为2,指向第3个位置。如果此时Backend程序异常断开,在重连之后,Backend程序的last_avail_idx和last_used_idx都设置为2(即指向第三个位置),然后如果直接开始处理I/O请求链的话,会把第3个I/O请求链重新提交一遍,但是实际上需要处理的却是第2个I/O请求链。因此,由于Guestkernel的后端和Guest kernel的前端出现信息不同步,导致无法继续处理后续的I/O请求链,从而导致I/O处理hung死。基于上述问题,本发明基于上述现有的Vhost背景,提供一种虚拟机中的I/O请求处理方案,以保证Guest kernel的后端和Guest kernel的前端信息同步,使得异常中断后,重连之后仍然能够继续处理后续的I/O请求链,避免I/O处理hung死。
图4为本发明的虚拟机中的I/O请求处理方法实施例一的流程图。如图4所示,本实施例的虚拟机中的I/O请求处理方法,具体可以包括如下步骤:
100、Guest kernel的后端设备在开始处理Guest kernel的前端设备提交至共享的I/O处理内存中的I/O请求链时,从I/O处理内存中获取I/O请求链的起始位置;
本实施例的虚拟机中的I/O请求处理方法在Guest kernel的后端设备一侧描述本发明的技术方案。本实施例的Guest kernel的后端设备可以为上述图1中的Backend程序的集成单元,Guest kernel的后端设备和Guest kernel的前端设备共享I/O处理内存,如图1中所示的shared memory。Guest kernel的后端设备和Guest kernel的前端设备都可以访问图1中I/O处理内存中的Virtio-queue中的Vring结构体的数据结构。
本实施例中,Guest kernel的后端设备与Guest kernel的前端设备共享I/O处理内存,都可以访问该I/O处理内存。以Guest kernel的后端设备在开始处理Guest kernel的前端设备提交至共享的I/O处理内存中的某个I/O请求链为例,此时,Guest kernel的后端设备可以从I/O处理内存中获取I/O请求链的起始位置,例如可以从I/O处理内存中的Vring结构体中的avail数组中获取该I/O请求链在Desc环中的起始位置。
101、根据I/O请求链的起始位置,将I/O状态数组中与I/O请求链的起始位置对应的元素置位为与所有位置的初始值不同的数值;
102、在处理完该I/O请求链时,将I/O请求状态数组中与该I/O请求链的起始位置对应的元素置位为与初始值相同的数值。
本实施例中,Guest kernel的后端设备获取到当前正在处理的I/O请求链的起始位置之后,将与中间软件层Hypervisor共享的I/O状态数组中与该I/O请求链的起始位置对应的元素置位为与所有位置的初始值不同的数值,例如,为便于方便,可以将所有位置的初始值设置为0,而将共享的I/O状态数组中与该I/O请求链的起始位置对应的元素置位为1;或者将所有位置的初始值设置为1,而将I/O状态数组中与该I/O请求链的起始位置对应的元素置位为0;只要能够标识出Guest kernel的后端设备当前正在处理的I/O请求链的起始位置即可。如图1所示,若Desc环的长度为128,则I/O请求链的起始位置可以有128个值,则对应地,可以设置I/O状态数组的长度也为128。同理,若Desc环的长度为256,或者其他数值时,此时对应地I/O状态数组的长度也可以为256,或者其他数值。例如若Guest kernel的后端设备在提交起始位置在Desc环中为1的I/O请求链时,此时I/O状态数组第1位的数值为1,其余位置全为0。若Guest kernel的后端设备始位置在Desc环中为1的I/O请求链中的所有请求处理完之后,此时将该I/O状态数组第1位的数值置位为与初始值相同的数值,即置位为0。本实施例的I/O状态数组也可以称之为inflight数组,用于根据I/O请求链在Desc环中起始位置,标识Guest kernel的后端设备正在处理的I/O请求链。
其中需要说明的是,Guest kernel的后端设备可以依次提交多个I/O请求链,例如,可以依次提交图3所示的初始位置在Desc环中分别为1、2和3的I/O请求链,此时依次将I/O状态数组第1位、第2位和第3位的数值均置位为1,其余位置全为0。如图3所示的状态,当初始位置在Desc环中分别为1和3的I/O请求链处理完毕时,此时依次将I/O状态数组第1位和第3位的数值置位为0,此时的I/O状态数组仅第2位的数值为1,其余位置全为0。上述实例是以Desc环中一个I/O请求链占用一个位置为例,实际应用中,一个I/O请求链中包括多个请求时也可以占用多个位置,例如若Guest kernel的后端设备可以依次提交3个I/O请求链,如第一个I/O请求链在Desc环中占用的位置为第0、1、2和3,第二个I/O请求链在Desc环中占用的位置为第4、5、6、7和8位置,第三个I/O请求链在Desc环中占用的位置为第9、10、11和12。在Guest kernel的后端设备对三个I/O请求链均未处理完毕时,此时I/O状态数组中第0位置、第4位置和第9位置的数值为1,其余位置为0。而若第一个I/O请求链处理完毕,此时第0位置再置位为0,同理,第二个I/O请求链处理完毕,此时第4位置再置位回为0;第三个I/O请求链处理完毕,此时第9位置再置位回为0。无论I/O请求链的初始位置在Desc环中的哪个位置,均可以采用上述方式标识当前正在处理的I/O请求链的初始位置。这样,可以时刻在I/O状态数组中标识Guest kernel的后端设备当前正在处理的I/O请求链的状态,即使Guest kernel的后端设备在处理的I/O请求链的过程中异常中断,重启Guest kernel的后端设备之后,仍然可以根据I/O状态数组中标识的正在处理的I/O请求链的初始位置,确定Guest kernel的后端设备中断时正在处理的I/O请求链的初始位置,此时可以根据Guestkernel的前端设备在Ring结构体中记录的中断时正在处理的I/O请求链的信息,继续处理该I/O请求链,保证I/O请求链的继续处理,防止I/O处理hung死。
本实施例的虚拟机中的I/O请求处理方法,通过由Guest kernel的后端设备在开始处理Guest kernel的前端设备提交至共享的I/O处理内存中的I/O请求链时,从I/O处理内存中获取I/O请求链的起始位置;根据I/O请求链的起始位置,将共享的I/O状态数组中与I/O请求链的起始位置对应的元素置位为与所有位置的初始值不同的数值;在处理完该I/O请求链时,将I/O请求状态数组中与该I/O请求链的起始位置对应的元素置位为与初始值相同的数值。通过采用本实施例的上述技术方案,可以保证Guest kernel的前端设备和Guestkernel的后端设备的信息的同步,保证Guest kernel的后端设备中断的故障恢复之后,可以继续进行I/O请求的处理,而不会导致I/O处理hung死。
图5为本发明的虚拟机中的I/O请求处理方法实施例二的流程图。如图5所示,本实施例的虚拟机中的I/O请求处理方法,在上述图4所示实施例的技术方案的基础上,进一步更加详细地介绍本发明的技术方案。如图5所示,本实施例的虚拟机中的I/O请求处理方法,具体可以包括如下步骤:
200、Guest kernel的后端设备与中间软件层Hypervisor交互,获取中间软件层Hypervisor申请I/O处理内存的句柄、I/O处理内存的长度、I/O处理内存中的Virtio-queue的起始位置;同时还获取中间软件层Hypervisor申请I/O状态数组内存的句柄和I/O状态数组的长度;
同理,本实施例中,也是由中间软件层Hypervisor申请内存,与现有技术不同的是,本实施例在中间软件层Hypervisor申请I/O处理内存的同时,再申请一个I/O状态数组内存。这样,在Guest kernel的后端设备与中间软件层Hypervisor交互时,Guest kernel的后端设备不仅从中间软件层Hypervisor获取申请I/O处理内存的句柄、I/O处理内存的长度、I/O处理内存中的Virtio-queue的起始位置,同时还获取申请I/O状态数组内存的句柄和I/O状态数组的长度。其中Virtio-queue中的最基本的结构体为Vring结构体,用于存储Guest kernel的前端设备写入的I/O请求链的信息,以供Guest kernel的后端设备处理Guest kernel的前端设备写入在Vring结构体中的I/O请求链。
201、Guest kernel的后端设备根据申请I/O处理内存的句柄、I/O处理内存的长度以及I/O处理内存中的虚拟请求队列的起始位置,映射I/O处理内存的地址空间,以与Guestkernel的前端设备共享I/O处理内存;
202、Guest kernel的后端设备根据申请I/O状态数组内存的句柄和I/O状态数组的长度,映射I/O状态数组的地址空间,以与中间软件层Hypervisor共享I/O状态数组的内存;
上述步骤201和202没有先后顺序限制,也可以同时执行。经过步骤201和步骤202,Guest kernel的前端设备和Guest kernel的后端设备共享I/O处理内存,均可以访问I/O处理内存中的Virtio-queue中的Vring结构体,以实现Guest kernel的前端设备在该Vring结构体中写入I/O请求链的信息,Guest kernel的后端设备处理Guest kernel的前端设备写入在Vring结构体中的I/O请求链。而Guest kernel的后端设备和中间软件层Hypervisor共享I/O状态数组的内存,在Guest kernel的后端设备异常终止时,由于中间软件层Hypervisor正常运行,I/O状态数组中的数据仍然有效存储。
203、Guest kernel的前端设备向共享的I/O处理内存中提交I/O请求链;
具体地,每在Desc环中提交一个I/O请求链,在avail数组中存放该I/O请求链在Desc环的起始位置,同时将Avail_idx的数值累加1。同时在Guest kernel的前端设备的本地保存的变量last_Avail_idx的数值也累加1。
204、Guest kernel的后端设备检测到共享的I/O处理内存中有未处理的I/O请求链时,在开始处理Guest kernel前端提交的I/O请求链时,从I/O处理内存中获取I/O请求链的起始位置;
在Guest kernel的后端设备中,处理I/O请求链时,也是先提交再处理,若Guestkernel的后端设备检测到共享的I/O处理内存中有未处理的I/O请求链时,先提交该I/O请求链,此时Guest kernel的后端设备中维护的变量last_Avail_idx的数值累加1。并开始处理该I/O请求链。每次比较该值和Vring中的avail数组中的Avail_idx,通过两者的差值找到待处理的avail数组起始位置,进而通过avail数组中的值来找到待处理的I/O请求链的起始位置。
205、根据I/O请求链的起始位置,将共享的I/O状态数组中与I/O请求链的起始位置对应的元素置位为与所有位置的初始值0不同的数值1;直到处理完该I/O请求链时,将I/O请求状态数组中与该I/O请求链的起始位置对应的元素置位为与初始值0相同的数值0;
206、若在处理该I/O请求链的过程中Guest kernel的后端设备异常中断,Guestkernel的后端设备重启,与中间软件层Hypervisor重连获取信息,并重新映射I/O状态数组的地址空间和I/O处理内存的地址空间,以与Guest内核的前端设备共享I/O状态数组的内存,与Guest kernel的前端设备共享I/O处理内存;
在Guest kernel的后端设备运行期间异常退出,I/O状态数组即inflight数组的信息得以在Hypervisor的进程地址空间得以保存。在Hypervisor侧,应该具有监听与Guestkernel的后端设备通信的socket的逻辑。在socket断开之后,就认为是后端用户态程序即Guest kernel的后端设备异常中断了,然后启动重连请求的不断重试。
在后端用户态程序即Guest kernel的后端设备重启之后,将收到Hypervisor的重连请求,此时Hypervisor对后端用户态程序对应的设备信息重新进行初始化,其中主要涉及到Guest kernel的地址空间信息,Virtio-queue地址,以及I/O状态数组即inflight数组地址空间信息。
由于Hypervisor连同Guest kernel的前端设备在Guest kernel的后端设备的异常中断期间始终运行,因此Virtio-queue以及I/O状态数组的信息保持了Guest kernel的后端设备异常中断时刻的状态。
207、Guest kernel的后端设备从I/O请求状态数组中获取异常中止时处理的I/O请求链的起始位置;
208、根据I/O请求链的起始位置,重新处理I/O处理内存中的I/O请求链;
基于上述所述,在中断后重连之后,可以从I/O请求状态数组中获取异常中止时处理的I/O请求链的起始位置;并重新处理I/O处理内存中的I/O请求链,保证I/O请求链的正确执行。具体处理过程参考上述相关实施例的记载,在此不再赘述。
209、根据I/O请求链的起始位置,重新处理I/O处理内存中的I/O请求链;
210、从I/O处理内存中获取第一已完成的I/O请求链的索引标识;
211、根据第一已完成I/O请求链的索引标识,重置Guest kernel的后端设备本地的已提交的I/O请求链的索引标识和第二已完成的I/O请求链的索引标识,保证后续I/O请求链的正常处理。
例如,具体将Guest kernel的后端设备本地的已提交的I/O请求链的索引标识和第二已完成的I/O请求链的索引标识的数值重置为第一已完成的I/O请求链的索引标识的数值。
也就是说,Guest kernel的后端设备在重启之后初始化Virtio-queue的时候,需要正确设置本地的已提交的I/O请求链的索引标识last_Avail_idx和第二已完成的I/O请求链的索引标识last_Used_idx,由于I/O请求链是先提交后处理,那么在实际的运行过程中,last_Avail_idx肯定要超前于last_Used_idx。根据上面的分析,I/O处理内存Vring结构体中的第一已完成的I/O请求链的索引标识used_idx是Guest kernel的后端设备上次确认的I/O请求链的对应于used数组中的位置,因此本实施例中,Guest kernel的后端设备还需要设置last_Avail_idx和last_Used_idx为Vring结构体中的Used_idx值,这样,才可以保证后续的I/O请求继续正常处理。
图6为图2的Vring的结构体的另一种示例图。若在上述实施例所述的图3所述的状态中,Guest kernel的后端设备异常中断,此时由于I/O状态数组中保留了未处理完的I/O请求链2的起始位置。需要在Guest kernel的后端设备正式I/O请求链之前,先扫描一遍I/O状态数组,然后将未完成的I/O请求链先提交一遍然后继续正常处理后续的I/O请求链流程即可。
例如图3的情况,Guest kernel的后端设备在发送完I/O请求链2之后,将last_Avail_idx加1,然后在I/O请求链2完成之后,将last_Used_idx加1,刚好在处理完I/O请求链2之前异常退出。
在Guest kernel的后端设备恢复正常的I/O请求处理时,如图6所示。该状态相当于虚拟机刚刚重启之后的Vring结构的状态,达到了不需要重启虚拟机就能够恢复到正常的I/O请求处理的工作状态的目的。
与之前重启虚拟机的方案相比,本实施例的方法不仅提供了虚拟机自动重连Guest kernel的后端设备的功能,省去了虚拟机重启的必要,还能够保证正在进行的I/O请求链不丢失。在Guest kernel的后端设备异常退出之后,只需花几秒的时间就可以重启Guest kernel的后端设备来重新建立异常退出之前的Virtio-queue通信所需要的全部信息。因此,本实施例的技术方案的实现,可以保证在不影响用户业务,不丢失用户数据的情况下,对后端用户态程序即Guest kernel的后端设备快速升级,即通过临时断开后端程序,然后重启新的后端用户程序,即可完成用户态程序的快速升级。对于不支持重连的Hypervisor进程,后端用户态进程的修改保持了向后的兼容性。
通过采用本实施例的上述技术方案,可以保证Guest kernel的前端设备和Guestkernel的后端设备的信息的同步,保证Guest kernel的后端设备中断的故障恢复之后,可以继续进行I/O请求的处理,而不会导致I/O处理hung死。
图7为本发明的Guest内核的后端设备实施例一的结构图。如图7所示,本实施例的Guest内核的后端设备,具体可以包括:
位置获取模块10用于在开始处理Guest内核的前端设备提交至共享的I/O处理内存中的I/O请求链时,从I/O处理内存中获取I/O请求链的起始位置;
置位模块11用于根据位置获取模块10获取的I/O请求链的起始位置,将I/O状态数组中与I/O请求链的起始位置对应的元素置位为与所有位置的初始值不同的数值;
置位模块11还用于在处理完I/O请求链时,将I/O请求状态数组中与I/O请求链的起始位置对应的元素置位为与初始值相同的数值。
本实施例的Guest内核的后端设备,通过采用上述模块实现虚拟机中的I/O请求处理的实现原理以及技术效果与上述相关方法实施例的实现相同,详细可以参考上述相关方法实施例的记载,在此不再赘述。
图8为本发明的Guest内核的后端设备实施例二的结构图。如图8所示,本实施例的Guest内核的后端设备,在上述图7所示实施例的技术方案的基础上,进一步更加详细地介绍本发明的技术方案。如图8所示,本实施例的Guest内核的后端设备,具体可以还包括:
内存信息获取模块12用于与中间软件层Hypervisor交互,获取中间软件层Hypervisor申请I/O状态数组内存的句柄和I/O状态数组的长度;
映射模块13用于根据内存信息获取模块12获取的申请I/O状态数组内存的句柄和I/O状态数组的长度,映射I/O状态数组的地址空间,以与中间软件层Hypervisor共享I/O状态数组的内存。
对应地,置位模块11还用于在处理完I/O请求链时,将映射模块13映射的I/O请求状态数组中与I/O请求链的起始位置对应的元素置位为与初始值相同的数值。
进一步可选地,本实施例的Guest内核的后端设备中,映射模块13还用于在Guest内核的后端设备异常中止后,与中间软件层Hypervisor重连后,重新映射I/O状态数组的地址空间和I/O处理内存的地址空间,以与中间软件层Hypervisor共享I/O状态数组的内存,与Guest内核的前端设备共享I/O处理内存;
位置获取模块10还用于从I/O请求状态数组中获取异常中止时处理的I/O请求链的起始位置,以根据I/O请求链的起始位置,重新处理I/O处理内存中的I/O请求链。
进一步可选地,如图8所示,本实施例的Guest内核的后端设备中,还包括:
索引标识获取模块14用于从映射模块13映射的I/O处理内存中获取第一已完成的I/O请求链的索引标识;
重置模块15用于根据索引标识获取模块14获取的第一已完成I/O请求链的索引标识,重置本地的已提交的I/O请求链的索引标识和第二已完成的I/O请求链的索引标识。
进一步可选地,本实施例的Guest内核的后端设备中,内存信息获取模块12还用于与中间软件层Hypervisor交互,获取中间软件层Hypervisor申请的I/O处理内存的句柄、I/O处理内存的长度、I/O处理内存中的虚拟请求队列的起始位置;
映射模块13还用于根据内存信息获取模块12获取的申请I/O处理内存的句柄、I/O处理内存的长度以及I/O处理内存中的虚拟请求队列的起始位置,映射I/O处理内存的地址空间,以与Guest内核的前端设备共享I/O处理内存。
对应地,位置获取模块10用于在开始处理Guest内核的前端设备提交至映射模块13映射的共享的I/O处理内存中的I/O请求链时,从映射模块13映射的I/O处理内存中获取I/O请求链的起始位置。
另外,需要说明的是,本实施例的Guest内核的后端设备中,还可以包括I/O请求链的处理模块等,以实现对I/O请求链的处理等操作,在此不再一一赘述。
本实施例的Guest内核的后端设备,通过采用上述模块实现虚拟机中的I/O请求处理的实现原理以及技术效果与上述相关方法实施例的实现相同,详细可以参考上述相关方法实施例的记载,在此不再赘述。
图9为本发明的计算机设备实施例的结构图。如图9所示,本实施例的计算机设备,包括:一个或多个处理器30,以及存储器40,存储器40用于存储一个或多个程序,当存储器40中存储的一个或多个程序被一个或多个处理器30执行,使得一个或多个处理器30实现如上图4-图5所示实施例的虚拟机中的I/O请求处理方法。图9所示实施例中以包括多个处理器30为例。即本实施例的计算机设备可以执行上述实施例中的Guest内核的后端设备的功能。
例如,图10为本发明提供的一种计算机设备的示例图。图10示出了适于用来实现本发明实施方式的示例性计算机设备12a的框图。图10显示的计算机设备12a仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。
如图10所示,计算机设备12a以通用计算设备的形式表现。计算机设备12a的组件可以包括但不限于:一个或者多个处理器16a,系统存储器28a,连接不同系统组件(包括系统存储器28a和处理器16a)的总线18a。
总线18a表示几类总线结构中的一种或多种,包括存储器总线或者存储器控制器,外围总线,图形加速端口,处理器或者使用多种总线结构中的任意总线结构的局域总线。举例来说,这些体系结构包括但不限于工业标准体系结构(ISA)总线,微通道体系结构(MAC)总线,增强型ISA总线、视频电子标准协会(VESA)局域总线以及外围组件互连(PCI)总线。
计算机设备12a典型地包括多种计算机系统可读介质。这些介质可以是任何能够被计算机设备12a访问的可用介质,包括易失性和非易失性介质,可移动的和不可移动的介质。
系统存储器28a可以包括易失性存储器形式的计算机系统可读介质,例如随机存取存储器(RAM)30a和/或高速缓存存储器32a。计算机设备12a可以进一步包括其它可移动/不可移动的、易失性/非易失性计算机系统存储介质。仅作为举例,存储系统34a可以用于读写不可移动的、非易失性磁介质(图10未显示,通常称为“硬盘驱动器”)。尽管图10中未示出,可以提供用于对可移动非易失性磁盘(例如“软盘”)读写的磁盘驱动器,以及对可移动非易失性光盘(例如CD-ROM,DVD-ROM或者其它光介质)读写的光盘驱动器。在这些情况下,每个驱动器可以通过一个或者多个数据介质接口与总线18a相连。系统存储器28a可以包括至少一个程序产品,该程序产品具有一组(例如至少一个)程序模块,这些程序模块被配置以执行本发明上述图4-图8各实施例的功能。
具有一组(至少一个)程序模块42a的程序/实用工具40a,可以存储在例如系统存储器28a中,这样的程序模块42a包括——但不限于——操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。程序模块42a通常执行本发明所描述的上述图4-图8各实施例中的功能和/或方法。
计算机设备12a也可以与一个或多个外部设备14a(例如键盘、指向设备、显示器24a等)通信,还可与一个或者多个使得用户能与该计算机设备12a交互的设备通信,和/或与使得该计算机设备12a能与一个或多个其它计算设备进行通信的任何设备(例如网卡,调制解调器等等)通信。这种通信可以通过输入/输出(I/O)接口22a进行。并且,计算机设备12a还可以通过网络适配器20a与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图所示,网络适配器20a通过总线18a与计算机设备12a的其它模块通信。应当明白,尽管图中未示出,可以结合计算机设备12a使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理器、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
处理器16a通过运行存储在系统存储器28a中的程序,从而执行各种功能应用以及数据处理,例如实现上述实施例所示的虚拟机中的I/O请求处理方法。
本发明还提供一种计算机可读介质,其上存储有计算机程序,该程序被处理器执行时实现如上述实施例所示的虚拟机中的I/O请求处理方法。
本实施例的计算机可读介质可以包括上述图10所示实施例中的系统存储器28a中的RAM30a、和/或高速缓存存储器32a、和/或存储系统34a。
随着科技的发展,计算机程序的传播途径不再受限于有形介质,还可以直接从网络下载,或者采用其他方式获取。因此,本实施例中的计算机可读介质不仅可以包括有形的介质,还可以包括无形的介质。
本实施例的计算机可读介质可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括——但不限于——电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、电线、光缆、RF等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如”C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络——包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
在本发明所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

Claims (12)

1.一种虚拟机中的I/O请求处理方法,其特征在于,所述方法包括:
Guest内核的后端设备在开始处理Guest内核的前端设备提交至共享的I/O处理内存中的I/O请求链时,从所述I/O处理内存中获取所述I/O请求链的起始位置;
根据所述I/O请求链的起始位置,将I/O状态数组中与所述I/O请求链的起始位置对应的元素置位为与所有位置的初始值不同的数值;
在处理完所述I/O请求链时,将所述I/O请求状态数组中与所述I/O请求链的起始位置对应的元素置位为与所述初始值相同的数值。
2.根据权利要求1所述的方法,其特征在于,根据所述I/O请求链的起始位置,将I/O状态数组中与所述I/O请求链的起始位置对应的元素置位为与所有位置的初始值不同的数值之前,所述方法还包括:
与中间软件层Hypervisor交互,获取所述中间软件层Hypervisor申请I/O状态数组内存的句柄和所述I/O状态数组的长度;
根据申请所述I/O状态数组内存的句柄和所述I/O状态数组的长度,映射所述I/O状态数组的地址空间,以与所述中间软件层Hypervisor共享所述I/O状态数组的内存。
3.根据权利要求2所述的方法,其特征在于,根据所述I/O请求链的起始位置,将I/O状态数组中与所述I/O请求链的起始位置对应的元素置位为与其余位置的初始值不同的数值之后,在处理完所述I/O请求链之前,所述方法还包括:
所述Guest内核的后端设备异常中止后,重启并与所述中间软件层Hypervisor重连后,重新映射所述I/O状态数组的地址空间和所述I/O处理内存的地址空间,以与所述中间软件层Hypervisor共享所述I/O状态数组的内存,与所述Guest内核的前端设备共享所述I/O处理内存;
从所述I/O请求状态数组中获取异常中止时处理的所述I/O请求链的起始位置,以根据所述I/O请求链的起始位置,重新处理所述I/O处理内存中的所述I/O请求链。
4.根据权利要求3所述的方法,其特征在于,从所述I/O请求状态数组中获取异常中止时处理的所述I/O请求链的起始位置,以根据所述I/O请求链的起始位置,重新处理所述I/O处理内存中的所述I/O请求链之后,所述方法还包括:
从所述I/O处理内存中获取第一已完成的I/O请求链的索引标识;
根据所述第一已完成I/O请求链的索引标识,重置本地的已提交的I/O请求链的索引标识和第二已完成的I/O请求链的索引标识。
5.根据权利要求2-4任一所述的方法,其特征在于,所述Guest内核的后端设备在开始处理Guest内核的前端设备提交至共享的I/O处理内存中的I/O请求链之前,所述方法还包括:
与所述中间软件层Hypervisor交互,获取所述中间软件层Hypervisor申请的I/O处理内存的句柄、所述I/O处理内存的长度、所述I/O处理内存中的虚拟请求队列的起始位置;
根据申请所述I/O处理内存的句柄、所述I/O处理内存的长度以及所述I/O处理内存中的虚拟请求队列的起始位置,映射所述I/O处理内存的地址空间,以与所述Guest内核的前端设备共享所述I/O处理内存。
6.一种Guest内核的后端设备,其特征在于,所述设备包括:
位置获取模块,用于在开始处理Guest内核的前端设备提交至共享的I/O处理内存中的I/O请求链时,从所述I/O处理内存中获取所述I/O请求链的起始位置;
置位模块,用于根据所述I/O请求链的起始位置,将I/O状态数组中与所述I/O请求链的起始位置对应的元素置位为与所有位置的初始值不同的数值;
所述置位模块,还用于在处理完所述I/O请求链时,将所述I/O请求状态数组中与所述I/O请求链的起始位置对应的元素置位为与所述初始值相同的数值。
7.根据权利要求6所述的设备,其特征在于,所述设备还包括:
内存信息获取模块,用于与中间软件层Hypervisor交互,获取所述中间软件层Hypervisor申请I/O状态数组内存的句柄和所述I/O状态数组的长度;
映射模块,用于根据申请所述I/O状态数组内存的句柄和所述I/O状态数组的长度,映射所述I/O状态数组的地址空间,以与所述中间软件层Hypervisor共享所述I/O状态数组的内存。
8.根据权利要求7所述的设备,其特征在于,所述映射模块,还用于在所述Guest内核的后端设备异常中止后,重启并与所述中间软件层Hypervisor重连后,重新映射所述I/O状态数组的地址空间和所述I/O处理内存的地址空间,以与所述中间软件层Hypervisor共享所述I/O状态数组的内存,与所述Guest内核的前端设备共享所述I/O处理内存;
所述位置获取模块,还用于从所述I/O请求状态数组中获取异常中止时处理的所述I/O请求链的起始位置,以根据所述I/O请求链的起始位置,重新处理所述I/O处理内存中的所述I/O请求链。
9.根据权利要求8所述的设备,其特征在于,所述设备还包括:
索引标识获取模块,用于从所述I/O处理内存中获取第一已完成的I/O请求链的索引标识;
重置模块,用于根据所述第一已完成I/O请求链的索引标识,重置本地的已提交的I/O请求链的索引标识和第二已完成的I/O请求链的索引标识。
10.根据权利要求7-9任一所述的设备,其特征在于:
所述内存信息获取模块,还用于与所述中间软件层Hypervisor交互,获取所述中间软件层Hypervisor申请的I/O处理内存的句柄、所述I/O处理内存的长度、所述I/O处理内存中的虚拟请求队列的起始位置;
所述映射模块,还用于根据申请所述I/O处理内存的句柄、所述I/O处理内存的长度以及所述I/O处理内存中的虚拟请求队列的起始位置,映射所述I/O处理内存的地址空间,以与所述Guest内核的前端设备共享所述I/O处理内存。
11.一种计算机设备,其特征在于,所述设备包括:
一个或多个处理器;
存储器,用于存储一个或多个程序;
当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如权利要求1-5中任一所述的方法。
12.一种计算机可读介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1-5中任一所述的方法。
CN201711018956.4A 2017-10-26 2017-10-26 虚拟机中的i/o请求处理方法、设备及计算机可读介质 Active CN107807843B (zh)

Priority Applications (2)

Application Number Priority Date Filing Date Title
CN201711018956.4A CN107807843B (zh) 2017-10-26 2017-10-26 虚拟机中的i/o请求处理方法、设备及计算机可读介质
US16/167,197 US10997099B2 (en) 2017-10-26 2018-10-22 I/O request processing method in virtual machine, device and computer readable medium

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201711018956.4A CN107807843B (zh) 2017-10-26 2017-10-26 虚拟机中的i/o请求处理方法、设备及计算机可读介质

Publications (2)

Publication Number Publication Date
CN107807843A CN107807843A (zh) 2018-03-16
CN107807843B true CN107807843B (zh) 2019-05-24

Family

ID=61590834

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201711018956.4A Active CN107807843B (zh) 2017-10-26 2017-10-26 虚拟机中的i/o请求处理方法、设备及计算机可读介质

Country Status (2)

Country Link
US (1) US10997099B2 (zh)
CN (1) CN107807843B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2018119707A1 (zh) * 2016-12-27 2018-07-05 深圳前海达闼云端智能科技有限公司 内核配置信息的管理方法、装置和电子设备
US10540294B2 (en) * 2017-02-17 2020-01-21 Red Hat Israel, Ltd. Secure zero-copy packet forwarding
CN110825485A (zh) * 2018-08-07 2020-02-21 华为技术有限公司 数据处理的方法、设备和服务器
US11901309B2 (en) * 2019-11-12 2024-02-13 Semiconductor Components Industries, Llc Semiconductor device package assemblies with direct leadframe attachment
JP2022022059A (ja) * 2020-07-22 2022-02-03 富士通株式会社 情報処理装置、情報処理プログラム、及び情報処理方法

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101706742A (zh) * 2009-11-20 2010-05-12 北京航空航天大学 一种基于多核动态划分的非对称虚拟机i/o调度方法

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7827362B2 (en) * 2004-08-24 2010-11-02 Symantec Corporation Systems, apparatus, and methods for processing I/O requests
US9104599B2 (en) * 2007-12-06 2015-08-11 Intelligent Intellectual Property Holdings 2 Llc Apparatus, system, and method for destaging cached data
CN101706757B (zh) * 2009-09-21 2011-11-16 中国科学院计算技术研究所 面向多核平台和分布式虚拟化环境的i/o系统及工作方法
KR101387986B1 (ko) * 2012-05-24 2014-04-22 성균관대학교산학협력단 가상화 장치
JP5941868B2 (ja) * 2013-04-18 2016-06-29 株式会社日立製作所 仮想計算機システムおよび仮想計算機におけるi/o実施方法
US10346148B2 (en) * 2013-08-12 2019-07-09 Amazon Technologies, Inc. Per request computer system instances
CN103984536B (zh) * 2014-02-14 2017-07-14 中国科学院计算技术研究所 一种云计算平台中的 i/o 请求计数系统及其方法
US9798567B2 (en) * 2014-11-25 2017-10-24 The Research Foundation For The State University Of New York Multi-hypervisor virtual machines
CN105556473A (zh) * 2014-12-27 2016-05-04 华为技术有限公司 一种i/o任务处理的方法、设备和系统
CN106970821B (zh) * 2016-01-12 2021-02-02 阿里巴巴集团控股有限公司 一种kvm虚拟化下处理i/o请求的方法和装置
JP6988040B2 (ja) * 2016-12-31 2022-01-05 インテル・コーポレーション ヘテロジニアスコンピューティングのためのシステム、方法及び装置
EP3688583A1 (en) * 2017-09-26 2020-08-05 INTEL Corporation Methods and apparatus to process commands from virtual machines
US11016798B2 (en) * 2018-06-01 2021-05-25 The Research Foundation for the State University Multi-hypervisor virtual machines that run on multiple co-located hypervisors

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101706742A (zh) * 2009-11-20 2010-05-12 北京航空航天大学 一种基于多核动态划分的非对称虚拟机i/o调度方法

Also Published As

Publication number Publication date
CN107807843A (zh) 2018-03-16
US20190129873A1 (en) 2019-05-02
US10997099B2 (en) 2021-05-04

Similar Documents

Publication Publication Date Title
CN107807843B (zh) 虚拟机中的i/o请求处理方法、设备及计算机可读介质
US9442791B2 (en) Building an intelligent, scalable system dump facility
US9063793B2 (en) Virtual server and virtual machine management method for supporting zero client by providing host interfaces from classified resource pools through emulation or direct connection modes
CN103942087B (zh) 虚拟机热迁移方法及相关装置和集群系统
US11086530B2 (en) Providing service address space for diagnostics collection
CN109951547A (zh) 事务请求并行处理方法、装置、设备和介质
CN106021147B (zh) 在逻辑驱动器模型下呈现直接存取的存储设备
US8892964B2 (en) Methods and apparatus for managing asynchronous dependent I/O for a virtual fibre channel target
CN104021069A (zh) 基于分布式虚拟机系统的软件性能测试的管理方法和系统
KR102387922B1 (ko) 솔리드 스테이트 드라이브의 비동기 이벤트 요청 명령 처리 방법 및 시스템
CN103562895B (zh) 通过选择性聚合相邻数据单元来便于路由
CN105739930B (zh) 一种存储架构及其初始化方法和数据存储方法及管理装置
US10248509B2 (en) Executing computer instruction including asynchronous operation
CN113703672B (zh) 一种超融合系统及其io请求下发方法、物理服务器
CN110058964A (zh) 数据恢复方法、数据恢复系统和计算机程序产品
US20090327537A1 (en) Virtualized Serial Attached SCSI Adapter
CN115113977A (zh) 描述符读取装置和设备、方法及集成电路
CN110321219A (zh) 一种事务请求的并行执行方法、装置、设备和介质
CN105786732B (zh) 数据访问方法及装置
CN104123173B (zh) 一种实现虚拟机间通信的方法及装置
CN108182119A (zh) 读写分离控制方法和装置、存储介质及电子装置
CN104252416A (zh) 一种加速器以及数据处理方法
CN110489210A (zh) 创建虚拟机的方法、装置、设备和计算机存储介质
CN107526538A (zh) 用于在存储系统中传递消息的方法和系统
US10936389B2 (en) Dual physical-channel systems firmware initialization and recovery

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant