VM性能的快速测试方法
前段时间陆续发布了一些对公有云服务性能评测的数据。经常有同行问我怎么样去做这些性能评测。其实这些性能评测都很简单,任何一个具备Linux基础知识的工程师都可以完成。我们通常使用UnixBench来评估虚拟机整机性能,mbw来评估内存性能,iozone来评估磁盘IO性能,iperf来评估网络性能,pgbench来评估数据库性能。在这里我将我自己做性能测试的过程整理一下,供各位同行参考。
(0)安装必要的软件
假定VM的操作系统是Ubuntu,可以按照如下步骤安装必要的软件:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:pitti/postgresql
sudo apt-get update
apt-get install libx11-dev libgl1-mesa-dev libxext-dev perl perl-modules make gcc nfs-common postgresql-9.1 postgresql-contrib-9.1 mbw iperf
cd ~
wget http://www.iozone.org/src/current/iozone3_414.tar
wget http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
tar xvf iozone3_414.tar
tar zxvf UnixBench5.1.3.tgz
cd ~/iozone3_414/src/current
make
cd ~/UnixBench
make
(1)CPU性能测试
我们使用UnixBench来进行CPU性能测试。UnixBench是一套具有悠久历史的性能测试工具,其测试结果反映的是一台主机的综合性能。从理论上来说UnixBench测试结果与被测试主机的CPU、内存、存储、操作系统都有直接的关系。但是根据我们的观察,对于现代的计算机系统来说,UnixBench测试结果受CPU 处理能力的影响更大一些。因此,在这里我们用UnixBench测试结果来代表虚拟机的vCPU 处理能力。每个UnixBench测试结果包括两个数据,一个是单线程测试结果,另一个是多线程测试结果(虚拟机上有几颗虚拟CPU,就有几个并发的测试线程)。
cd ~/UnixBench
./Run
下面是一个可供参考的测试结果。在这个测试中使用了两台物理机,每台物理机各配置一颗Intel Core i3 540 @ 3.07 GHz (双核四线程),16 GB内存(DDR3 @ 1333 MHz),一块Seagate ST2000DL003-9VT1硬盘(SATA,2TB,5900RPM),运行Ubuntu 10.04 AMD64 Server操作系统,使用的文件系统为ext4,使用的Hypervisor为KVM(qemu-kvm-0.12.3)。我们分别测试了宿主机、磁盘映像以文件格式(RAW格式,启用了virtio)存储在本地磁盘上的虚拟机、磁盘映像以文件格式(RAW格式,启用了virtio)存储在NFS上的虚拟机的CPU性能。虚拟机的配置为2 颗vCPU(占用两个物理线程,也就是一个物理核心)和4 GB内存。在这个测试中没有对操作系统、文件系统、NFS、KVM等等进行任何性能调优。
测试场景 | 宿主机 | 本地磁盘上的虚拟机 | NFS服务上的虚拟机 |
单线程 | 1360 | 1365 | 1374 |
多线程 | 3250 | 2529 | 2536 |
从如上测试结果可以看出,在没有进行任何性能调优的情况下,在单线程CPU性能方面,宿主机 >> 本地磁盘上的虚拟机 >> NFS服务上的虚拟机;在多线程CPU性能方面,宿主机 >> 本地磁盘上的虚拟机 = NFS服务上的虚拟机。需要注意的是,在多线程测试结果方面,宿主机所占的优势完全是由于宿主机比虚拟机多占用了两个物理线程,也就是一个物理核心。可以认为,在如上所述测试中,物理机和虚拟机的CPU性能基本上是一致的,虚拟化基本上没有导致CPU性能损失。
(2)磁盘IO性能测试
我们使用iozone来进行磁盘IO性能测试。iozone性能测试结果表示的是磁盘的吞吐量,但是通过吞吐量可以估算出IOPS。在如下命令中,我们评估的是以256K为数据块大小对磁盘进行写、重写、读、重读、随机读、随机写性能测试,在测试过程当中使用/io.tmp作为临时测试文件,该测试文件的大小是4 GB。需要注意的是,命令中所指定的测试文件是带路径的,因此我们可以测试同一虚拟机上不同文件系统的性能。例如我们通过NFS将某一网络共享文件系统挂载到虚拟机的/mnt目录,那么我们可以将该测试文件的路径设定为/mnt/io.tmp。
cd ~/iozone3_414/src/current
./iozone -Mcew -i0 -i1 -i2 -s4g -r256k -f /io.tmp
下面是一个可供参考的测试结果。在这个测试中使用了两台物理机,每台物理机各配置一颗Intel Core i3 540 @ 3.07 GHz (双核四线程),16 GB内存(DDR3 @ 1333 MHz),一块Seagate ST2000DL003-9VT1硬盘(SATA,2TB,5900RPM),运行Ubuntu 10.04 AMD64 Server操作系统,使用的文件系统为ext4,使用的Hypervisor为KVM(qemu-kvm-0.12.3)。我们分别测试了宿主机、NFS、磁盘映像以文件格式(RAW格式,启用了virtio)存储在本地磁盘上的虚拟机、磁盘映像以文件格式(RAW格式,启用了virtio)存储在NFS上的虚拟机、以及从虚拟机内部挂载宿主机NFS服务(虚拟网卡启用了virtio)的磁盘IO性能。在这个测试中没有对操作系统、文件系统、NFS、KVM等等进行任何性能调优。
测试场景 | write | re-write | random write | read | re-read | random read |
宿主机 | 114398 | 115766 | 67757 | 4621231 | 4897959 | 4899447 |
NFS | 51482 | 51253 | 35867 | 114914 | 4332976 | 476465 |
本地磁盘上的虚拟机 | 12447 | 22257 | 19664 | 542379 | 887648 | 468469 |
NFS服务上的虚拟机 | 7414 | 4433 | 4975 | 97238 | 581717 | 209665 |
虚拟机中的NFS | 32650 | 31772 | 22076 | 84982 | 111296 | 88263 |
从如上测试结果可以看出,在没有进行任何性能调优的情况下,在磁盘IO性能方面,宿主机 > NFS > 虚拟机中的NFS > 本地磁盘上的虚拟机 >NFS服务上的虚拟机。值得注意的是,即使是从虚拟机中挂载NFS服务,其IO性能也远远超过本地磁盘上的虚拟机。
(3)内存性能测试
我们使用mbw来测试虚拟机的内存性能。mbw通常用来评估用户层应用程序进行内存拷贝操作所能够达到的带宽。
mbw 128
(4)网络带宽测试
我们使用iperf来测试虚拟机之间的网络带宽。测试方法是在一台虚拟机上运行iperf服务端,另外一台虚拟机上运行iperf客户端。假设运行服务端的虚拟机的IP地址是192.168.1.1,运行客户端的虚拟机的IP地址是192.168.1.2。
在服务端执行如下命令:
iperf -s
在客户端执行如下命令:
iperf -c 192.168.1.1
测试完成后,在客户端会显示两台虚拟机之间的网络带宽。
(5)数据库性能测试
postgresql是一个著名的开源数据库系统。在MySQL被Sun 公司收购并进一步被Oracle公司收购之后,越来越多的公司正在从MySQL迁移到postgresql。pgbench是一个针对postgresql的性能测试工具,其测试结果接近于TPC-B。pgbench的优点之一在于它能够轻易地进行多线程测试,从而充分利用多核处理器的处理能力。
在虚拟机上以postgres用户登录:
su -l postgres
创建测试数据库:
createdb pgbench
初始化测试数据库:
pgbench -i -s 16 pgbench
执行单线程测试:
pgbench -t 2000 -c 16 -U postgres pgbench
执行多线程测试,在下面的命令中将N替换为虚拟机的vCPU数量:
pgbench -t 2000 -c 16 -j N -U postgres pgbench
下面是一个可供参考的测试结果。在这个测试中使用了两台物理机,每台物理机各配置一颗Intel Core i3 540 @ 3.07 GHz (双核四线程),16 GB内存(DDR3 @ 1333 MHz),一块Seagate ST2000DL003-9VT1硬盘(SATA,2TB,5900RPM),运行Ubuntu 10.04 AMD64 Server操作系统,使用的文件系统为ext4,使用的Hypervisor为KVM(qemu-kvm-0.12.3)。我们分别测试了宿主机、磁盘映像以文件格式(RAW格式,启用了virtio)存储在本地磁盘上的虚拟机、磁盘映像以文件格式(RAW格式,启用了virtio)存储在NFS上的虚拟机的数据库性能。虚拟机的配置为2 颗vCPU和4 GB内存。在这个测试中没有对操作系统、文件系统、NFS、KVM等等进行任何性能调优。
测试场景 | 宿主机 | 本地磁盘上的虚拟机 | NFS服务上的虚拟机 |
单线程 | 126 | 24 | 14 |
多线程 | 146 | 31 | 17 |
从如上测试结果可以看出,在没有进行任何性能调优的情况下,在数据库性能方面,宿主机 >> 本地磁盘上的虚拟机 >> NFS服务上的虚拟机。