kvm虚拟机块对齐问题研究


kvm虚拟机块对齐问题研究
 
一、什么是块对齐问题?
早于windows 2008 的windows系统,2010年以前的linux系统,第一个分区的扇区是磁盘第63扇区,并且扇区尺寸是是512byte,这个是历史的原因,硬盘必须将cylinder / head / sector (CHS) 信息报告给BIOS,这个信息在现代的操作系统是无意义的,但是磁盘依然报告给bios每个磁盘轨道有63个扇区,因此操作系统依然将第一个分区的开始位置放置到第一个磁盘轨道上,在第63个扇区开始。  www.2cto.com  
当虚拟化的时候,虚拟机操作系统和虚拟化引擎也许采用以下几种对齐方式:
1) 512byte方式
虚拟机操作系统使用本地裸设备,并且裸设备使用512比特的扇区。
2) 4Kbyte方式
在新的本地硬盘上使用4K的物理扇区;在基于文件系统的存储方式上使用4K物理扇区;在基于网络
的存储方式上使用4K物理扇区。  www.2cto.com  
3) 64Kbyte
在高速网络存储上使用,是一些高速网络存储的默认值。
4) 1Mbyte
微软从windows server 2008开始默认采用1MB的块对齐方式,随后linux系统做了跟进。
假设虚拟机是512Byte的扇区,你会看到windows 2008 第一个分区从2048个扇区开始,随后的分区从2048倍数个扇区开始。
块对齐的问题如下图:
                                     sect#63
                              +--------------------------+------
                              |         guest            |
                              |    filesystem block      |
        ---+------------------+------+-------------------+-----+---
           |  host block             |  host block             |
           |                         |                         |
        ---+-------------------------+-------------------------+---
 
举个例子,在4k 扇区的系统上,虚拟机的文件系统块,第63扇区横跨物理机文件系统的两个块,会造成一个块的读写操作,横跨两个物理机的块,产生额外的io开销。
注释:以上内容选自virt-alignment-scan命令的帮助。
 
二、块对齐查看、性能测试
2.1 查看
可以使用virt-alignment-scan命令
virt-alignment-scan -a os_images_1
/dev/sda1 32768 32K bad (alignment < 64K)
virt-alignment-scan -a os_images_2
/dev/sda1 65536 64K ok
virt-alignment-scan -a centos62x64
/dev/sda1      1048576         1024K   ok
/dev/sda2    210763776         1024K   ok
2.2 块对齐性能测试
测试环境:
硬件: HP DL380G7 CPU Intel(R) Xeon(R) E5520 *2 内存 24G 硬盘146G*8 RAID 10
宿主机操作系统:CentOS 6.3升级到最新 内核版本kernel 2.6.32-279.14.1.el6.x86_64
虚拟机操作系统:windows 2003 32中文企业版
测试工具:Iometer
测试方法:4K随机写
结果:
块没有对齐的虚拟机 iops 165
块对齐的虚拟机        iops   187
速度快13.3%
根据国外的测试数据,不通的应用,性能可能会提升最高到30%。
 
 
三、如何解决块对齐问题
Windows系统
安装的时候,使用winpe先划分分区
diskpart
   select disk 0
   clean
   create partition primary align=64
然后格式化分区,安装操作系统。
Linux系统
使用kickstart文件,先在预处理的部分,用parted分区,然后使用分区
part /boot --fstype ext3 --onpart vda1
part pv.2 --onpart vda2
volgroup VolGroup00 --pesize=32768 pv.2
logvol swap --fstype swap --name=LogVol01 --vgname=VolGroup00 --size=1008 --grow --maxsize=2016
logvol / --fstype ext3 --name=LogVol00 --vgname=VolGroup00 --size=1024 --grow
%pre
parted /dev/vda mklabel msdos -s
parted /dev/vda mkpart primary ext3 2048s 409600s -s
parted /dev/vda mkpart primary 411648s 100% -s
parted /dev/vda set 2 lvm on s
按照扇区来划分磁盘空间,每个扇区是512byte,一般开始和结束按照2048个扇区的倍数来开始。
已经安装好的虚拟机镜像可以使用virt-resize命令,更改对齐方式
qemu-img create kuai-no-vda-2-yes -f qcow2 6G
virt-resize --align-first always --expand /dev/vda1 kuai-no-vda kuai-no-vda-2-yes
[root@lab-kvm-test178 datapool]# virt-alignment-scan -a kuai-no-vda-2-yes
/dev/sda1 65536 64K ok
注意:使用virt-resize命令存在一个问题,就是windows 系统virt-resize出来的虚拟机镜像,不能再次virt-resize;但是linux系统可以多次virt-resize。

相关内容

    暂无相关文章