Virtual Virtio Nic

keywords: network, virtio, vhost, virtualization

前两周一直在研究网卡offload的特性,目的是通过ethtool设置虚拟网卡功能,进行功能验证。物理网卡、虚拟e1000基本都搞清楚了,rtl8139比较老,很多新特新都不支持,所以忽略。问题就处在了Virtio虚拟网卡上,这个玩意不同于一般的虚拟网卡,不是单纯的硬件模拟,她需要利用内核里边提供的相关API,争取最高性能。由于是内核跟hypervisor相互调用,所以虚拟机用户感知到的网卡功能,也需要hypervisor的支持(特性支持、参数配置等)。
QEMU 有个新参数 “-netdev tap,vhost=on…” 替换了原来的 “-net tap,…”,用于创建网络设备,很多新特性只有在新参数才能使用。比如虚拟网卡的offload功能,老参数需要QEMU实现对offload功能的支持,目前只能使用GSO一种。新参数则可以使用主机内核提供的vhost支持,offload工作由内核中的vhost_net模块来完成,性能提升就不用说了,rx/tx/sg/tso/gso/ufo都支持。开始觉得奇怪,为什么不支持receive offload?offload的思想就是把数据切割/组装尽可能由硬件,或者由较下层(网络层、数据链路层、物理层)做,所以虚拟网卡并不是实际上的最底层,QEMU虚拟机只是物理的一个进程而已,应该交给物理机的硬件/较下层处理,所以virtio网卡不需要received offload。

用前面主要是花时间搞懂了Virtio在内核中的实现代码,QEMU中的调用、virtio网卡队列的实现等。vhost把虚拟机IO降到内核里已经不是新闻了,所以下面目标转向vhost的实现,需要分析代码。

virtio:towards a de-facto standard for virtual i o devices: http://ozlabs.org/~rusty/virtio-spec/virtio-paper.pdf
qemu : http://www.qemu.org/
vhostnet: http://fedoraproject.org/wiki/Features/VHostNet
virtio: http://www.linux-kvm.org/page/Virtio

One thought on “Virtual Virtio Nic

  1. 刚刚接触linux驱动,也刚刚接触virtio,请教博主一个问题

    一个使用virtio_net且开了TSO的网卡,向外发tcp包时帧的大小是不受MTU限制的,也就是说最大能到64KB。
    如果大包的接收方也是virtio_net,则接收方直接拿到大包,这样传输效率很高;
    如果接收方不是virtio_net,是e1000之类的,接收方收到的就是MTU以内的包。
    那么这个大包的切分工作是谁做的呢?

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.