在一个或多个虚拟机中生成应用级依赖的系统和方法

文档序号:7806932阅读:297来源:国知局

专利名称::在一个或多个虚拟机中生成应用级依赖的系统和方法
技术领域
:本公开一般涉及用于在一个或多个虚拟机中生成应用级依赖(dependency)的系统和方法。
背景技术
:企业服务通常由许多业务服务器和/或网络组成。随着网络增长和成熟的计算虚拟化技术的进展,企业应用变得更复杂。例如,由于云计算,更多用户应用从个人计算机移动到虚拟数据中心(VDC)中,最终用户通过请求由数据中心的业务服务器提供的业务来使用远程应用。分布式应用变得更强大和全面。单个节点的性能问题或失败会影响整个分布式系统的服务质量(QoS)。与硬件故障或资源耗尽相比较,软件问题很难检测。因此,期待分布式应用的性能管理。一种用于应用发现的当前技术是通过监视应用事件。此技术在每个物理服务器上安装代理。该代理监视由应用报告的事件,并且将事件转发到中心应用管理服务器。随后,应用管理服务器在数据中心中分析应用事件、发现在数据中心上运行的应用、并找到应用之间的依赖。用于应用依赖发现的一种当前技术是装备Java字节代码的中间件软件。装备的代码跟踪通过中间件的请求并且将跟踪日志发送到中心应用管理服务器。随后应用管理服务器分析这些日志、得知应用之间的消息交换、并发现应用之间的依赖。此技术在通过装备的中间件进行通信的分布式应用上工作。用于应用依赖发现(applicationdependencydiscovery)的一种当前技术是发觉(sniff)每个物理服务器上的网络通信量。此技术在每个物理服务器上安装代理以发觉到此服务器或来自此服务器的网络通信量,并且将通信量日志发送到中心应用服务器。应用服务器分析这些通信量日志并生成物理服务器之间的应用依赖(applicationdependency)。图1示出通过在每个物理服务器上发觉网络通信量而生成的应用依赖的示例。在该示例中,交换客户端(client)应用通过公知的域名系统(DNS)端口53连接到一个服务器、通过公知的活动目录(AD)端口88、135、1024、389连接到另一服务器、并且通过公知的邮箱端口135连接到另一服务器。可以如图1所示生成交换客户端应用的应用依赖图(dependencymap)。可以如下描述用于应用、进程和线程的术语的背景。应用是在物理机器或虚拟机(VM)上运行的可执行计算机软件。应用可以在操作系统(OS)中创建一个或多个进程。进程是在OS中的运行环境的为了运行用户应用的基本单位。此运行环境分配来自OS的资源并且拥有资源,从而在进程中运行的线程可以共享这些资源。资源可以包括存储器、开放文件的描述符、开放网络连接等等。线程是在计算机系统中执行控制的基本单位。可能存在在进程的运行环境中运行的一个或多个线程。一个应用可以创建许多进程以在物理服务器上提供服务,并且每个进程可以创建共享由此进程占有的资源的一个或多个并行线程。利用每个进程中的一个单线程创建许多进程的应用被称作多进程应用。在一个进程中创建许多并行线程的应用是多线程应用。
发明内容本公开的示范性实施例可以提供用于在一个或多个虚拟机中生成应用级依赖的系统和方法。一个示范性实施例涉及用于在一个或多个虚拟机(VM)中生成应用级依赖的系统。该系统包括在物理机器上运行的应用性能管理(APM)服务器、一个或多个拦截(intercepting)模块以及一个或多个内省(introspecting)模块。APM服务器接受请求并向至少一个转发守护进程(daemon)发送命令以开启所述一个或多个VM的至少一个相关的VM的检查状态,并且生成已选择的应用的应用轨迹并输出用于已选择的应用的应用依赖。每个拦截模块拦截在所述至少一个相关的VM上的处于传输控制协议(TCP)发送和关闭相关的操作中的客户机操作系统(guestOS、或称作虚拟计算机OS)。每个内省模块对于TCP连接和运行线程信息执行VM内省。另一示范性实施例涉及用于在一个或多个虚拟机(VM)中生成应用级依赖的计算机实现的方法。所述方法包括:在提供具有所述一个或多个VM的虚拟环境的一个或多个物理服务器的控制之下;拦截处于所述一个或多个VM的至少一个相关的VM的传输控制协议(TCP)发送和关闭相关的操作中的客户机操作系统(guestOS);对于TCP连接和运行线程信息执行VM内省;以及生成已选择的应用的应用轨迹并从用于已选择的应用的应用轨迹输出应用依赖。从以下利用附图的适当参考提供的详细说明的仔细理解阅读中,本公开的上述和其它特征以及方面将变得更容易理解。图1示出通过在每个物理服务器上发觉网络通信量而生成的应用依赖的示例。图2A示出根据示范性实施例的应用轨迹的示例。图2B示出根据示范性实施例的应用依赖图的示例。图2C示出根据示范性实施例的利用VM信息的应用依赖图的示例。图3A示出根据示范性实施例的、用于在一个或多个虚拟机中生成应用级依赖的系统的不意图。图3B示出根据示范性实施例的示出图3A的系统的详细操作的示范性环境。图4示出根据示范性实施例的、用于在虚拟化环境中生成应用级依赖的数据流的示意图。图5示出根据示范性实施例的三阶段方案的示意图。图6示出根据示范性实施例的、利用用于在虚拟化环境中生成应用级依赖的方法的图5的三个阶段。图7是示出根据示范性实施例的、选择拦截机制的决定的流程图。图8示出根据示范性实施例的、在TCP协议的关闭和发送函数中设置硬件断点的示意图。图9示出根据示范性实施例的、通过在VMM中复制映射SDT表来拦截TCP相关的系统调用的不意图。图10示出根据示范性实施例的、在用于运行线程和TCP连接信息的进程中内省LinuxVM内核的数据结构的示例。图11示出根据示范性实施例的、每线程通信量日志的格式,以及日志在VMM中被生成并由转发守护进程转发到APM服务器。图12示出根据示范性实施例的、在多个客户机(guest)VM之间进行拦截并内省的VMM机制。图13示出根据示范性实施例的、将每线程通信量日志转换为线程间通信量日志并存储在日志数据库中的示例。图14示出根据示范性实施例的生成应用轨迹的示例。图15示出根据示范性实施例的、对于在时间段Ata期间的线程Ta生成应用轨迹的算法的流程图。图16A和图16B示出根据示范性实施例的、示出从应用轨迹生成应用依赖(GAD)的算法的操作流。图17示出根据示范性实施例的、示出在学习阶段中的VDC1700中的增量式使能通信量日志的示例。具体实施例方式本示范性实施例公开了用于在虚拟化环境中使用VM检查来生成应用级依赖的技术。可以通过拦截VM运行和内省VM状态来执行VM检查。该技术拦截处于分组发送系统调用中的客户机OS、执行VM内省以得到运行线程和TCP连接信息、以及向服务器发送此通信量日志。基于线程的通信量日志在应用性能管理(APM)服务器中被进一步转换为线程间通信量日志。从线程间通信量日志可以生成两种输出。一种输出是线程粒度(threadgranuIarity)方面的应用轨迹,另一种输出是来自应用轨迹的精确的应用依赖图。应用轨迹由在它的出现时刻的应用之间的消息交换的列表组成。应用轨迹可以包括由此应用直接发送的消息和由其他应用间接地发送的消息,所述其他应用用于处理由此应用发送的消息。可以以树形数据结构存储应用轨迹。应用轨迹可以包括一个或多个结点、一个或多个链接以及一个或多个箭头。图2A示出根据示范性实施例的应用轨迹的示例。参照图2A,应用轨迹200从浏览器I开始。在该轨迹中的结点指示在一时间段期间对应用的消息交换。例如,结点210指示在开始时间0:01和结束时间4:59的时间段期间对名称为网络服务器I的应用的消息交换。该轨迹中的链接指示两个应用之间的直接的消息交换。例如,在结点210和结点220之间的链接指示在名为网络服务器I的应用和名为负载平衡器的应用之间的直接消息交换。轨迹中的箭头指示从客户端应用到服务器应用的两个应用之间的连接的方向,例如,箭头230指示客户端方(应用服务器1,0:33,4:59)到服务器方(数据库服务器,4:50,4:59)连接。应用轨迹可以帮助管理员找出应用性能的瓶颈。例如,当数据库服务器到应用服务器I的消息响应时间很长时,将间接地影响用户在浏览器I上的运行性能。通过调查轨迹信息,可以发现哪个应用的消息交换的持续时间太长。应用依赖图可以通过图形显示进一步通知管理员哪个依赖关系很慢。应用依赖图记录应用之间的依赖。图2B示出根据示范性实施例的应用依赖图的示例。参照图2B,应用依赖图250从浏览器I开始。在应用依赖图250中,如果应用A已经与应用B进行了数据交换并且A是A到B连接的客户端方,则A依赖B。例如,如果负载平衡器(应用A)已经与应用服务器2(应用B)进行了数据交换,则负载平衡器依赖应用服务器2。应用依赖图等效于轨迹的静态视图。虚拟机或物理机器的信息可以被添加在应用依赖图上以帮助理解应用部署。示范性实施例可以关联VM内核信息以在虚拟化环境中生成应用依赖图。图2C示出在其上具有VM信息的图2B的应用依赖图的示意图。其中虚线块指示虚拟化环境中的VM并且VM可以包括一个或多个成员。例如,网络服务器I和负载平衡器处于相同VM260中并且在该虚拟化环境中存在五个VM。图3A示出根据示范性实施例的、用于在一个或多个虚拟机(VM)中生成应用级依赖的系统的示意图。参照图3A,系统300包括在物理机器310上运行的应用性能管理(APM)服务器330、一个或多个拦截模块和一个或多个内省模块。APM服务器330接受请求322并且向至少一个转发守护进程355发送控制命令330a以开启诸如VMlVMN的一个或多个VM的至少一个相关的VM的检查状态,并且生成已选择的应用的应用轨迹并输出用于已选择的应用的应用依赖。诸如拦截模块374的每个拦截模块拦截在全部相关的VM上处于传输控制协议(TCP)发送和关闭相关的操作中的客户机操作系统(OS)。诸如内省模块372的每个内省模块通过检查客户机OS的运行内核数据结构和得到一个或多个运行线程的进程和线程信息来执行对于TCP连接和运行线程信息的VM内省,并且生成一个或多个每线程通信量日志330b用于经由转发守护进程355发送到APM服务器。拦截模块374和内省模块372在诸如物理服务器I的相应的物理服务器上的诸如VMM370的相应的VM监视器(VMM)中,并且相应的转发守护进程355在相应的物理服务器I上运行。图3B示出根据示范性实施例的示出图3A的系统的详细操作的示范性环境。在该环境中,APM服务器330可以通过图形用户接口(⑶I)320从管理员接收请求322以开始应用依赖生成。请求322可以包含至少一个已选择的应用和相关的虚拟机标识符(vm-1d)列表。已选择的应用是将被识别应用依赖的应用,它可以携带诸如至少一个应用程序名和它的运行VM的VM标识符(vm-1d)之类的信息;相关的vm-1d列表表示与已选择的应用相关的以及使能VM检查所需的VM的列表。在接收请求时,APM服务器向在运行与已选择的应用相关的VM的一个或多个物理服务器上的一个或多个转发守护进程发送控制命令330a。控制命令可以包含开启/关闭检查特征和相应的vm-1d。每个转发守护进程向相应的VMM传递控制命令。对于具有检查状态开启的VM,例如VMM370,VM拦截模块374拦截处于TCP发送和关闭相关函数中的它的运行,并且VM内省模块372检查内核数据结构并得到运行的线程和TCP连接信息。内省模块372为在VM中的每个呼叫TCP相关函数生成一个每线程通信量日志。每线程通信量日志发送给转发守护进程355以向APM服务器330转发每线程通信量330b。通过分析接收的日志,APM服务器330可以通过⑶1320向管理员发送输出324。输出可以包括至少一个应用轨迹和已选择的应用的应用依赖图。VMM370中的VM内核信息376可以包括TCP操作拦截信息和内核对象定义。TCP发送拦截信息是拦截TCP发送和TCP关闭相关操作所需的信息。在实施例中它可以是TCP发送和关闭相关函数的地址或TCP发送关闭相关的系统调用数量。在接收开启检查命令之后,拦截模块374从VM内核信息376载入拦截信息并开始在TCP发送和关闭相关操作中进行拦截。在成功地拦截TCP操作之后,系统300可以在内省模块372中开始执行通信量日志汇集。内省模块372被配置为执行用于线程和TCP连接信息的VM内省。内省模块372可以检查VM的CPU寄存器值,得到运行的线程和处理的套件的内核对象并生成每线程通信量日志。内省模块372可以检查VM的CPU寄存器值,得到运行线程和处理套件的内核对象并生成每线程通信量日志。它从VM内核信息376接收内核对象定义。内核对象定义包括对于进程、线程和套件对象的定义。内省模块372使用内核对象定义来解释线程和套件对象中的值以生成每线程通信量日志。由内省模块372汇集的每个每线程通信量日志可以至少包含诸如时间信息、线程信息、连接信息、方向等的信息。在生成每线程通信量日志之后,内省模块372向转发守护进程355输出每个每线程通信量日志,转发守护进程355向APM服务器330转发每线程通信量日志330b。APM服务器330还可以包括通信量日志转换模块334和依赖图生成模块336。利用每个每线程通信量日志,通信量日志转换模块334通过找到每个每线程通信量日志的目的线程来执行从每线程通信量日志到线程间通信量日志的转换,并且将每个线程间通信量日志存储到日志数据库380。依赖图生成模块336从日志数据库380读取线程间通信量日志。每个线程间通信量日志可以包含诸如时间、发送器/接收器线程信息、方向等的信息。APM服务器310可以使用增量使能模块332来逐渐使能相关的VM的检查状态直到至少一个相关的VM的检查状态被开启。依赖图生成模块336通过生成应用轨迹(GAT)算法从全部线程间通信量日志生成应用轨迹。并且,它通过生成应用依赖(GAD)算法从应用轨迹生成在一时间段期间的精确的应用依赖,并且输出用于已选择的应用的精确的应用依赖。可以以诸如树形数据结构存储应用轨迹。GAD算法可以从应用轨迹并且通过递归调用GAD子例程来生成应用依赖图。图4示出用于生成应用轨迹和依赖的系统300的数据流。管理员将已选择的应用414和相关的vm-1d列表416输入到系统中。拦截模块374从VM内核信息376载入拦截信息412并开始检查相关的VM。当客户机VM被拦截时,内省模块372从VM内核信息载入内核对象定义422、读取客户机VM中的内核对象用于得到线程和TCP连接信息并生成每线程通信量日志330b到通信量日志转换模块334。通信量日志转换模块334将每线程通信量日志330b转换成为线程间通信量日志435并输出到依赖图生成模块336。依赖图生成模块336生成应用轨迹445,然后生成应用依赖447并输出给管理员。在一个实例中,管理员可以不必确切知道已选择的应用的相关的VM,而必须使能VDC中的每个VM的检查状态用于生成应用依赖。示范性实施例使用三阶段方案来找到已选择的应用的相关的VM从而降低生成的通信量日志的数量并降低依赖生成的成本。图5示出根据示范性实施例的三阶段方案的示意图。参照图5,三阶段包括学习阶段510、发现阶段520和生成阶段530。学习阶段510识别与应用相关的VM。在发现阶段520中仅对相关的VM使能VM检查。这将降低需要检查的VM的数量。在学习阶段510中,输入将生成依赖的已选择的应用,并且使用增量式方法来使能相关的VM的检查特征直到没有新的相关的VM被找到。学习阶段510的输出是已选择的应用414和用于该应用的相关的vm-1d列表416,并且该输出还被发送到发现阶段520。根据应用和它的相关vm-1d列表,在发现阶段520中汇集基于线程的通信量日志并且生成线程间通信量日志435。线程间通信量日志435还被发送到生成阶段530。在生成阶段530中,生成应用轨迹445和应用依赖437。因此,根据图4的示范性实施例,利用计算机实现的用于在虚拟化环境中生成应用级依赖的方法的三个阶段可以显示为图6。在图6中,发现阶段520包括拦截610、内省620和通信量日志转换630的步骤。拦截610执行拦截模块374的操作。内省620执行内省模块372的操作。而且,通信量日志转换630执行通信量日志转换模块334的操作。生成阶段530包括依赖图生成640的步骤,并且依赖图生成640执行依赖生成模块336的操作。学习阶段510包括增量式使能650的步骤。增量式使能650通过使用来自通信量日志转换630的线程间通信量日志435来增量式地使能VM通信量日志,并向发现阶段520输出vm-1d列表416。因此,用于在一个或多个虚拟机中生成应用级依赖的计算机实现的方法可以包括拦截610、内省620、通信量日志转换630和依赖图生成640。换句话说,在提供具有所述一个或多个VM的虚拟环境的一个或多个物理服务器的控制之下,计算机实现的方法可以拦截处于一个或多个VM的至少一个相关的VM的传输控制协议(TCP)发送和关闭相关的操作中的客户机操作系统(OS),通过检查客户机OS的运行线程并得到一个或多个运行线程和TCP连接信息来执行用于TCP连接和运行线程信息的VM内省,以及生成一个或多个每线程通信量日志,然后将一个或多个每线程通信量日志转换为一个或多个线程间通信量日志,并从一个或多个线程间通信量日志生成应用轨迹并从应用轨迹输出用于已选择的应用的应用依赖。公开的用于在虚拟化环境中生成应用级依赖的示范性实施例以诸如apachepre-fork模式之类的多进程模型或诸如apacheworker模式之类的多线程模型或两者运行。在一些实施例中,拦截610可以利用通过硬件断点的拦截或拦截TCP相关的系统调用来实现,但不限于这些。图7是示出根据示范性实施例的、选择拦截机制的决定的流程图。在示范性实施例中,选择拦截机制的决定可以取决于由CPU支持的硬件调试寄存器的数量DN和客户机OS中的TCP发送和关闭相关函数的数量。如图7所示,当数量DN大于TCP发送和关闭相关函数的数量时,选择通过硬件断点的拦截,如步骤710所示。当数量DN不大于TCP发送和关闭相关函数的数量时,选择通过TCP相关的系统调用的拦截,该TCP相关的系统调用包括从VM客户机OS复制映射服务描述符表(shadowservicedescriptortable,SDT)表格到VM监视器(VMM)中(步骤720)并且将VM客户机OS中的SDT表格修改以拦截TCP相关的系统调用(步骤722)。图8示出根据示范性实施例的、在TCP协议栈的closeO和send()函数中设置硬件断点的示意图。参照图8,客户机VM800可以在内核模式820中提供诸如系统调用分配(syscalldispatch)821、对象类型分配823和协议类型分配825之类的分配函数。系统调用分配821是基于系统调用数量的分配函数。对象类型分配823是基于诸如套件、文件、proc等的文件描述符对象的文件系统类型的分配函数。协议类型分配825是基于诸如TCP、UDP、MCAST等的套件的协议类型的分配函数。用户应用812在客户机VM800的用户模式810中运行。它可以调用各个系统调用来发送TCP通信量。例如,使用TCP套件文件描述符作为参数的许多系统调用可以发送分组到TCP连接中,诸如sendO、sendtoO、writeO和sendmsgO。这些系统调用全部间接地调用Linux内核TCP协议栈的称作tcp_sendmsg()的内核函数。—个实例可以在此tcp_sendmsg()函数中使能硬件调试断点。当VMM得到由于tcp_sendmsg()函数中的此硬件断点的VM_exit事件时,它成功地拦截TCP发送相关的系统调用并在下一步中开始执行通信量汇集。从而,示范性实施例可以在发送822中断开客户机OS的TCP协议操作以生成发送分组到TCP连接的线程的日志,并且在关闭824中断开客户机OS的TCP协议操作以生成关闭TCP连接的线程的日志。因此,通过硬件断点的拦截可以通过诸如在TCP协议的closeO和sendO函数中设置硬件断点来执行。在本公开中,这些术语“VM”、“客户机VM”或“客户机”用于表示相同的东西。术语“客户机”经常和VMM—起使用来强调这样的事实:许多VM可以在相同的物理服务器上运行并且使用由VMM(像客户机)分配的资源。图9示出根据示范性实施例的、通过在VMM中复制映射SDT表格来拦截TCP相关的系统调用的示意图。其中影子SDT表格被复制到VMM并且客户机OS的SDT表格中的TCP相关的系统调用条目被修改为无效地址。参照图9,当调用系统调用时,客户机VM800跳到在它的SDT表格中指定的无效地址并且生成页错误。页错误造成具有“页错误”作为理由的VM_exit,并且VMM910中的页错误处理器914接收此页错误VM_exit事件并且检查它的错误地址。如果错误地址是在客户机VM的SDT表格中指定的无效地址,则VMM将此VM的程序计数器改变为存储在影子SDT表格912中的地址,从而VM可以继续它的TCP系统调用操作。因此,拦截TCP相关的系统调用可以通过在VMM中复制映射SDT表格并修改诸如VM的SDT中的TCP发送和关闭相关的系统调用处理器来实现。图10和图11举例来示出内省620的详细操作。参照图10,内省参考保留给网络服务器进程1020的内核对象,包括进程对象(task_struct1021)、进程的开放文件描述符表(files_struct1022、fdtable1023、和file[]1024)、文件描述符对象(file1025)和套件对象(socketl026和inet_sock1027)。VMM检查运行的VM的虚拟CPU的堆栈指针寄存器1010,并且利用4096掩盖堆栈指针寄存器的值以获得运行的线程的task_strUCt内核对象1021的地址。VMM利用对内核对象定义的知识来解释task_struct目标1021并且获得当前运行的线程信息。如可以看到的,VMM还可以从拦截的函数的参数列表得到当前处理的TCP连接信息。在Intel处理器的一个实例中,在内核函数调用中通过的参数存储在CPU寄存器中。为了拦截TCP相关函数,当前处理的套件对象1026的地址在它的参数列表中通过。然后可以通过从CPU寄存器读取套件对象并利用内核对象定义解释该套件对象来得到TCP连接信息。为了拦截TCP相关的系统调用,文件描述符数在它的参数列表中通过。然后可以通过在进程中参考文件描述符表(1022、1023和1024)、读取在文件描述符中的套件对象(1026)的地址并利用内核对象定义解释套件对象来得到TCP连接信息。每个VMM通过拦截和内省客户机VM来生成每线程通信量日志。然后生成的每线程通信量日志还被发送给APM服务器。如图11所示,生成的每线程通信量日志可以被发送给在域O上运行的转发守护进程以转发到APM服务器330。每个生成的每线程通信量日至1110可以包含诸如时间信息,线程信息、连接信息、方向(请求或回复)等的信息。图12示出根据示范性实施例的、在多个客户机VM之间进行拦截并内省的VMM机制。参照图12,VMM中的VMM机制可以包括VM_exit处理器1210来处理VM退出事件,页错误处理器1220来处理页面错误vm_eXit事件,调试处理器1230来处理断点vm_eXit事件,VM检查器1240来执行对VM内核对象和通信量日志的内省,VM调度器1250来重新开始VM运行,通信量日志缓存器1260来存储每线程通信量日志,以及包含在VM信息高速缓存1270中的VM内核信息376。VM内核信息包含基于VM的拦截和内省信息,其至少包括检查状态(诸如开启或断开)、拦截的方法(诸如通过硬件中断或影子SDT表格)、TCP发送和关闭相关函数的地址、TCP相关的系统调用的数量、影子SDT表格、以及内核对象定义(诸如线程对象和套件对象的地址偏移)。用于每线程通信量日志1110的信息可以包括时间信息、线程信息(诸如vmid、进程id、应用程序名)、连接信息(诸如源IP、源端口、目的IP、目的端口)和方向(诸如请求,回复)。当VMM机制应用硬件中断方案来在诸如VMl和VM2的多个客户机VM之间拦截和内省时,VMM机制执行两个部分。第一部分是VMl命中TCP发送和关闭相关的断点,第二部分是VMl调度到VM2。在第一部分中,VMl通过硬件断点运行TCP发送函数并触发VM_exit事件。VM_exit处理器1210检查退出理由是“硬件断点”并调用调试处理器1230。调试处理器1230检查断点地址是在TCP发送函数中并调用VM检查器1240来执行内省。VM检查器1240从VM信息高速缓存1270查找内核对象定义并在VMl中的内核对象处执行内省。在内省之后,VM检查器1240得到线程和TCP连接信息,生成一个每线程通信量日志,并将它存储在通信量日志缓冲器1260中。然后VM调度器1250重新开始VMl的运行。在第二部分中,由于VMl的时间片到期,因此VMl退出,并且由于VM重新调度,所以VMl生成VM_exit事件。调度器1250存将运行的VM(VMl)的上下文储到存储器中并且从存储器载入下一VM(VM2)的上下文。因为对于VMl和VM2,TCP发送相关函数的检查状态和地址可能不相同,所以在切换到下一VM以前还执行载入检查状态和配置硬件断点。VM调度器1250从VM内核信息1270读取下一VM的检查状态。如果下一VM(VM2)的检查状态是开启并且所述拦截的方法是通过硬件中断(诸如I)进行,则VM检查器1240从VM信息高速缓存1270读取TCP发送相关的地址并且设置硬件调试寄存器。当VMM机制应用影子SDT表格方案来在诸如VMl和VM2的多个客户机VM之间拦截和内省时,VMM机制执行两个部分。第一部分是VMl调用TCP发送相关的系统调用,并且第二部分是VMl调度到VM2。在第一部分中,VMl调用TCP发送相关的系统调用并通过页错误触发VM_exit事件。VM_exit处理器1210检查退出理由是“页错误”并调用页错误处理器1220。页错误处理器检查错误地址是在SDT表格中指定的地址,并调用VM检查器1240。VM检查器1240从VM信息高速缓存1270查找内核对象定义并在VMl中的内核对象中执行内省。在内省以后,VM检查器1240得到线程和TCP连接信息并生成一个每线程通信量日志并将它存储到通信量日志缓存器1260。VM检查器1240还通过查找存储在VM信息高速缓存1270中的影子SDT表格来设置虚拟CPU的指令指针寄存器以校正系统调用函数的地址。然后VM调度器1250重新开始VMl的运行。在第二部分中,由于用于此VM的时间片到期,所以VMl退出,并且由于VM重新调度,所以VMl生成VM_exit事件。调度器1250将运行的VM(VMl)的上下文存储到存储器中并且载入下一VM(VM2)的上下文。VM调度器1250还从VM内核信息1270读取检查状态。如果VM2的检查状态是开启,则所述方法是通过影子SDT表格(诸如2)拦截并且它的影子SDT表格不存在,VM检查器从下一VM(VM2)复制一个映射SDT表格并且将VM2的SDT表格中的TCP相关的系统调用条目修改为无效地址。VM调度器1250重新开始VM2的运行。在拦截610并内省620之后,APM服务器1120中的每线程通信量日志将被转换为线程间通信量日志。图13示出根据示范性实施例的、将每线程通信量日志转换为线程间通信量日志的示例。APM服务器1120通过找到每个每线程通信量日志的目的线程将每个每线程通信量日志转换成为相应的进程间通信量日志。如图13的示例所示,每个基于每线程的通信量日志被转换成进程间通信量日志。例如,两个基于每线程的通信量日志(1310和1320)表示通过相同的TCP连接c发送给彼此的两个线程TA和TB。所述两个每线程通信量日志被转换为两个线程间通信量日志(1330和1340)。由时间(tl)、线程信息(TA)、连接(Cl)和方向(请求)组成的每线程通信量日志1310被转换为由时间(tl)、发送器线程信息(TA)、接收器线程信息(TB)和方向(请求)组成的线程间通信量日志(1330)。类似地,由时间(t5)、线程信息(TB)、连接(Cl)和方向(回复)组成的每线程通信量日志1320被转换为由时间(t5)、发送器线程信息(TB)、接收器线程信息(TA)和方向(回复)组成的线程间通信量日志(1340)。线程间通信量日志可以存储在APM服务器的数据库中。因为生成的通信量日志记录线程之间的消息交换,所以应用程序生成依赖生成算法可以使用线程间消息交换信息以生成用于在多进程和多线程模型中运行的两种应用的100%精确的应用依赖图。根据示范性实施例用于由线程间通信量日志生成轨迹的设计是使用递归算法来找出在一时间段期间在线程之间的全部间接消息交换。图14示出根据示范性实施例的生成应用轨迹的示例。参照图14,应用轨迹从线程A开始并且分别在时间段Atl和时间段At2期间与线程B和线程C进行消息交换。线程B分别在时间段Atll、时间段Atl2和时间段Λtl3期间与线程D、E和F进行消息交换。在时间段Λta期间的应用A的轨迹由标记TRA(A,Ata)表示,并且还可以通过如下递归算法扩展。TRA(A,Ata)={φ,Atl),Μφ,Δtl),(C,Δt2),IM(C,Δt2)}⑴={(B,Δtl),{(D,Λtil),(E,Δtl2),(F,Δtl3)},(C,Δt2),m(C,Δt2)}⑵={(B,Atl),{(D,Atll),(E,Atl2),(F,Atl3)},(C,Δt2),{(G,At21),(H,At22)}}(3)等式⑴意味着在时间段Ata期间应用(或线程)A的轨迹等效于在时间段Atl期间与B的消息交换(由(B,Atl)表示)加上在时间段Atl期间的线程B的轨迹(由TRA(B,Atl)表示),以及在时间段At2期间与线程C的消息交换(由(C,△t2)表示)加上在时间段Λt2期间线程C的轨迹(由TRA(C,At2)表示)。还可以通过扩展线程B的轨迹来得到等式(2)。还可以通过扩展线程C的轨迹来得到等式(3)。在等式(3)中,在Ata期间应用A的轨迹是与应用(或线程)B,D、E、F、C、G和H的消息交换。应用(或线程)B和C直接与应用A连接。应用(或线程)D、E、F、G和H间接地与应用A连接。图15示出根据示范性实施例的、在时间段Ata期间对于线程Ta的生成应用轨迹(GAT)的算法的流程图。GAT算法的输出是以树形数据结构存储的应用轨迹。参照图15,算法GAT(Ta,Ata)从初始化开始,包括设置应用轨迹为空树(即结果={}),当前依赖线程为空(即current-dep-thread=null),并且At的开始时间为时间段Ata的开始时间(即At的开始时间=Ata的开始时间),如步骤1510所示。然后算法GAT(Ta,Ata)找到在Ata期间与线程Ta相关的下一通信量日志(步骤1515)。当没有找到与线程Ta相关的下一线程通信量日志时,算法GAT(Ta,Ata)返回结果。当找到这种下一通信量日志时,算法GAT(Ta,Δta)更新先前的线程通信量日志和当前线程通信量(即previous-log=cur-log,current-log=foundlog),并且设置线程Tb为当前日志的远程线程(即Tb=current-log的远程线程),如步骤1520所示。当线程Tb不是current-dep-thread(步骤1522)或current-log是在Δta期间的最后一个条目时(步骤1524),算法GAT(Ta,Ata)执行动作并返回到步骤1515;否则,它直接返回到步骤1515。其中所述动作包括设置Δt的结束时间为previous-log的时间(步骤1530)、追加一个轨迹项(current-dep-thread,At)作为结果树的子节点(即result+=(current-dep-thread,Δt))(步骤1532)、递归调用GAT算法来生成在Δt期间的用于current-dep-thread的应用轨迹树以及添加生成的树作为结果树的子树(即result+=GAT(current-dep-thread,Δt))(步骤1534)、以及设置current-dep-thread为Tb并且设置Δt的开始时间为current-log的时间(即current-dep-thread=Tb和At的开始时间=current-log的时间)(步骤1536)。结果,算法GAT(Ta,Δta)以树形数据结构输出应用轨迹“result”。图16A和图16B示出根据示范性实施例的、示出从树形数据结构的应用轨迹生成图形数据结构的应用依赖(GAD)的算法的操作流。参照图16A,GAD算法从初始化开始,包括设置应用依赖图为空图(即result=空图),并且设置根节点为轨迹树的根(即rnode=轨迹树的根),如步骤1610所示。然后,GAD算法通过递归调用函数GAD来生成应用依赖图(即result)(步骤1615)。图16B示出根据示范性实施例的、示出函数GAD(rnode,result)的操作的流程图。参照图16B,函数GAD(rnode,result)具有两个参数。一个是模式而另一个是结果。模式参数是在树形数据结构中的结点,表示应用轨迹中的子树。结果参数是存储在递归调用GAD函数期间生成的应用依赖图的图形数据结构。GAD函数从得到轨迹中的根节点的下一孩子开始,即c=得到rnode的下一孩子(步骤1620)。如果没有找到rnode的这样的孩子,则去到步骤1625。如果找到rnode的这样的孩子,则去到步骤1621。如果结点c包括在结果图形数据结构中(步骤1621),则添加结点c到结果图形中(步骤1622)。因为现在rnode和c两个都在结果图形数据结构中,所以如果从rnode到c的链接包括在结果图形数据结构中,则将link(rnode,c)添加到结果图形数据结构中(步骤1626)。在步骤1628中,利用(c,result)作为两个新的参数递归调用GAD函数以生成其余的依赖。如可以从图16A和图16B看到的,通过从应用轨迹生成应用依赖图来执行GAD算法,并且递归调用GAD函数直到没有rnode的下一孩子被找到。换句话说,应用依赖性演算法是使用递归方法来找出在时间段期间与已选择的应用相关的全部间接依赖线程。GAD算法的输出是应用依赖图。可以以图形数据结构表示依赖图。生成的依赖图可以诸如在图形用户接口(⑶I)上显示以帮助诸如管理员理解软件部署、定位失败线程、定位性能瓶颈等。还可以分析生成的依赖图以自动找出分布式应用中的性能问题的根本原因。如前所述,示范性实施例使用三阶段方案来降低通信量日志汇集和依赖生成的成本。用于依赖和汇集的成本可以包括诸如通过VMM检查TCP操作、向APM服务器发送日志条目、将日志条目存储到APM服务器的日志数据库中等。用于通过VMM检查TCP操作的成本可以包括诸如从VM到VMM的上下文切换、执行内核对象中的内省、上下文切换到重新开始原始VM运行等。用于将日志条目发送到APM服务器可以包括诸如VMM通过信道将日志条目发送到域O中的转发守护进程、以及转发守护进程通过TCP连接将日志条目发送到APM服务器等。在学习阶段中,增量式使能650的步骤识别与已选择的应用414相关的VM以生成依赖。换句话说,仅相关的VM被选择并且在下一阶段中被使能VM检查,从而降低需要检查的VM的数量。示范性实施例使用增量式的使能650来使能相关的VM的检查特征直到没有新的相关的VM被找到。如在图6中提到的,增量式使能650通过使用来自通信量日志转换630的线程间通信量日志435来增量式地使能VM通信量日志,并输出相关的vm-1d列表416到拦截610。图17示出根据示范性实施例的、示出在学习阶段中的VDC1700中的增量式使能通信量日志的示例。在图17的示例中,最初,VM1710中的应用(浏览器I)被选择来生成依赖,并且开始学习阶段。在第一次使能中,识别包含应用DNS(应用浏览器I的依赖者)的VM1720。在第二次使能中,识别包含应用网络服务器I(应用浏览器I的依赖者)的VM1730。在第三次使能中,识别包含应用网络应用I的VM1740和包含应用网络应用2(应用网络服务器I的依赖者)的VM1760。在第4次使能中,识别包含应用数据库服务器(应用网络应用I的依赖者)的VM1750。因此,在学习阶段之后输出的相关的VM-1d列表可以包括VM1710,VM1720、VM1730、VM1740,VM1750和VM1760。因此,仅相关的VM被选择并使能用于下一阶段(发现阶段)的VM检查。发现阶段可以再次开始应用(浏览器I)并将通信量记记录到APM服务器中。而且,在生成阶段,APM服务器可以运行依赖生成算法并经由⑶I输出应用轨迹和依赖1770到诸如管理系统或根源分析模块。从而,本示范性实施例提供了在虚拟化环境中调查线程级别以生成应用级依赖的技术。该技术采用VM内省方法而不安装额外的软件或执行诸如端口轮询活动。它在系统调用中进行拦截并快速检测部署改变。它还以线程间级别记录通信量并以线程粒度生成应用轨迹。从应用轨迹,它通过依赖生成算法生成十分精确的应用依赖。该技术对于多进程和多线程应用两者运行。虽然已经参照示范性实施例描述了本公开,但是应该理解本发明不限于此处描述的细节。在上述说明中已经暗示各替换和修改,并且其它将由本领域普通技术人员想到。因此,所有这种替换和修改都旨在包含在如附加的权利要求中定义的本发明的范围内。权利要求1.一种用于在一个或多个虚拟机(VM)中生成应用级依赖的系统,包括:应用性能管理(APM)服务器,在物理机器上运行,用于接受请求并向至少一个转发守护进程发送命令以开启所述一个或多个VM的至少一个相关的VM的检查状态,并且生成已选择的应用的应用轨迹并输出用于所述已选择的应用的应用依赖;一个或多个拦截模块,其中每个拦截模块拦截在所述至少一个相关的VM上的处于传输控制协议(TCP)发送和关闭相关的操作中的客户机操作系统(OS);以及一个或多个内省模块,其中每个内省模块对于TCP连接和运行的线程信息执行VM内省。2.如权利要求1所述的系统,其中所述每个内省模块通过检查客户机OS的运行的内核数据结构并得到一个或多个运行的线程和TCP连接信息,并且生成一个或多个每线程通信量日志以用于经由所述转发守护进程发送给所述APM服务器,来执行所述VM内省。3.如权利要求1所述的系统,其中所述每个拦截模块和所述每个内省模块两个都在相应的物理服务器上的相应VM监视器中,并且所述至少一个转发守护进程的相应的转发守护进程在所述相应的物理服务器上运行。4.如权利要求1所述的系统,其中所述APM服务器还包括:通信量日志转换模块,用于将一个或多个每线程通信量日志转换为一个或多个线程间通信量日志;以及依赖图生成模块,用于从所述一个或多个线程间通信量日志生成所述应用轨迹并从应用轨迹输出用于已选择的应用的应用依赖。5.如权利要求4所述的系统,所述系统使用日志数据库以存储所述一个或多个线程间通信量日志。6.如权利要求1所述的系统,其中所述一个或多个每线程通信量日志中的每一个包含时间信息、线程信息、连接信息和方向。7.如权利要求4所述的系统,其中所述一个或多个线程间通信量日志中的每一个包含时间信息、发送器线程信息、接收器线程信息和方向。8.如权利要求1所述的系统,其中所述应用轨迹记录从一个应用开始的多个应用之间的消息交换和时间段。9.如权利要求1所述的系统,其中所述应用轨迹以树形数据结构存储,所述树形数据结构从根节点开始,并且包括一个或多个结点、一个或多个链接和一个或多个箭头,在应用轨迹中的结点指示在一时间段期间到应用的消息交换,在应用轨迹中的链接指示两个应用之间的直接消息交换,在所述轨迹中的箭头指示两个应用之间的连接的方向。10.如权利要求1所述的系统,其中所述应用依赖是以树形数据结构表示的应用依赖图。11.如权利要求1所述的系统,其中所述APM服务器使用增量启动模块来逐渐使能相关的VM的检查状态直到至少一个相关的VM的检查状态被开启。12.一种用于在一个或多个虚拟机(VM)中生成应用级依赖的计算机实现的方法,包括:在提供具有所述一个或多个VM的虚拟环境的一个或多个物理服务器的控制之下;拦截处于所述一个或多个VM的至少一个相关的VM的传输控制协议(TCP)发送和关闭相关的操作中的客户机操作系统(OS);对于TCP连接和运行的线程信息执行VM内省;以及生成已选择的应用的应用轨迹并从应用轨迹输出用于已选择的应用的应用依赖。13.如权利要求12所述的计算机实现的方法,还包括:通过检查客户机OS的运行的线程并得到一个或多个运行的线程和TCP连接信息以及生成一个或多个每线程通信量日志来执行所述VM内省。14.如权利要求13所述的计算机实现的方法,还包括:将所述一个或多个每线程通信量日志转换为一个或多个线程间通信量日志。15.如权利要求14所述的计算机实现的方法,还包括学习阶段、发现阶段和生成阶段以生成应用级依赖。16.如权利要求15所述的计算机实现的方法,还包括,在所述学习阶段,使用增量方法来识别与已选择的应用相关的至少一个VM,以及生成相关的虚拟机标识符列表并提供给发现阶段。17.如权利要求15所述的计算机实现的方法,还包括,在所述发现阶段,汇集所述一个或多个每线程通信量日志、生成所述一个或多个线程间通信量并提供给生成阶段。18.如权利要求15所述的计算机实现的方法,还包括,在生成阶段,生成应用轨迹并通过应用一应用依赖算法来从应用轨迹生成应用依赖图。19.如权利要求18所述的计算机实现的方法,还包括:通过应用依赖算法使用递归方法来找出在一时间段期间与已选择的应用相关的全部间接依赖线程。20.如权利要求13所述的计算机实现的方法,其中所述一个或多个每线程通信量日志中的每一个包括时间信息、线程信息、连接信息和方向。21.如权利要求14所述的计算机实现的方法,其中所述一个或多个线程间通信量日志中的每一个包括时间信息、发送器线程信息、接收器线程信息和方向。22.如权利要求12所述的计算机实现的方法,还包括通过硬件断点或通过拦截TCP相关的系统调用来实现所述拦截。23.如权利要求12所述的计算机实现的方法,还包括在多进程模型中运行。24.如权利要求12所述的计算机实现的方法,还包括在多线程模型中运行。25.如权利要求22所述的计算机实现的方法,其中选择拦截机制的决定取决于由中央处理单元(CPU)支持的硬件调试寄存器的数量和TCP发送和关闭相关函数的数量。26.如权利要求25所述的计算机实现的方法,其中当由CPU支持的硬件调试寄存器的数量大于TCP发送和关闭相关函数的数量时,选择通过硬件断点的拦截。27.如权利要求25所述的计算机实现的方法,其中当由CPU支持的硬件调试寄存器的数量不大于TCP发送和关闭相关函数的数量时,选择拦截TCP相关的系统调用,其中拦截TCP相关的系统调用包括:在VM监视器中复制映射服务描述符表格(SDT)并且修改SDT表格以拦截TCP相关的系统调用。全文摘要一种在一个或多个虚拟机(VM)中生成应用级依赖的技术。VM监视器中的拦截模块拦截处于TCP发送和关闭相关的操作中的客户机操作系统(OS)。VM监视器中的内省模块通过检查运行的线程和处理套件内核对象来对于TCP连接和线程信息执行VM内省。它产生应用轨迹并从该应用轨迹输出用于已选择的应用的应用依赖。文档编号H04L29/08GK103164288SQ201110451868公开日2013年6月19日申请日期2011年12月29日优先权日2011年12月15日发明者阙志克,林浩澄申请人:财团法人工业技术研究院
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1