摘要:虛擬機可以生成數種虛擬的網絡設備類型,比如常見的e1000,rtl8139,純粹虛擬化的virtio等。在加載不同的網絡設備情況下,虛擬機的通訊效率如何呢?本文就是具體的測試過程和結果的記錄。
簡介
KVM虛擬機可以生成數種虛擬的網絡設備類型,比如常見的e1000,rtl8139,純粹虛擬化的virtio,兼容老式網卡的ne2k_pci,pcnet等。本文測試單臺虛擬機在加載不同的網絡設備情況下,虛擬機對外服務的通訊效率。
測試方法
網絡通訊是一個複雜的過程,都很多外部因素影響。因此本此測試構造一個單純的測試環境,把外部因素的影響儘量降低到最低,用簡單的方法,單純地測試虛擬網絡設備的通訊效率,而且主要記錄服務帶寬(吞吐量)數據,其他如時延,差錯等都不做考慮。
測 試的具體方法是構造一個封閉的100M網絡,兩臺物理主機,其中一臺作爲宿主機P1並安裝運行一臺虛擬機V,另一臺作爲客戶機P2,運行 scp命令,用ssh的方法從主機V拷貝一個500M文件到自身硬盤。scp命令會彙總報告遠程拷貝的速度,以此作爲吞吐量數據記錄。每次虛擬機需要關機並通過virt-manager修改虛擬網卡的類型,然後重新啓動,驗證虛擬網卡正確加載,scp,重複這個過程至幾種主要的kvm支持的虛擬網卡類型都被測試。
測試步驟:
1、修改虛擬網卡類型。
2、啓動虛擬機V。
3、登錄V的控制檯,分別用命令
# lspci | grep Ethernet
# ethtool -i eth0
# dmesg | grep eth0
驗證虛擬網卡是否正常加載;
4、登錄P2控制檯,運行scp,從V拷貝一個500M文件到P2。
5、記錄scp報告的吞吐量數據。
6、關閉V,重複上面過程。
測試環境
網絡:如圖,封閉的100M網絡(很想用,也應該用千兆網絡來測試,但條件不具備),網段爲10.0.112.0/24,主機P1採用橋接模式配置IP地址。
表1 主機P1(宿主機)配置
CPU |
Pentium(R) Dual-Core CPU E5800 @ 3.20GHz |
Memory |
2G |
NIC |
Marvell 88E8057 PCI-E Gigabit Ethernet Controller 百兆網卡 |
IP |
10.0.112.39 |
OS |
CentOS6.2 x86 |
表2 主機P2配置
CPU |
Pentium(R) Dual-Core CPU E5800 @ 3.20GHz |
Memory |
2G |
NIC |
Marvell 88E8057 PCI-E Gigabit Ethernet Controller 百兆網卡 |
IP |
10.0.112.38 |
OS |
CentOS6.2 x86 |
表3 主機V(虛擬機)配置
CPU |
QEMU Virtual CPU version (cpu64-rhel6) |
Memory |
512M |
NIC |
根據測試變化 |
IP |
10.0.112.160 |
OS |
CentOS6.0 i386 |
測試結果
表4 不同的虛擬網卡的測試速度
虛擬網卡類型 |
傳輸速度 |
網絡狀態 |
virtio |
10.9-11.2MB/s |
穩定 |
e1000 |
10.8-11.2MB/s |
穩定 |
rtl8139 |
10.8-11.2MB/s |
穩定 |
ne2k_pci |
6.5-6.7MB/s |
穩定 |
pcinet |
9.1MB/s |
不穩定,85%虛擬機網卡崩潰 |
VirtIO paravirtual 是 Linux 虛擬機平臺上統一的虛擬 IO 接口驅動。通常主機爲了讓客戶機像在真實環境中一樣運行,需要爲客戶機創建各式各樣的虛擬設備,如磁盤,網卡,顯卡,時鐘,USB 等。這些虛擬設備大大降低了客戶機的性能。如果客戶機不關注這些硬件設備,就可以用統一的虛擬設備代替他們,這樣可以大大提高虛擬機的性能。這個統一的標準化接口在 Linux 上就是 VirtIO 。需要注意的是 VirtIO 運行在 kernel 2.6.24 以上的版本中才能發揮它的性能優勢。另外 KVM 項目組也發佈了 Windows 平臺上的 VirtIO 驅動,這樣 windows 客戶機的網絡性能也可以大大提高了。
Virtio/e1000/rtl8139 都達到了100M網絡的理論最大值。
附:虛擬網卡設備驗證記錄
=====虛擬機網卡:virtio
# lspci | grep Ethernet
00:03.0 Ethernet controller: Red Hat, Inc Virtio network device
# ethtool -i eth0
Cannot get driver information: Operation not supported
# dmesg | grep eth0
eth0: no IPv6 routers present
=====虛擬機網卡:e1000
# lspci | grep Ethernet
00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit EthernetController (rev 03)
#ethtool -i eth0
driver: e1000
version: 7.3.21-k6-NAPI
firmware-version: N/A
bus-info: 0000:00:03.0
# dmesg | grep eth0
e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection
e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
eth0: no IPv6 routers present
=====虛擬機網卡:rtl8139
# lspci | grep Ethernet
00:03.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 20)
#ethtool -i eth0
driver: 8139cp
version: 1.3
firmware-version:
bus-info: 0000:00:03.0
# dmesg | grep eth0
eth0: RTL-8139C+ at0xe1134000, 52:54:00:4f:1b:07, IRQ11
eth0: link up, 100Mbps, full-duplex, lpa 0x05E1
eth0: no IPv6 routers present
=====虛擬機網卡:ne2k_pci
# lspci | grep Ethernet
00:03.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8029(AS)
# ethtool -i eth0
driver: ne2k-pci
version: 1.03
firmware-version:
bus-info: 0000:00:03.0
#dmesg | grep eth0
eth0: RealTek RTL-8029 found at 0xc100, IRQ 11, 52:54:00:4f:1b:07.
eth0: no IPv6 routers present
=====虛擬機網卡:pcnet
# lspci | grep Ethernet
00:03.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rev 10)
#ethtool -i eth0
driver: pcnet32
version: 1.35
firmware-version:
bus-info: 0000:00:03.0
# dmesg | grep eth0
eth0: registered as PCnet/PCI II 79C970A
eth0: link up
eth0: no IPv6 routers present