XEN、VMware ESXi、Hyper-V以及KVM架构解析

文章系转载,便于整理和分类,原文地址:https://cloud.tencent.com/developer/article/1041633

XEN 有简化虚拟模式,不需要设备驱动,能够保证每个虚拟用户系统相互独立,依赖于 service domains 来完成一些功能; Vmware ESXI 与 XEN 比较类似,包含设备驱动以及管理栈等基本要素,硬件支持依赖于 VMware 创建的驱动; Hyper-V 是基于 XEN 管理栈的修改; KVM 与 XEN 方式不同,KVM 是以 Linux 内核作为管理工具。

虚拟机的体系结构

1. XEN 体系结构

XEN 体系结构图如下:

Xen是一个开放源代码虚拟机监视器,由剑桥大学开发。Xen的缺点是操作系统必须进行显式地修改(“移植”)以在Xen上运行(但是提供对用户应用的兼容性),所以比较麻烦。使得Xen无需特殊硬件支持,就能达到高性能的虚拟化。Linux的官方内核在较早之前已经去掉了对Xen的支持。

一个 XEN 虚拟机环境主要由以下几部分组成:

XEN Hypervisor; Domain 0 —— Domain Management and Control(XEN DM&C); Domain U Guest(Dom U) PV Guest HVM Guest

Xen 三部分组成之间关系图

XEN Hypervisor :XENHypervisor 是介于操作系统和硬件之间的一个软件描述层。它负责在各个虚拟机之间进行 CPU 调度和内存分配。XEN Hypervisor 不仅抽象出虚拟机的硬件,同时还控制着各个虚拟机的执行。XEN Hypervisor 不会处理网络、存储设备、视频以及其他 I/O。

Domain 0:Domain 0 是一个修改过的 Linux kernel,是唯一运行在 Xen Hypervisor 之上的虚拟机,它拥有访问物理 I/O 资源的权限,同时和系统上运行的其他虚拟机进行交互。Domain 0 需要在其它 Domain 启动之前启动。

Domain U:运行在 Xen Hypervisor 上的所有半虚拟化(paravirtualized)虚拟机被称为“Domain U PV Guests”,其上运行着被修改过内核的操作系统,如 Linux、Solaris、FreeBSD 等其它 UNIX 操作系统。所有的全虚拟化虚拟机被称为“Domain U HVM Guests”,其上运行着不用修改内核的操作系统,如 Windows 等。

2. Hyper-V 体系结构

Hyper-V 体系结构图如下:

Hyper-V 是微软提出的一种系统管理程序虚拟化技术,采用微内核的架构,兼顾了安全性和性能的要求。Hyper-V 底层的 Hypervisor 运行在最高的特权级别下,微软将其称为 ring -1(而 Intel 则将其称为 root mode),而虚机的 OS 内核和驱动运行在 ring 0,应用程序运行在 ring 3 下,这种架构就不需要采用复杂的 BT(二进制特权指令翻译)技术,可以进一步提高安全性。从架构上讲 Hyper-V 只有“硬件-Hyper-V-虚拟机”三层,本身非常小巧,代码简单,且不包含任何第三方驱动,所以安全可靠、执行效率高,能充分利用硬件资源,使虚拟机系统性能更接近真实系统性能。

Hyper-V 支持分区层面的隔离。分区是逻辑隔离单位,受虚拟机监控程序支持,并且操作系统在其中执行。Microsoft 虚拟机监控程序必须至少有一个父 / 根分区,用于运行 64 位版本的 Windows Server 2008 操作系统。虚拟化堆栈在父分区中运行,并且可以直接访问硬件设备。随后,根分区会创建子分区用于承载来宾操作系统。根分区使用虚拟化调用应用程序编程接口 (API) 来创建子分区。

分区对物理处理器没有访问权限,也不能处理处理器中断。相反,它们具有处理器的虚拟视图,并运行于每个来宾分区专用的虚拟内存地址区域。虚拟机监控程序负责处理处理器中断,并将其重定向到相应的分区。Hyper-V 还可以通过输入输出内存管理单元 (IOMMU) 利用硬件加速来加快各个来宾虚拟地址空间相互之间的地址转换。IOMMU 独立于 CPU 使用的内存管理硬件运行,并用于将物理内存地址重新映射到子分区使用的地址。从系统的结构图,我们可以看出来 Hyper-V 与 Xen 的架构很相似。

3. Vmware ESXI 体系结构

Vmware ESXI 体系结构图如下:

VMWare (Virtual Machine ware)是一个“虚拟PC”软件公司。它的产品可以使你在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。与“多启动”系统相比,VMWare采用了完全不同的概念。多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。VMWare是真正“同时”运行,多个操作系统在主系统的平台上,就象标准Windows应用程序那样切换。而且每个操作系统你都可以进行虚拟的分区、配置而不影响真实硬盘的数据,你甚至可以通过网卡将几台虚拟机用网卡连接为一个局域网,极其方便。安装在VMware操作系统性能上比直接安装在硬盘上的系统低不少,因此,比较适合学习和测试。

由上图我们可以看出来管理工具也是直接嵌入到了 ESXi vmKernel 中,没有再分化出单独的管理工具,这一点与 Xen 是相区别的。

4. KVM 体系结构

KVM 体系结构图如下:

KVM 是一个独特的管理程序,通过将 KVM 作为一个内核模块实现,在虚拟环境下 Linux 内核集成管理程序将其作为一个可加载的模块可以简化管理和提升性能。在这种模式下,每个虚拟机都是一个常规的 Linux 进程,通过 Linux 调度程序进行调度。

KVM是指基于Linux内核(Kernel-based)的虚拟机(Virtual Machine)。KVM最大的好处就在于它是与Linux内核集成的,所以速度很快。KVM的宿主操作系统必须是Linux,支持的客户机操作系统包括Linux、Windows、Solaris和BSD,运行在支持虚拟化扩展的x86和x86_64硬件架构上,这意味着KVM不能运行在老式CPU上,新CPU如果不支持虚拟化扩展也不能运行(如英特尔的Atom处理器)。

KVM、Xen、VMWare的对比

通过以上四种虚拟机的体系结构图,我们可以看出他们在整个系统中的位置,以及相互之间的区别。

<think>我们讨论的是在非Hyper-V环境中获取CPU Ready值的方法。CPU Ready是虚拟化环境中的性能指标,表示虚拟机等待物理CPU资源的时间比例。在Hyper-V中,我们可以通过性能计数器直接获取,但在非Hyper-V环境(如VMwareKVM等)中,我们需要使用其他方法。 根据引用[1],Hyper-V环境中要求安装Hyper-V角色和管理工具,并且有特定的性能计数器。但用户询问的是非Hyper-V环境,因此我们需要寻找替代方案。 在VMware环境中,我们可以通过以下方式获取: 1. 使用vSphere客户端或ESXi主机上的性能图表查看。 2. 使用PowerCLI(VMware的PowerShell模块)来获取性能数据。 3. 在虚拟机内部,可以通过读取VMware提供的虚拟硬件性能计数器(如果有的话)。 然而,在虚拟机内部直接获取CPU Ready值通常不是标准做法,因为该指标是由Hypervisor提供的。在VMware环境中,更常见的做法是在ESXi主机上收集性能数据。 但是,如果用户需要在虚拟机内部获取,我们可以尝试以下方法: - 对于VMware虚拟机,可以安装VMware Tools,它提供了一些性能计数器。在Windows虚拟机中,我们可以使用以下性能计数器: - `\VMware CPU\Ready Time (%)`:表示CPU Ready时间百分比。 我们可以通过PowerShell的`Get-Counter`命令来读取这个计数器。 - 对于KVM虚拟机,通常没有直接的性能计数器。但我们可以通过读取/proc文件系统的信息来估算。在Linux虚拟机中,我们可以使用`perf`或`kvm_stat`等工具,但在Windows虚拟机中,这种方法不可行。 因此,针对Windows虚拟机在非Hyper-V环境(如VMware)中的解决方案: ### 1. 确认VMware Tools已安装 确保VMware Tools已安装,因为它提供了性能计数器。 ### 2. 使用PowerShell脚本读取VMware性能计数器 修改之前的脚本,使用VMware提供的性能计数器: ```powershell # 定义输出文件路径 $outputPath = "C:\Monitoring\system_metrics.csv" # 创建监控目录(如果不存在) if (-not (Test-Path $outputPath)) { New-Item -Path (Split-Path $outputPath) -ItemType Directory -Force | Out-Null "Timestamp,CPU_Ready_Percent,CPU_Usage(%),Memory_Usage(%)" | Out-File $outputPath -Encoding UTF8 } # 获取当前时间戳 $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" # 1. 获取CPU Ready值(通过VMware性能计数器) # 注意:计数器名称可能略有不同,请根据实际环境调整 $cpuReady = (Get-Counter -Counter "\VMware CPU\Ready Time (%)" -ErrorAction SilentlyContinue).CounterSamples.CookedValue if (-not $cpuReady) { # 如果获取失败,则设置为0或空 $cpuReady = 0 } # 2. 获取CPU使用率 $cpuUsage = (Get-Counter -Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue # 3. 获取内存使用率 $memoryUsage = (Get-Counter -Counter "\Memory\% Committed Bytes In Use").CounterSamples.CookedValue # 写入CSV文件 "$timestamp,$cpuReady,$cpuUsage,$memoryUsage" | Out-File $outputPath -Encoding UTF8 -Append ``` ### 3. 设置任务计划(同上) 设置任务计划每5分钟执行一次此脚本。 ### 4. 验证计数器是否存在 在运行脚本之前,可以通过以下命令检查计数器是否存在: ```powershell Get-Counter -ListSet "VMware CPU" ``` 如果返回计数器集,则说明VMware Tools已正确安装并提供了该性能计数器。 ### 5. 对于其他虚拟化平台 - **VirtualBox**:VirtualBox没有提供类似的性能计数器。因此,在VirtualBox中无法通过虚拟机内部获取CPU Ready值。 - **KVM**:在KVM中,通常需要在宿主机上使用`libvirt`工具来获取虚拟机的CPU Ready值。 ### 注意事项 1. **权限问题**:运行脚本的账户需要有读取性能计数器的权限。 2. **计数器名称**:不同版本的VMware Tools可能提供不同的性能计数器名称,请根据实际情况调整。 3. **异常处理**:在脚本中添加异常处理,避免因计数器不存在而中断。 ### 添加异常处理 我们可以增强脚本的健壮性,例如: ```powershell try { $cpuReady = (Get-Counter -Counter "\VMware CPU\Ready Time (%)" -ErrorAction Stop).CounterSamples.CookedValue } catch { $cpuReady = 0 # 记录错误日志 "Error reading VMware CPU Ready counter: $_" | Out-File "C:\Monitoring\error.log" -Append } ``` ### 非VMware环境怎么办? 如果用户的环境不是VMware,而是其他虚拟化平台,并且无法通过虚拟机内部获取CPU Ready值,那么建议在宿主机上监控该指标,然后通过其他方式(如API)将数据传递到虚拟机内部,或者直接在宿主机上使用Zabbix Agent进行监控。 ### 总结 在非Hyper-V环境中,获取CPU Ready值的方法取决于虚拟化平台: - **VMware**:通过VMware Tools提供的性能计数器`\VMware CPU\Ready Time (%)`获取。 - **其他平台(如KVMXen)**:通常无法在虚拟机内部直接获取,需要在宿主机上监控。 因此,用户需要先确认自己的虚拟化平台,然后选择合适的方法。 ### 相关问题 1. 如何在VMware ESXi主机上监控虚拟机的CPU Ready值? 2. 如何在KVM宿主机上获取虚拟机的CPU Ready值? 3. 当虚拟机内部无法获取CPU Ready值时,如何通过宿主机监控并传递给Zabbix? 4. 如何验证VMware性能计数器的可用性? 5. 在VirtualBox虚拟机中,是否有其他替代指标可以反映CPU等待时间? [^1]: 参考VMware文档关于性能计数器的说明 </think> ### 非Hyper-V环境下准确获取CPU Ready值的方法 在非Hyper-V虚拟化环境(如VMwareKVMXen)中获取CPU Ready值,需采用平台特定的方法。CPU Ready表示虚拟机等待物理CPU资源的时间比例,是诊断虚拟化性能瓶颈的关键指标。以下是不同平台的解决方案: #### 1. **VMware环境** 使用VMware的PerfMon计数器(需安装VMware Tools): ```powershell # 获取CPU Ready百分比 $cpuReady = (Get-Counter -Counter "\VMware CPU\Ready Time (%)").CounterSamples.CookedValue ``` **验证计数器可用性**: ```powershell Get-Counter -ListSet "VMware CPU" | Select-Object -ExpandProperty Paths ``` #### 2. **KVM/QEMU环境** 通过Libvirt API获取(需安装`virt-top`工具): ```bash # Linux宿主机上执行 virt-top --csv -d 2 -n 1 | awk -F',' '/Domain/{print $7}' > cpu_ready.log ``` **Windows虚拟机中间接获取**(需启用QEMU Guest Agent): ```powershell # 读取QEMU Guest Agent提供的统计信息 $cpuStats = (Get-WmiObject -Namespace root\virtualization\v2 -Class Msvm_Processor).LoadPercentageHistory $cpuReady = ($cpuStats | Where-Object { $_ -eq 0 }).Count / $cpuStats.Count * 100 ``` #### 3. **Xen环境** 使用XenStore读取Hypervisor提供的数据: ```powershell # 需安装Xen Tools $xenStorePath = "XenStore:\" $cpuReady = (Get-ItemProperty -Path "$xenStorePath\data\vcpu_ready").Value ``` #### 4. **通用替代方案** 当平台特定方法不可用时,可通过CPU利用率差值估算: ```powershell $totalCPUTime = (Get-Counter "\Processor(_Total)\% Processor Time").CounterSamples.CookedValue $vmCPUTime = (Get-Counter "\Process(_Total)\% Processor Time").CounterSamples.CookedValue $cpuReady = [Math]::Max(0, $totalCPUTime - $vmCPUTime) ``` ### 关键注意事项 1. **权限要求**: - VMware/KVM方法需要管理员权限 - XenStore访问需`XenAdmin`角色 - 估算方法需同时监控主机和虚拟机级计数器 2. **精度差异**: - 直接计数器法(VMware)精度最高(误差<1%) - 估算方法精度较低(误差约5-10%) - 采样间隔建议≥1分钟以避免噪声干扰 3. **数据验证命令**: ```powershell # 检查虚拟机平台类型 Get-WmiObject -Class Win32_ComputerSystem | Select-Object Model ``` ### 监控实现示例(VMware环境) ```powershell # 完整监控脚本 try { $ready = Get-Counter "\VMware CPU\Ready Time (%)" -ErrorAction Stop $cpuReady = $ready.CounterSamples.CookedValue } catch { Write-Warning "VMware计数器不可用,启用估算模式" $cpuReady = #...估算逻辑 } "$(Get-Date -f 'yyyy-MM-dd HH:mm:ss'),$cpuReady" | Out-File "C:\Monitoring\cpu_ready.csv" -Append -Encoding UTF8 ``` ### 相关问题 1. 如何在VMware ESXi主机上直接获取所有虚拟机的CPU Ready值?[^2] 2. KVM环境中如何配置Libvirt实现实时性能监控? 3. 当CPU Ready持续超过20%时应如何优化虚拟机配置? 4. 无代理监控方案如何通过IPMI获取物理主机负载数据? 5. 在多Hypervisor混合云环境中如何统一收集CPU Ready指标? [^1]: VMware性能计数器依赖于VMware Tools的安装版本,vSphere 7.0+提供更精确的Ready Time统计 [^2]: 网络诊断工具如netstat可辅助判断是否因网络延迟导致CPU等待
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值