sigmetrics14-Non-intrusive, Out-of-band and Out-of-the-box Systems Monitoring in the Cloud

通过利用VMI技术,抓取目标VM的内存和磁盘信息,实现non-intrusive的监测。

通过利用和扩展虚拟机自省技术,实现non-intrusive。 NFM以带外方式从客户的上下文中抓取虚拟机的内存和磁盘状态,以收集系统状态,然后反馈给分析后端。 通过将监控和分析与目标系统上下文解耦,NFM提供了 "永远在线 "的监控,即使在目标系统没有反应的情况下。 NFM还可以为任何云实例 "开箱即用",因为它不需要在被监控系统中安装和维护代理或钩子。

两个问题

  • 我们如何才能在不依赖客人合作或虚拟机内钩子的情况下执行IT操作(monitoring、compliance等)?
  • 我们怎样才能在系统变得无反应或被破坏时监测和管理它们?

Design

从架构上看,分成一个introspection的前端和一个analytics的后端。 前端在传统的VMI方法的基础上开发了自省技术。 后端会触发虚拟机自省,并通过Crawl APIs访问暴露的虚拟机状态。

在第一次抓取一个虚拟机之前,会访问且只访问一次虚拟机的磁盘状态,以提取关于虚拟机操作系统配置的少量信息。 Crawl Logic使用这些信息来访问和解析原始的虚拟机内存,以创建一个结构化的、符合逻辑的实时虚拟机状态视图。

缺点

NFM的一个限制是其依赖VMI来抓取虚拟机内存状态的副产品,这涉及到解释内存中的内核数据结构。 这些数据结构在不同的操作系统版本中可能会有所不同,而且对于专有的操作系统来说,没有公开的文档。

另外,由于NFM关注的是操作系统级别的系统视图。 应用级别(例如,MapReduce工作者的健康状况)或架构(例如,硬件计数器)的状态不能通过NFM立即观察到,除非由客户操作系统公开。 虽然,管理程序可能允许从外部测量客体的某些架构状态(例如,性能计数器)。

Implementation

Exposing VM State

大多数管理程序提供了不同的方法来获得客户虚拟机内存的视图。 VMWare提供VMSafe APIs来访问客户内存。 Xen通过其Xen控制库(libxc)提供用户空间路由(xc_map_foreign_range),将客户虚拟机的内存重新映射为特权虚拟机。 我们使用这种技术来获得虚拟机内存的实时只读处理。 KVM并没有默认的实时内存句柄的支持。 因此,对于KVM,我们开发了一种替代性的解决方案。 由于KVM是标准Linux环境的一部分,我们利用Linux的内存管理基元,通过QEMU进程的/proc//mem伪文件访问虚拟机内存。 该文件由来自/proc//maps的虚拟地址空间支持虚拟机内存的索引。

磁盘也类似。

在这两个原型(KVM、Xen)中,获得的原始虚拟机内存和磁盘的外部视图被包装起来,并作为网络连接设备(FUSE over iSCSI)暴露给后台的Crawl Logic,通过普通内存和磁盘抓取API。

还解决了两个问题:降低延迟,增加稳定性(我们不期望客体操作系统在从客体环境之外提取其实时运行状态时处于某种稳定状态)。

Exploiting VM State

关键的挑战是如何弥合前述的原始虚拟机内存状态和逻辑OS级虚拟机内部视图之间的固有语义差距。

传统的虚拟机内方法只是利用客户操作系统的上下文来提取系统信息,如/proc树上的进程信息。

我们的 "抓取逻辑 "通过将字节级内存视图转化为结构化的运行时虚拟机状态来实现相同的功能。 虚拟机运行时的信息被分配到几个内存内核数据结构中,用于进程(task_struct)、内存映射(mm_struct)、打开的文件(files_struct)和网络信息(net_devices)等。 我们将这些结构模板覆盖在暴露的内存上,并遍历它们以读取持有相关信息的各种结构字段。为了正确映射这些数据结构,我们从虚拟机磁盘镜像和/或内核库中提取三个重要信息。

  1. 版本、架构和地图参数。从虚拟机内核日志中,我们提取运行中的内核版本和目标虚拟机架构(32位与64位),以便正确确定数据结构的大小。同时读取BIOS RAM地图,以确定要映射的虚拟机内存量以及虚拟机内存区域的大小和布局。
  2. 结构的起始地址。为了确定各种内核结构的起始地址,如初始任务(init_task)、模块列表(modules)和内核页表(init_level4_pgt),我们读取客户内核的System.map文件,其中包括这些结构的内核导出广告。
  3. 字段偏移量。在确定了内核结构的入口点后,我们计算出这些结构中相关字段的偏移量。我们使用内核源(或vmlinux构建镜像)和构建配置来确定所需字段的偏移量。

给定一个实时的虚拟机内存句柄和上述信息,Crawl Logic的整个内存抓取过程可以总结为

  1. 读取一个内核导出的地址(X),比如初始进程的地址(符号init_task)。
  2. 将相关的数据结构模板(struct task_struct)映射到地址X的内存区域。
  3. 在将其相对偏移量添加到起始地址X后,读取相关结构成员字段。
  4. 通过链表遍历(prev, next成员字段,连同偏移量算术)读取其地址,继续下一个对象。

除了内核结构遍历之外,我们还遍历了per-process page tables inside the extracted memory view,以翻译客户进程地址空间中的虚拟地址。

在对所有相关的数据结构进行introspecting后,抓取逻辑为被抓取的虚拟机创建一个单一的结构化文档(框架)。 这个抓取文件捕获了关于虚拟机状态的丰富信息,云监控和分析应用可以在此基础上进行。 我们目前的框架格式涵盖了各种虚拟机特征,包括系统、CPU、内存和进程信息、模块、地址图-ping、开放文件、网络信息和运行时资源使用。 这个虚拟机框架,连同其相应的时间戳和虚拟机ID,然后被加载到下一节描述的框架数据存储中。

剩下还有一部分内容,就没有仔细看了。