qemu-kvn中的virtio浅析

一.  了解Virtio

virtio是通用虚拟化框架,在Qemu-kvm中的I/O是用qemu 来模拟的,性能比较差,用virtio来模拟I/O可以进一步提升I/O虚拟化的性能

传统的qemu-kvm 工作模式:

1.Guest产生I/O请求,被KVM 截获

2.Kvm 经过处理后将I/O请求存放在I/O共享页

3.通知Qemu,I/O已经存入I/O共享页

4.Qemu从I/O共享页拿到I/O请求

5.Qemu模拟代码来模拟本次的I/O,并发送给相应的设备驱动

6、7、8.   硬件去完成I/O操作并返回结果Qemu

9.    Qemu将结果放回I/O共享页

10.   Qemu通知Kvm去I/O共享页拿结果

11.   Kvm去I/O共享页拿到结果

12 .  Kvm将结果返回给Guest

**注意:

a)      在这个操作中,客户机作为一个qemu进程在等待I/O时有可能被阻塞

b)     当客户机通过DMA访问大块内存时候,Qemu不会把结果放回I/O共享页,而是直接通过内存映射的方式将结果直接写到客户机的内存中去,然后通过KVM模块告诉客户机DMA操作已经完成

Virtio 基本架构:

前端:是存在于客户机中的驱动模块。

后端:是存在于Qemu中的处理程序。

中间层:在前端和后端之间,还定义了一层来支持客户机与Qemu之间的通信。Virtio和virtio-ring可以看成是一层,Virtio是虚拟队列接口,就是将前端驱动程序附加到后端处理程序,算是前后端通信的桥梁,主要实现控制面,virtio-ring实现了两个环形缓冲,分别保存前后端的信息,实现具体的通讯机制和通讯流是偏向数据面,是桥梁的具体实现。

**注意:virtio设备都是pci设备

二.安装和使用virtio

现在linux里面一般会自带virtio的相关模块,当我们去使用的时候会自动加载相对应的模块。

例如在一个正在使用virtio-net的guest中,可以看到自动加载的模块:

对于客户机时windows的,因为windows默认没有提供virtio相关的驱动,所以可以去网上下载Windows virtio驱动到guest里去安装,也可以通过host来安装,方法:

1.host中安装virtio-win

2.启动win7客户机,将virttio-win.iso作为客户机的光驱

这里用了三个virtio驱动,-net,nic,model=virtio;-balloon virtio;-device virtio-serial-pci,启动后在win7的光驱里面可以看到

然后去设备管理器里安装对应设备的驱动即可。

*注意:安装virtio-scsi安装略有不同,因为当采用virtio-scsi设备的时候,然后去起guest的时候,这个时候guest是没有安装virtio_scsi驱动的,因此guest系统不能启动。解决办法:

a). 创建一个10M的img文件,当做guest的非启动盘

b). 先将guest的启动盘不要指定为virtio-scsi设备,将10M的img指定为virtio-scsi设备

c).quest起来后,由于存在一个virtio-scsi设备,所以在设备管理器里可以看到该设备驱动,并且没安装,然后安装一下即可

d).将guest重新启动,并指定启动盘为virtio-scsi,这时候由于guest已经安装了virtio-scsi驱动,可以正常启动了。那个10M的硬盘可以不需要了。

Virtio设备的使用

1.使用virtio_balloon

方式一:-balloon virtio[,addr=addr] #使用virtio balloon设备,addr可配置客户机中该设备的PCI地址

方式二:用较新的‘-device’的统一参数分配balloon设备,”-device virtio-ballon-pci,id=balloon0,bus=pci.o,addr=0x4”

在qemu monitor中查看和设置客户机内存的大小

2.使用virtio_net

1)检查Qemu是否支持virtio类型的网卡

2)启动客户机时候的命令

-net nic,model=virtio,macaddr=xx:xx:xx:xx:xx:xx         –net tap

前端                                                   后端

*注意:若果在使用virtio_net的时候依然得到较低的性能,可以检查并关闭Host的GSO,TSO可以提升性能

检查GSO,TSO:

关闭GSO,TSO:

vhost_net与virtio_net:

virtio_net驱动的后端处理是在用户空间的qemu中完成的

vhost_net驱动的后端处理是在内核中完成的

因此使用vhost_net的性能比virtio_net的性能更好

vhost_net command:

-net nic,model=virtio,macaddr=xx:xx:xx:xx:xx:xx       –net tap,vnet_hdr=on,vhost=on

前端                                                                     后端

前端guest中采用virtio-net后端处理采用vhost-net(当然需要host支持vhost-net,即支持vhost-net模块)

vnet_hdr=on/off :是否打开tap设备的IFF_VNET_HDR标识,这是tun/tap的一个标识,打开这个标识则允许发送或接收大数据包时仅做部分校验和检查,还可以提高vritio_net驱动的吞吐量

vhost=on/off:是否开启vhost-net这个内核空间的后端处理驱动

vhostfs=h,设置去连接一个已经打开的vhost网络设备

*注意:一般使用vhost-net可以提高网络性能,但是当host的处理速度比guest慢的时候,特别是udp类型的流量,就会导致数据包的丢失,这种情况下,不要用vhost-net。

3.使用virtio_blk

virtio_blk可以提升qemu-kvm中对块设备的访问性能。

virtio_blk command:

-drive file=rhel6u3.img,if=virtio

*注意:使用了virtio_blk后,客户机中看到的磁盘设备的名称就变成了/dev/vda,因此需要修改下/etc/fstab,然后重启

原文地址:https://www.cnblogs.com/xia-dong/p/11511293.html

时间: 2024-11-08 02:11:46

qemu-kvn中的virtio浅析的相关文章

SQL Server 中WITH (NOLOCK)浅析

原文:SQL Server 中WITH (NOLOCK)浅析 概念介绍 开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同于 READUNCOMMITTED . 具体的功能作用如下所示(摘自MSDN): 1: 指定允许脏读.不发布共享锁来阻止其他事务修改当前事务读取的数据,其他事务设置的排他锁不会阻碍当前事务读取锁定数据.允许脏读可能产生较多的并发操作,但其代价是读取以后会被其他事务回滚的数据修改.这可能会使您的

iOS 中 run loop 浅析

iOS 中 run loop 浅析 runloop 虽然是与线程想关的重要概念,但 cocoa 中的 runloop 终是用得不多,观相关博文却也未得入门其"why".所以浅习几日,得一粗陋分享浅文,作为笔记,写下其所以然.有不对或错误的地方,还望指教,不甚感激. run loop解惑 线程在执行完后,会被销毁.为了使线程能一直运行,咱们可以在线程里边弄个运行循环(run loop),让线程一直执行: - (void)myThread:(id)sender { while (TRUE)

算法竞赛中数论理论浅析

一.基本概念 带余除法(division algorithm,除法定理):a∈Z,d∈Z*,有唯一的整数 q 和 r,并且0≤r<d0,满足 a= d q+r.q 称为商,r  称为余数.通俗说法:整数除以正整数得到唯一的商(quotient)和余数(residue).  整除(divide exactly):称 a 整除 b ,当整数 a 除以非零整数 b ,商为整数,且余数为零, 我们就说a能被b整除(或说b能整除a),记作 b|a.b 称为 a 的约数(因数,common divisor)

Objective-c中的delegate浅析

网上关于vpn的资料很多,看后眼花缭乱,仍然感觉一片混沌.网上,网下参考一些资料后.试着理清一些概念问题,因为,概念理清了,找到门了,才不至于左右徘徊,一片混沌. 首先vpn,这个我们都知道叫虚拟专用网络.于是进一步问,虚拟专用网络具体指什么.一开始,我也是,钻牛角尖,这个虚拟网络到底具体指哪个类型到网络.后来才知道,虚拟专用网络,准确地说法应该是基于某种技术实现的vpn.因为基于不同的技术,有不同的vpn实现方式.打个比喻,vpn这个说法,就如同我家到你家的路线这个说法,至于这个路线具体实现方

Mybatis 中的&lt;![CDATA[ ]]&gt;浅析

在使用mybatis 时我们sql是写在xml 映射文件中,如果写的sql中有一些特殊的字符的话,在解析xml文件的时候会被转义,但我们不希望他被转义,所以我们要使用<![CDATA[ ]]>来解决. <![CDATA[   ]]> 是什么,这是XML语法.在CDATA内部的所有内容都会被解析器忽略. 如果文本包含了很多的"<"字符 <=和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中. 但是有个问题

SylixOS中pthread_cancel函数浅析

1 知识简介 1.1 概述 取消一个线程要确保该线程能够释放其所持有的任何锁.分配的内存,使整个系统保持一致性.在很多复杂情况下要保证这种正确性是有一定困难的. 一种简单的线程取消:取消线程调用一个取消线程的函数,被取消线程死亡.在这种情况下,被取消线程所持有的的资源得不到释放.取消线程负责保证被取消者处于可安全取消状态,在一个要求可靠性高的系统中,这种保证非常困难或者无法实现.这种取消称为不受限制的异步取消. 还存在另外一种更安全的线程取消机制.一个线程可以以可靠的受控制的方式向进程的其他线程

QEMU代码中os_daemonize()函数的理解

之前是做几年的Windows c++开发,Linux下的经验不够丰富,导致我在看QEMU代码时,有些地方还需要回头学习Linux操作系统的实现机制才能更准确理解.学习Linux操作系统时泛泛地看了很多书籍,好像明白了,但是要深刻理解,以这平庸的智商我觉得还是要多看代码多码代码.闲话少说,来看下os-posix.c中的一个函数,叫os_daemonize(),从名字上我们就知道是要搞一个守护进程,代码如下: void os_daemonize(void) { if (daemonize) { pi

JavaScript中闭包之浅析解读

JavaScript中的闭包真心是一个老生常谈的问题了,最近面试也是一直问到,我自己的表述能力又不能完全支撑起来,真是抓狂.在回来的路上,我突然想到了一个很简单的事情,其实我们在做项目时候,其实就经常用到闭包的,可是面试问的时候,回答又往往是我们经常搜到的答案,唉 不管是应付面试 还是真的想学点东西 ,我也用自己的理解跟大家分享一下,书面化就避免不了了的. 1.闭包是什么? 红宝书中曰:“是指有权访问另外一个函数作用域中的变量的函数.” 简单的说,JavaScript允许使用内部函数---即函数

java中io流浅析

1.java.io包下File类:java程序中的此类的一个对象,就对应着硬盘中的一个文件或网络中的一个资源.File file1 = new File("d:\\io\\helloworld.txt");File file2 = new File("d:\\io\\io1");>1.File既可以表示一个文件(.doc .xls .mp3 .avi .jpg .dat),也可以表示一个文件目录!>2.File类的对象是与平台无关的.>3.File