我一直在debuggingESX vmware主机通过使用TCP / IP的虚拟交换机与虚拟linux机器进行通信的情况。 拥塞事件发生后,当虚拟机正在等待来自vmware主机的更多数据时,vmware主机正在等待来自虚拟机的确认。 大的接收卸载(LRO)打开,问题似乎是vmware驱动程序没有给它内置的子部分的大小(它可以通过sk_buff结构的gso_size字段)给内核。
使用通用接收卸载(GRO)而不是LRO使问题消失。 所以,我在这里有两个可能的解决scheme,
1)修复vmware驱动程序,以便设置传递给内核的sk_buff的gso_size字段,或2)closuresLRO(使用ethtool -K),然后使用GRO。
在网上search有关LRO和GRO的信息,我只find没有硬数据或明确参考的片段和意见。 我想知道使用LRO vs GRO有什么优缺点。
从我在networking上的search到目前为止,我相信:*)LRO和GRO都可以减lessack的数量,这应该减lessnetworkingstream量,但也可能会降低拥塞窗口(cwnd)在慢启动或拥塞地方回避。 *)LRO和GRO都应该减less中断次数和内核堆栈遍历的次数。 由于使用新的API(NAPI),GRO是否比LRO减less中断? *)LRO有时会把太多的数据包放在一起(具有不同头的特定数据包,打破了某些应用程序)。 *)LRO只做IPV-4,而GRO可以做IPV-6。
根据这个旧的LWN文章, GRO本质上是用来取代LRO的。 据我了解,LRO更具侵略性,可能导致数据包以有损的方式组合(丢弃重要的标题数据),而GRO则更具限制性。
特别是LRO似乎在软件桥接和/或转发的环境中是有问题的,这在虚拟化设置中是很常见的。
禁用这些卸载可能是您在debugging奇怪的性能问题时应该做的第一件事情。