最近一直在研究qemu-kvm,今天来总结一点心得。欢迎来拍砖。
virtio框架
virtio-net为半虚拟驱动,virtio-net请求处理过程如下:
1.客户机(virtio-net设备驱动)读写数据方式vring队列
2.客户机执行Virtqueue队列函数kick通知host宿主机(通过virtio-pci硬件寄存器发送通知)
3.宿主机host截获通知信息
4.宿主机host从vring队列获取读写请求(vring队列内容涉及地址为客户机物理地址)
5.宿主机host处理读写请求
6.宿主机host处理结果添加到vring队列
7.宿主机host发送中断(通过virtio-pci中断)
而这儿的Virtio Device是由用户态的qemu-kvm虚拟的,从内核态切换用户态,必然会导致性能的下降。如果能够直接在内核态捕获,而非切换到用户态,必然能提高效率。
本文是对network的优化,至于scsi等,后续继续添加。。。。
在virtio中利用virtqueue_notify()函数通知Virtio device,向网卡发送数据。这个地方用函数钩子,替换成一个内核模块直接调用内核函数向网卡发送数据。而对于接收的数据包,采用linux netfilter机制,在qemu-kvm启动虚拟机时,添加一个对该虚拟机的网络数据接收规则来实现。
以上只是对network优化的一点想法,后续贴上对qemu-kvm和linux内核的修改代码。
阅读(5047) | 评论(1) | 转发(1) |