openstack下mtu问题只针对vxlan、gre网络。

vxlan、gre mtu计算:

vxlan mtu = 1450 = 1500 – 20(ip头) – 8(udp头) – 8(vxlan头) – 14(以太网头)
gre mtu = 1462 = 1500 – 20(ip头) – 4(gre头) – 14(以太网头)

如果mtu大于这个值的话,会导致openvswitch传输分片。


openstack官方的解决方法:

wKiom1W3RbfgUrPKAALhYxsb8Rw748.jpg

# 第一种方法可以增加隧道物理接口和交换机port的mtu,增加至1550,具体做法可以参考这篇文章: 

# 这是第二种方法,减小虚拟机网卡的mtu
[root@pxe openstack-deploy]# vim /etc/neutron/dhcp_agent.ini
[DEFAULT]
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf

[root@pxe openstack-deploy]# cat /etc/neutron/dnsmasq-neutron.conf
dhcp-option-force=26,1450

[root@pxe openstack-deploy]# grep "mtu" /etc/nova/nova.conf
network_device_mtu = 1450

注:配置完了,如果虚拟机mtu还是1500(可能是没装cloud-init缘故)

# openstack kilo版现在创建网络的时候可以指定虚拟机网卡的mtu了,详见:

原文:
When the driver sets the MTU on the network or the tenant provides it,
the values for network_device_mtu and veth_mtu are derived dynamically 
for that network and any configuration values are ignored.


如何检测合适的MTU

在本机打开dos窗口,执行: ping -f -l 1472 192.168.0.1 其中192.168.0.1是网关IP地址,1472是数据包的长度。请注意,上面的参数是“-l”(小写的L),而不是“-1”。 如果能ping通,表示数据包不需要拆包,可以通过网关发送出去。 如果出现: Packet needs to be fragmented but DF set. 表示数据包需要拆开来发送。此时,减少数据包长度,再执行上面的ping命令。从1400到1472之间多试几次,就能找到合适的数据包长度了。把数据包长度加上数据包头28字节(ip首部20字节+icmp包头8字节),就得到MTU的值。 如果检测到网关的MTU值是1500,不需要修改。 如果网关有防火墙ping不通,可以试试直接把MTU设为1400。(以上内容选自百度百科:http://baike.baidu.com/item/mtu)


修改MTU

windows虚拟机解决方法:

Windows 7(XP、Vista未实测)

1、使用管理员权限运行cmd

2、使用netsh interface ipv4 show subinterfaces命令看看MTU以及本地连接名称。

3、使用netsh interface ipv4 set subinterface "本地连接" mtu=1000 store=persistent

(注:这里的连接名是你使用上面命令看到的MTU值对应的这个连接名,他在右边显示。)

附:1、此方法不用重启;2、如是ipv6就将上面的ipv4改成ipv6


linux虚拟机解决方法:

Linux下可使用如下命令修改 需要root权限

如 ifconfig eth0 mtu 1460