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

前言

随着云计算技术与服务的发展和进步,越来越多的客户选择将业务部署到云端。但由于引入了虚拟化层,在业务部署过程中经常会遇到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资源,因此就可以具体讨论两个问题:

如何减少读取ACPI PM Timer寄存器而引起的VM Exit;

如何减少访问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。

           

另外,KVM里很早也支持了HyperV Timer,只是客户的宿主机内核版本并不支持该功能,所以需要为客户升级UCloud自己维护的内核版本。

如何减少APIC ACCESS而引起 VM Exit?

Intel CPU也已经支持apic-v,同样升级到UCloud自己维护的内核版本来解决。

最终效果

win-fio-good

win-good

总结

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

本文由UCloud团队原创,未经允许不得私自转载,比心~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容