网卡驱动引起openstack的mtu问题
一套Pike版本的openstack测试环境,使用vlan模式的网络,数据网网卡使用的是绿联的usb百兆网卡,遇到了虚拟机网络异常的问题。同一个vlan下,不同宿主机上的两台虚拟机,相互之间可以ping通,但是不能ssh。
ICMP能通,说明链路没有问题,ssh走的是ssh协议,不通的话,最常见时两种情况,一种是防火墙安全组禁用了ssh的端口,经过排查,发现不是这个问题。
另一种情况可能是MTU设置错误的问题。
按照以太网早期的设计,链路层最大传输的数据的长度(MTU)最小46个字节,最大1500个字节(原因可以知乎搜索),如果传输的数据大小超过了1500个字节,要切分成多分小于1500的数据再交给链路层。对应的,链路层设备接受到的帧大小的范围时64-1518注1 ,如果以太网上的设备,如网卡,交换机网卡接收到的帧大小超过了1518注2,默认会直接丢弃这样的数据帧注3 。
有的时候网络通信,就是因为上层协议没有很好的根据mtu调整自己单次传输的数据大小,导致部分数据在传输过程中丢失,网络通信故障。但是对于ssh,ssh使用的是tcp协议,这个按理不会出现,tcp通信时,tcp链接的两端会根据双方以及整条线路上设备的最小mtu,协商出一个MSS,即tcp层每次传输的最大的数据,有的时候MTU设置的太大,会导致数据帧的长度超出限制,连接到某些网络失败。按理说,无论哪一个设备的mtu设置错误,都不应该影响ssh。
但是还是要试一试,现在虚拟机默认的mtu大小是1500,ssh不通,尝试将mtu调整成1499,依旧不通,1498通了。这就很奇怪了,为什么链路层支持传输的最大数据少了2字节?当时还不知道这个数据网出口时绿联的usb网卡,开始怀疑时不是vxlan相关的配置引起的bug,决定通过抓包来定位问题设备。
vlan 模式下不同宿主机上的虚拟机通信逻辑比较简单,如下图所示:

灰色设备是ovs port,类似网线的作用,蓝色是物理的或者虚拟的二层交换设备,橙色是物理的或者虚拟的网卡
尝试从vm1执行ping -s 1471 192.168.11.106,然后再物理机02上抓包,发现再eth1上抓包,没有问题,可以抓得到,在qvo上抓包,抓不到。这里要确认,是eth1把收到的包丢掉了,还是eth1把包交给qvo的过程中,包丢失了。
在物理机2上执行下面的命令:
(openvswitch-vswitchd)[root@compute01 /]# ovs-dpctl show
system@ovs-system:
lookups: hit:7589478 missed:410086 lost:0
flows: 54
masks: hit:62147619 total:10 hit/pkt:7.77
port 0: ovs-system (internal)
port 1: br-int (internal)
port 2: br-tun (internal)
port 3: eth1
port 4: br-data (internal)
port 5: qvo34b16ff1-bb
port 6: qvoe6366126-d8
(openvswitch-vswitchd)[root@compute01 /]# ovs-dpctl dump-flows | grep -r "6e:f2"
recirc_id(0),in_port(3),eth(src=fa:16:3e:a9:6e:f2,dst=fa:16:3e:07:ee:2c),
eth_type(0x8100),vlan(vid=131,pcp=0),encap(eth_type(0x0800),ipv4(frag=no)),
packets:2122, bytes:3223318, used:0.726s,
actions:pop_vlan,6
recirc_id(0),in_port(6),eth(src=fa:16:3e:07:ee:2c,dst=fa:16:3e:a9:6e:f2),
eth_type(0x0800),ipv4(frag=no), packets:1046, bytes:1582598, used:0.726s,
actions:push_vlan(vid=131,pcp=0),3
可以看到,从port3(eth1)进入的icmp包,被ovs删掉vlan id后交给port 6(qvoe6366126-d8)了, 但是我们在qvo上抓包却抓不到,说明qvo把eth1交给他的包丢掉了。
使用tcpdump -i eth1 icmp -w packages.cap 把eth4上的包保存到packages.cap中,在wireshark中打开,可以看到下面的内容:

仔细观察图中,我们发现,抓到的数据包的大小是1519字节,超过了1518字节的限制,这就是qvo丢弃他的原因吧。但是我们ping使用的是1471个字节的数据,加速8字节的icmp首部,20字节ip头部,6字节链路层源地址,6字节目的地址,2字节帧类型,4字节vlan信息,应该只有1517字节,不超过限制才对。多出来的2字节哪里来的?仔细观察,发现多出来的两字节在帧的末尾,被wireshark解析为:vssmonitoring Ethernet trailer。在qvo上抓包,发现抓到的包里面的内容不包括这部分数据,说明是包数据从qvo到eth1的途径中被加了这两个额外字节。但是为什么会有这两个字节额外字节?使用vssmonitoring + openstack在google上搜索,发现了一篇叫openstack network mystery的文章,作者遇到了一样的问题,作者的解释是:
Finally, we’ve found the 2 additional bytes! But, where do they come from? Google tells us that this can be caused by the padding of packets at the network-driver level. I reconsidered my setup and identified the USB network adapter as the weakest link. To be honest, I suspected this might be the issue from the beginning, but I never imagined it would catch up with me in this way
.
I downloaded and built the latest version of the driver and replaced the kernel module. Lo and behold, all my networking problems were gone! Pings of arbitrary payload sizes, SSH sessions, and file transfers all suddenly worked. In the end, my networking issues were caused by an issue with the driver that ships by default with the Linux kernel.
作者说是因为他的usb 网卡驱动的问题,我们使用的也是一个usb网卡,那问题看来是一样的了,去绿联官网下载最新的驱动,更新到我们的环境中,确实解决了我们的问题。
网卡驱动引起openstack的mtu问题的更多相关文章
- linux网卡驱动安装及锐捷使用
原创博文,转载请注明出处 先吐槽一下,以前装了个Centos win7双系统, 然后手贱一不小心把启动文件给删了,接下来就用grub恢复启动文件,整了一天也没搞出来还把win7的Boot Manage ...
- 26.Linux-网卡驱动介绍以及制作虚拟网卡驱动(详解)
1.描述 网卡的驱动其实很简单,它还是与硬件相关,主要是负责收发网络的数据包,它将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送, 并将接收到的数据包传递给上层协议. 网卡设备与字符设备和块 ...
- Linux网卡驱动
<网络知识> a:网络模型 OSI模型 TCP模型 虽然OSI模型看着挺完美的,但是过于复杂,这样就会导致不实用,在Linux系统中 ...
- LINUX内核升级-更新网卡驱动
因项目需要,将当前内核(2.6.32-220.el6.x86_64)升级到目标内核(2.6.33-110.el6.x86_64),但是编译的目标 内核(2.6.33-110.el6.x86_64)的对 ...
- Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)
本文将介绍网络连接建立的过程.收发包流程,以及当中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 1.应用层 对于使用socket进行网络连接的server端程序.我们会先调用socket函 ...
- Linux网卡驱动框架及制作虚拟网卡
1.概述 网卡驱动与硬件相关,主要负责收发网络的数据包,将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送,并将接收到的数据包传递给上层协议. 网卡设备与字符设备,块设备不同,网络设备驱动程序 ...
- 二十、网卡框架分析、虚拟网卡驱动和DM9621驱动分析
一.网络设备驱动的结构 网卡设备不同于字符设备和块设备, 网络设备并不对应于/dev目录下的文件,它存放在/sys/class/net目录下. Linux系统对网络设备驱动定义了四个层次: 1. 网络 ...
- linux网卡驱动更新方法
kernel: eth0: igb_reset_task: Reset adapter解决方法 1. LVS集群web项目,运行大概一个月左右出现访问慢的情况,查询mysql服务器时/var/log/ ...
- Linux网卡驱动移植--Dm9000网卡驱动分析
1. Linux网络体系结构由以下5部分组成 ① 系统调用接口: 位于Linux网络子系统的顶部,为应用程序提供访问内核网络子系统的方法,主要指socket系统调用. ② 协议无关接口: 实现一组基于 ...
随机推荐
- Linux cp 移动的时候报错
报错如下: cp: omitting directory `./nginx-1.12.1' 原因: 要移动的目录下还存在有目录 解决: cp -r 文件名 地址 注意: 这里的-r代表递归 ...
- jQuery Validate验证框架与 jQuery ajaxSubmit的联合使用
jQuery Validate验证框架自定义验证 第一步导入导入js库 <script src="<%=basePath%>static/js/jquery.js" ...
- 在阿里云上搭建自己的git服务器
这篇文章我就来介绍一下如何在一台全裸的阿里云主机上搭建自己的git服务器. 1. 安装git 首先安装git,一般而言,现在的服务器已经内置了git安装包,我们只需要执行简单的安装命令即可安装.比如: ...
- Docker几个基本常识
标签(linux): docker 此文来自本人学习以及网络整理而来. 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 对于用户来说,可能一开始在不了解的情况下会 ...
- 我的java之路week2类的无参、带参方法
2.1语法 public 返回值类型 方法名(){ //方法体 } 2.2方法的调用语法 对象名.方法名 计算平均分和总成绩 public class Score { /** * 创建类 ScoreC ...
- js的内置对象
转载: https://www.cnblogs.com/liuluteresa/p/6413988.html 在js里,一切皆为或者皆可以被用作对象.可通过new一个对象或者直接以字面量形式创建变 ...
- SQL Server中计算表达式的和
项目使用的是SQL Server数据库,需要做一个审核规则,字段A中表达式的值和字段B中的值,做比较: 需求本身很简单,但是表达式中存在很多非法字符(非法全角,运算符,汉字--) eg:1.1.1*2 ...
- ABP官方文档翻译 6.7 CSRF/XSRF保护
CSRF/XSRF保护 介绍 HTTP动词 非浏览器客户端 ASP.NET MVC 特征 集成 布局视图 配置 ASP.NET Web API 特征 集成 集成到ASP.NET MVC客户端 集成到其 ...
- Could note find result map com.xxxx.entity.UserAccountDO
原因: insert语句的标签写错:应该是parameterType,而不应该是resultType
- 51Nod 1225 余数之和 [整除分块]
1225 余数之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 F(n) = (n % 1) + (n % 2) + (n % 3) + ... ...