如何處理Linux虛擬機網卡只能收包不能發包問題

如何處理Linux虛擬機網卡只能收包不能發包問題

摘要

在ovs場景主機與同主機上的虛擬機通信時,由於主機側服務有問題,可能導致虛擬機網卡只能收包,不能發包,該案例給出該問題的原因分析和解決辦法。

適用操作系統

Linux

適用版本

適用UVP&EVS V200R002C00 PublicCloud版本

適用產品線

FusionSphere

背景及現象描述

在ovs場景主機與同主機上的虛擬機通信時,由於主機側服務有問題(目前發現iperf-2.0.2有此問題),可能導致虛擬機網卡只能收包,不能發包,使用ifconfig查看網卡狀態,網卡收包總數RX packets項一直有增加,網卡發包總數TX packets項保持不變,ping虛擬機ip不通。如下圖所示:

如何處理Linux虛擬機網卡只能收包不能發包問題


如何處理Linux虛擬機網卡只能收包不能發包問題


原因分析

定位發現虛擬機網卡不通是因為在主機與虛擬機之間存在iperf通信。在dom0上部署iperf-2.0.2服務端,在同主機的domU上部署客戶端(iperf-c domip -d -t 3600),打流過一會就會發現domU上的網卡對外不能發包,收包正常。

定位發現虛擬機對外不能發包是因為前端環滿,domU虛擬網卡對外發包使用的是零拷貝機制,報文在轉發時不做數據拷貝,使用domU中的內存,在報文通過協議棧發給iperf服務端處理時,iperf未對報文處理,導致vring環上的buffer無法釋放,vring環一直處於滿的狀態,後續的報文無法發出。

問題出現有2個條件。

1、主機與同主機上虛擬機之間通信。虛擬機與虛擬機之間沒有問題,跨主機之間通信也不存在問題。

2、必須是主機上服務端存在問題的軟件才會導致問題,如:netperf工具就沒有這個問題,目前UVP主機與虛擬機之間有通信的服務(dhcpserver/metadata),不存在有此問題的服務。

解決辦法

將對應Linux版本的內核參數添加到Linux系統的“/boot/grub/menu.lst”文件的內核啟動參數後面即可。

1、應急解決方法:重啟dom0上的與虛擬機有通信的服務端程序,網絡可以恢復。

2、排查出問題的服務,解決服務端BUG。


分享到:


相關文章: