文档章节

记一次虚拟化环境下Windows IO性能的解析

UCloudTech
 UCloudTech
发布于 2017/09/06 10:46
字数 2031
阅读 231
收藏 12
点赞 0
评论 0

前言
随着云计算技术与服务的发展和进步,越来越多的客户选择将业务部署到云端。但由于引入了虚拟化层,在业务部署过程中经常会遇到IO问题,通常也不易调试。本文主要介绍利用perf、systemtap等工具,帮助一位托管云客户调试IO性能问题,来分析虚拟环境下Windows IO的性能。

问题出现
有一次,托管云客户自己搭建了虚拟化环境,在同一台宿主机上创建windows 2008 R2 和 Centos6.5虚拟机,用fio分别测试其随机读性能,windows 2008 R2的IOPS大约在18K,而Linux的IOPS却可以达到100K左右。
• 客户测试用的fio 配置
[global]
ioengine=windowsaio
direct=1
iodepth=64
thread=1
size=20g
numjobs=1
[4k]
bs=4k
filename=d:test.img
rw=randread
测试结果

win_fio1
• 云主机IO栈

io stack
云主机环境下,整个IO栈相对较长,涉及到Guest OS中的应用层/文件系统/Block层以及驱动层,虚拟化层,宿主机OS文件系统/Block层以及驱动层。因为涉及面多,所以其中任何一个环节出现问题都会造成性能下降,也为做IO的Tracing增加了难度。

从这次得到的信息来看,首先排除了宿主机文件系统和Block层以及驱动层的问题,因为同样情况的配置,Linux系统并没有问题。
所以目前主要集中于两点
Guest OS(Windows系统)
fio程序
文件系统/Block layer
VirtIO Block驱动 虚拟机为Guest OS提供的是Virtio Block设备
QEMU

如何排除QEMU的嫌疑?
对于IOPS的性能问题,很容易想到两种可能性:
IO延时过高
设备支持IO队列太短

在队列的问题方面,Linux和Windows虚拟机对应的Virtio Block设备都是一样的,那么就需要确认延时问题。

QEMU 完成Block IO花了多长时间?
幸运的是,Stefan Hajnoczi已经为QEMU添加了Tracing的特性,因此可以很方便的统计出QEMU从接收到一个IO请求到完成所用的具体时长。

从上述统计来看,平均IO完成时间在130us,由此暂时排除QEMU 层造成太高延时的影响。另外,如果关注这种动态Tracing的overhead,从测试观察上大致接近20%。
排除队列和延时问题,可能造成影响的也只有Guest OS了。
VirtIO Block驱动的问题?
至少更新到最新稳定版本的Virtio-Win驱动,仍然存在同样的问题。
Windows 文件系统/Block层的问题?
原生Windows系统在确认后并没有做任何配置上的修改。
fio测试程序的问题

为什么Linux上fio没有问题呢?

两种可能性
在性能排查过程中,总是很容易陷入死局,经常会问到底是哪儿出了问题?因此一切可能影响的因素似乎都没有做任何变动。从经验来看,大部分性能问题都可以分成两种可能:
on cpu
off cpu
重新来看这个问题 ,在基本排除IO延时问题后,对应的问题还有两种可能性:
CPU极其忙碌,但是大部分时间并不是在做IO处理;
CPU经常处于空闲状态,那相应的也没有主要在处理IO。
注:之所以说到目前为止并不能排除IO延时的影响,是因为只排除了QEMU Block层可能的影响,但是还有Guest OS(这次暂时忽略Guest OS)。
先看测试过程中,虚拟机的CPU消耗情况。
top -H -p 36256

win_fio1
从上图来看,QEMU主线程的cpu负载已经达到90%以上,似乎符合on cpu类问题。通常来说,解决这类问题最好的办法就是用perf进程采样,然后生成火焰图,因为首先查看CPU具体消耗在什么地方是一个不错的选择。
perf record -a -g -p 36256 sleep 20
生成火焰图:

win2008-bad
可以清楚的看到,cpu大部分消耗都是KVM的操作,其中最主要的消耗是vmx_handle_exit。(真实的火焰图是一个矢量图,用浏览器查看很容易确认)。这里引起vmx_handle_exit主要有两点:
访问IO Port(handle_pio)
访问 MMIO(handle_apic_access)
既然KVM模块占了大部分,那就更希望了解测试时KVM的真实行为,通过另一个工具(kvm_stat)可以达到。

kvm_pio
除VM Entry和VM Exit事件外,最高的就是kvm_pio和 kvm_mmio,说明Windows确实有大量IO Port和MMIO操作,这也验证了在火焰图上所得出的结论。
在虚拟化里,IO Port或者MMIO都可能引起VM Exit,甚至是Heavy Exit。如果需要改善性能,一般都会尽量避免这种情况,至少避免Heavy Exit.

•具体访问哪些IO Port和MMIO导致的VM Exit?

对于这个问题,KVM模块已经加了很多trace event,上面的kvm_stat也是利用这些trace event,只是并没有把具体trace event信息打印出来。为了获取trace-event的信息,有很多前端工具,如trace-cmd、perf,都是不错的选择。
• 查看所有kvm模块的trace event
[xs3c@devhost1 ]# trace-cmd list -e | grep kvm
kvmmmu:kvm_mmu_pagetable_walk
kvmmmu:kvm_mmu_paging_element
kvmmmu:kvm_mmu_set_accessed_bit
kvmmmu:kvm_mmu_set_dirty_bit
kvmmmu:kvm_mmu_walker_error
kvmmmu:kvm_mmu_get_page
kvmmmu:kvm_mmu_sync_page
kvmmmu:kvm_mmu_unsync_page
kvmmmu:kvm_mmu_zap_page
kvm:kvm_entry
kvm:kvm_hypercall
kvm:kvm_pio
kvm:kvm_cpuid
kvm:kvm_apic
kvm:kvm_exit
kvm:kvm_inj_virq
kvm:kvm_inj_exception
kvm:kvm_page_fault
kvm:kvm_msr
kvm:kvm_cr
kvm:kvm_pic_set_irq
kvm:kvm_apic_ipi
kvm:kvm_apic_accept_irq
kvm:kvm_eoi
kvm:kvm_pv_eoi
kvm:kvm_write_tsc_offset
kvm:kvm_ple_window
kvm:kvm_vcpu_wakeup
kvm:kvm_set_irq
kvm:kvm_ioapic_set_irq
kvm:kvm_ioapic_delayed_eoi_inj
kvm:kvm_msi_set_irq
kvm:kvm_ack_irq
kvm:kvm_mmio
KVM模块添加了许多trace event的点,这里只抓起其中两个——kvm:kvm_pio和kvm:kvm_mmio。

trace-cmd-pio-mmio

通过统计发现主要访问的:
IO Port是0x608和0xc050;
MMIO是0xFEE003xx
经由qemu info mtree命令,可以查看IO Port 608、c050以及FEE003xx分别对应的具体设备。
•IO Port
0000000000000608-000000000000060b (prio 0, RW): acpi-tmr 000000000000c040-000000000000c07f (prio 1, RW): virtio-pci
•MMIO
00000000fee00000-00000000feefffff (prio 4096, RW): icc-apic-container
c050可以忽略,这个被Virtio Block来做VM Exit。
到目前为止,可以判断出wnidows大量读取ACPI Power Manager Timer以及访问APIC寄存器,进而导致过多vm exit产生,消耗大量CPU资源,因此就可以具体讨论两个问题:
1.如何减少读取ACPI PM Timer寄存器而引起的VM Exit;
2.如何减少访问APIC MMIO导致的VM Exit。

如何减少读取ACPI PM Timer而引起的VM Exit?
从虚拟化层优化的思路来说,减少IO Port引发的VM Exit通常会考虑是否可以利用Paravirtulization替换Full-virtualization 以达到目的,来看Windows在这方面是如何做的。
从Windows 7开始,微软为了使Windows 操作系统能够在HyperV得到更好性能,特意为Windows系统做了很多虚拟化方面的增强工作,其中就包括这里可以利用到的HyperV Timer,这个特性类似于Linux中的kvmclock。
从当前的支持情况来看:
Windows 7
Windows 7 SP1
Windows Server 2008 R2
Windows Server 2008 R2 SP1/SP2
Windows 8/8.1/10
Windows Server 2012
Windows Server 2012 R2
这些Windows系统都包含虚拟化增强功能,更多的信息在微软官方网站。
2014年,RedHat工程师Vadim Rozenfeld和Peter Krempa 分别为qemu和libvirt添加了HyperV Timer的支持,所以可以直接通过libvirt使能HyperV Timer。

<clock …>

<timer name=’hypervclock’ present=’yes’/>

</clock>

另外,KVM里很早也支持了HyperV Timer,只是客户的宿主机内核版本并不支持该功能,所以需要为客户升级UCloud自己维护的内核版本。
•如何减少APIC ACCESS而引起 VM Exit?
Intel CPU也已经支持apic-v,同样升级到UCloud自己维护的内核版本来解决。
最终效果

win-fio-good

win-good

总结
从这个案例可以看出,跟物理环境相比,在虚拟化环境下,Windows IO性能较差时,并不一定真正是IO路径出现问题,可能是一些虚拟化性能的问题对IO性能造成了很大影响。

© 著作权归作者所有

共有 人打赏支持
UCloudTech
粉丝 3
博文 16
码字总数 19843
作品 0
三大虚拟化产品的功能与缺点

基本细节 微软Hyper-V:微软免费提供了功能有限的Hyper-V版本,另外还有各种Windows Server 2008随带的不同Hyper-V版本。Hyper-V至少可以支持主机多达8个CPU和1TB内存。微 软致力于利用虚拟机...

老枪 ⋅ 2010/03/29 ⋅ 0

虚拟化技术

虚拟化技术 虚拟化技术: 计算机基本部件:控制器+运算器=CPU memory I/O(keyboard monitor) 虚拟化:将底层的计算机资源抽象或者虚拟为多组彼此之间互相隔离的计算平台,每一个平台都具有...

Taxing祥 ⋅ 2017/08/19 ⋅ 0

如何规划构建一套大型的Citrix桌面虚拟化架构 - Part1

Part2:http://kaiqian.blog.51cto.com/236001/1717010 Part3:http://kaiqian.blog.51cto.com/236001/1717024 Part4:http://kaiqian.blog.51cto.com/236001/1717064 后记:http://kaiqian.......

技术小胖子 ⋅ 2017/10/31 ⋅ 0

乾颐堂安德云HCIE:华为桌面云类型和关键特性

乾颐堂安德云HCIE:华为桌面云类型和关键特性 1.华为云桌面形态 完整复制桌面 链接克隆桌面 全内存急速桌面 高性能图形化桌面 发送方式包括:1对1,1对多,多对1,多对多等多种方式 1.1 完整复...

EnderJoe ⋅ 01/19 ⋅ 0

利用Deskpool 搭建 桌面云教室

1 产品概述 Deskpool是一个精简高效的桌面云教学平台,通过统一的管理平台全面管理位于数据中心的物理和虚拟资源,用户仅需要使用低成本的ARM架构云终端或者显示器一体机就可以连接到数据中心...

yangtzi ⋅ 2016/07/07 ⋅ 0

微软与 Docker 合作,Windows 将提供 Docker 原生支持

Docker与微软联合宣布将在Windows Server中提供Docker的原生支持。众所周知,Docker是新一代的轻量化的虚拟技术。它依赖Linux内核所提供的cgroup等Linux专有特性,因此在此之前你若想在Windo...

Neo ⋅ 2014/10/17 ⋅ 15

Hadoop虚拟化的性能对比和调优经验

虚拟化为Hadoop注入了前所未有的活力,从IT生产管理的角度,表现为以下几点: ·Hadoop和其他消耗不同类型资源的应用一起部署共享数据中心可以提高总体资源利用率; ·灵活的虚拟机操作使得用...

vBigData ⋅ 2013/09/18 ⋅ 0

性能测试初探——接口性能测试

鉴于接口性能测试的重要性,特发此文。 (一).性能指标 PV: PageView, 页面浏览量或点击量,用户每次刷新即被计算一次;用户的一次刷新,给服务器造成了一次请求。 UV: UniqueVisitor, 访问...

阿阳啊啊 ⋅ 2017/11/06 ⋅ 0

虚拟化之术语解析

-----本文大纲 虚拟化 虚拟化技术 分类 -------- 一、虚拟化 虚拟化通过在一个物理平台上虚拟出更多的虚拟平台,而其中的每一个虚拟平台则可以作为独立终端的分布式系统。比起直...

jinlinger ⋅ 2014/05/24 ⋅ 0

kangle web 服务器开发版 V3.3.7 发布

kangle web 服务器开发版 V3.3.7 发布,更新内容如下: 修复限制了无法打开网页的bug 修复3311管理里面修改单节点服务器无法生效的BUG. 注意:本版本为开发版,请不要用于生产环境中,生产环境...

oschina ⋅ 2014/02/14 ⋅ 18

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HiSDP —— 高效的C++软件开发平台

目前阿里集团每天有近1000PB的数据是通过LogAgent采集的,为了让LogAgent做到资源占用节省和高效采集,背后是基于HiSDP去构建的。 缘由 当决定采用C++编程语言去开发一个软件时,紧接着所面临...

阿里云云栖社区 ⋅ 17分钟前 ⋅ 0

zookeeper-3.4.12 下载与安装教程

一、zookeeper下载地址 http://mirrors.hust.edu.cn/apache/zookeeper/ 二、启动教程 把压缩包放在指定目录下 第三: 进入 conf文件夹底下 zoo_sample.cfg 文件名改成 zoo.cfg 第四步: 进入b...

泉天下 ⋅ 18分钟前 ⋅ 0

Oracle 中文日期转换

SELECT TO_date('2011年11月11日', 'yy"年"mm"月"dd"日"') FROM DUAL; 1. Oracle无法识别中文格式,所以添加双引号。 2. 后面的格式是指字符串在转换前的格式,而不是指转换后的格式。...

江戸川 ⋅ 19分钟前 ⋅ 0

MySell:API Spring Boot

起步 类目 商品 订单

BeanHo ⋅ 22分钟前 ⋅ 0

Spring方法拦截器MethodInterceptor

参考资料 1、Spring方法拦截器MethodInterceptor 2、Sharding JDBC源码分析-JdbcMethodInvocation类的作用

哎小艾 ⋅ 25分钟前 ⋅ 0

正则表达式

元字符 元字符,又叫字符集,就是用一些特殊符号表示特定种类的字符或位置。 匹配字符 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线或汉字 \s 匹配任意的空白符 \d 匹配数字 匹配...

wangchen1999 ⋅ 25分钟前 ⋅ 0

数据库数据导入Elasticsearch案例分享

基于bboss持久层和bboss elasticsearch客户端实现数据库数据导入es案例分享(支持各种数据库和各种es版本) 1.案例对应的源码 https://gitee.com/bboss/bboss-elastic/blob/master/bboss-el...

bboss ⋅ 26分钟前 ⋅ 0

动手---sbt(2)

参考 https://blog.csdn.net/leishangwen/article/details/46225587 建立一个chisel_max目录,文件内容如后面所述,现在开始执行命令: joe@joe-Aspire-Z3730:/media/sdb4/download/scala$ c......

whoisliang ⋅ 32分钟前 ⋅ 0

纯js实现最简单的文件上传(后台使用MultipartFile)

<!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>XMLHttpRequest上传文件</title> <script type="text/javascript"> //图片上传 var xhr......

孟飞阳 ⋅ 37分钟前 ⋅ 0

iOS宇宙大战游戏、调试工具、各种动画、AR相册、相机图片编辑等源码

iOS精选源码 日期时间选择器,swift Space Battle 宇宙大战 SpriteKit游戏源码 LLDebugTool - 便捷的IOS调试工具(新增截屏功能) 相机扫描or长按识别二维码、FMDB、键盘动态高度、定位等 动画...

sunnyaigd ⋅ 38分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部