Linux kernel 什么限制了来宾VM中virtio网络接口的吞吐量

Linux kernel 什么限制了来宾VM中virtio网络接口的吞吐量,linux-kernel,virtual-machine,qemu,kvm,Linux Kernel,Virtual Machine,Qemu,Kvm,假设具有KVM的Linux主机运行具有virtio接口的Linux来宾VM,那么virtio接口可以实现的吞吐量的限制因素是什么 尽管带宽可能是1 Gbps,因为它是一个虚拟接口,但我假设数据吞吐量可以更大。吞吐量是受来宾VM的CPU限制还是在此之前会有virtio驱动程序限制?virtio驱动程序是一个半虚拟化的驱动程序,这意味着驱动程序的一些内部,环形缓冲区和寄存器向客户机公开,客户机可以访问它们,就好像它以较少的命中率写入客户机内存一样 公开的环形缓冲区的大小是一个限制,并且硬编码为256

假设具有KVM的Linux主机运行具有virtio接口的Linux来宾VM,那么virtio接口可以实现的吞吐量的限制因素是什么


尽管带宽可能是1 Gbps,因为它是一个虚拟接口,但我假设数据吞吐量可以更大。吞吐量是受来宾VM的CPU限制还是在此之前会有virtio驱动程序限制?

virtio驱动程序是一个半虚拟化的驱动程序,这意味着驱动程序的一些内部,环形缓冲区和寄存器向客户机公开,客户机可以访问它们,就好像它以较少的命中率写入客户机内存一样

公开的环形缓冲区的大小是一个限制,并且硬编码为256个元素。我已经看到一些qemu补丁增加了这个大小,但是它不在主线中,所以我猜额外内存使用的缺点太高了,不允许这样做

更好的方法是让来宾操作系统利用多个virtio队列。默认为一个用于发送,一个用于接收。例如,您有多个tx队列,然后通过该队列进行负载平衡。这将提供更高的吞吐量,但不适用于单个会话


vhost-net或许是一种更好的方式。我自己也没有尝试过,但据我所知,这是向来宾公开的同一个virtio接口,但后端是作为内核模块实现的,而不是在用户空间qemu中实现的;这可以降低我想象中的中断延迟。哦,是的,中断延迟是另一个限制因素,我发现来宾驱动程序在每次中断时尽可能多地从环中取出数据包,以最大限度地提高速度。vhost net的详细信息在这里

virtio驱动程序是一个半虚拟化的驱动程序,这意味着驱动程序的一些内部、环形缓冲区和寄存器向来宾公开,来宾可以访问它们,就好像它以较少的命中率写入来宾内存一样

公开的环形缓冲区的大小是一个限制,并且硬编码为256个元素。我已经看到一些qemu补丁增加了这个大小,但是它不在主线中,所以我猜额外内存使用的缺点太高了,不允许这样做

更好的方法是让来宾操作系统利用多个virtio队列。默认为一个用于发送,一个用于接收。例如,您有多个tx队列,然后通过该队列进行负载平衡。这将提供更高的吞吐量,但不适用于单个会话


vhost-net或许是一种更好的方式。我自己也没有尝试过,但据我所知,这是向来宾公开的同一个virtio接口,但后端是作为内核模块实现的,而不是在用户空间qemu中实现的;这可以降低我想象中的中断延迟。哦,是的,中断延迟是另一个限制因素,我发现来宾驱动程序在每次中断时尽可能多地从环中取出数据包,以最大限度地提高速度。vhost net详细信息在此

谢谢。我确实在主机中使用vhost网络驱动程序来提高性能。关于中断延迟,是的,具有virtio接口的来宾VM使用NAPI接口,该接口在一次中断中消耗尽可能多的PKT。在多队列virtio接口上,我认为该补丁是为较新的内核开发的,不幸的是,我使用的系统是2.6.2x。我确实在主机中使用vhost网络驱动程序来提高性能。关于中断延迟,是的,具有virtio接口的来宾VM使用NAPI接口,该接口在一次中断中消耗尽可能多的PKT。在多队列virtio接口上,我认为补丁是为较新的内核开发的,不幸的是,我使用的系统是2.6.2x