文档章节

翻译:改善OpenStack上DHCP的性能

Hochikong
 Hochikong
发布于 2014/08/12 15:30
字数 1645
阅读 214
收藏 0
你有没有碰到过openstack中,VM失去ip地址的问题?如果有的话,你知道那可能是什么问题
——特别是如果你拥有大量的节点和VM。你的客户会因为没有明显原因却断了与VM的连接而感到
挫败。甚至云的支持团队会为log文件里没有提示却出现问题感到挫败。

听起来很熟悉?

在这篇blog里,我将会分享我的一些关于Openstack网络的经验,特别是承担为VM分配ip地址的责任的DHCP子组件。

为什么我们会把问题归咎于DHCP组件?因为这些特定的问通常都是由这个小但明显微不足道的OpenStack组件导致的。

DHCP agent和DNSmasq
在openstack中,neutron-dhcp-agent为实例提供ip地址。理论上,neutron-dhcp-agent可以支持多种
后端,但现在它只支持dnsmasq。当启动一个实例时,分配和配置(ip)的程序包含一个在dnsmasq config中
储存ip地址的进程,接着启动或reload dnsmasq。通常,openstack在每个网络中只有一个neutron-dhcp-agent
负责spawn一个dnsmasq,所以一个庞大的网络(包含所有子网)中只会有一个dnsmasq提供服务。理论上,
并且根据实用的实验室测试,dnsmasq应该能每秒处理1000个DHCP请求,但这里有些事实要说明下:

1.租赁时间。默认情况下是120s,你大概会知道,在租赁时间内,dhcp客户端会尝试中途延长租赁时间。这意味着
每个VM会一分钟更新一次他们的ip地址。

2.去启动一个包含65535个静态租赁的DNSmasq实例几乎需要4分钟(3分43秒)。一般这会发生在neutron为
新的VM分配新的ip地址,接着强行reload DNSmasq时。在此时,将没有DHCP服务会为相应的私有Neutron网络
提供服务。

3.如果你没有在dnsmasq的配置中使用no-ping选项——这是应归于对安全担忧的openstack的默认设置——
你会因非常慢的服务速度感到痛苦,因为在dnsmasq中,一个分开的pinger进程会被用于检查所提供的ip地址是
否已经在使用中。包含no-ping选项,dnsmasq将能在10分钟内为160个请求提供服务并且不会失去它们,尽管
这依赖于核心速度和CPU速度。

4.Ubuntu和CentOS有mac地址表(neighbour table)被限制到/128/512/1024(net.ipv4.neigh.default.gc_thresh1/2/3)
个记录。因为如此,不经常使用的 IP 记录将会异常快速老化(IP records that are not frequently used will age abnormally fast)
这会影响网络性能并拖慢系统把流量发送至dhcp agent所在节点上的正确的mac地址的能力。

5.企图通过显著的增加ip的租赁时间去解决这些性能问题,这会导致neutron释放ip地址这方面的大问题
(如果你的云负载均衡地改变)。默认情况下,neutron会为一个VM分配一个ip地址达24小时(neutron will allocate an IP address to a VM for 24 hours),独立于实际的租赁时间。当然,默认情况下,neutron不会为已经终止了的实例提供ip地址
直至24小时。


你可以采取的措施
幸运的是,你可以做点事解决问题,如果你使用openstack并拥有一个地址空间大于255个地址(/24)的私有网络,
接着你应该考虑调整dnsmasq和network节点自身的默认参数。

1.增加ip的租赁时间以减少每秒来自VM的尝试更新ip地址的请求数量。根据一般的场景计算新的租赁时间,
记住虚拟机生命周期的平均时间。由于一个Bug,设置太大的租赁时间值会强迫OpenStack在数据库中保留这个ip地址为
“used”的状态。即使VM已经被删除,因为neutron的租赁时间在数据库中,neutron将不会释放这个ip地址。

2.增加MAC地址表的尺寸使其能服务至少一千个主机。要做到这样,典型地,你可以设置dhcp-agent所在主机
的sysctl变量(通常在/etc/sysctl.conf)。视情况,你可以在所有与网络有关的节点执行以下操作,这些变量
如此设置:

net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 4096
net.ipv4.neigh.default.gc_thresh3 = 8192

3.为DNSmasq的默认参数加上no-ping选项。这个改变能够使其每秒处理多10-20个请求,因为在被实际分配之前,
dnsmasq无需再尝试ping那些ip。如果你使用openstack作为你的基础设施的一部分,记住,你必须谨慎地考虑这个
选项。比如,如果你正使用提供者网络(provider networks)并且你的VM与其他物理服务器、设备、等等是单一
L2域的组成部分,ip冲突是可能发生的的,可以造成严重破坏。


Neutron社区必须思考的改变
不幸地,在neutron中没有任何办法能为用户解决24小时ip分配的问题(the problem of 24 hour IP allocation),
这个问题应该从neutron自身的改变去解决。一个简单的解决方法是在neutron或dhcp-agent中增加一个可配置的参数
以修改租赁时间,并把它用作neutron数据库中的分配周期。这个方法表面看上去很完美但是仔细检查一下,你会意识到
这会大大增加neutron-api/neutron-db的负载。所以这不是一个正确或不正确的方法去解决问题。

取而代之的是,neutron应该在实例被终止时简单地从数据库中移除ip地址。这会解决所有问题并在云上实现
动态负载和ip地址的完美重用。(实际上,这恰好是Icehouse版本的情况,尽管目前问题有所减轻)

结论
正如我说的,我的所述只是覆盖了一个很小的OpenStack网络的子组件——DHCP服务。正如你所看到的,
如果配置不正确,特别是当你使用了DNSmasq的默认选项将会导致许多痛苦。上面我所推荐的希望能帮助你
了解如何选择具体的DNSmasq选项和如何根据情况调整他们

© 著作权归作者所有

Hochikong
粉丝 19
博文 113
码字总数 59961
作品 1
广州
程序员
私信 提问
改善OpenStack上DHCP的性能

你有没有碰到过OpenStack中,VM失去IP地址的问题?如果有的话,你知道那可能是什么问题 ——特别是如果你拥有大量的节点和VM。你的客户会因为没有明显原因却断了与VM的连接而感到 挫败。甚至...

Hochikong
2014/08/12
6.4K
9
安装OpenStack QUEENS版本四:neutron

mysql -uroot -ppassword -e "CREATE DATABASE neutron" mysql -uroot -ppassword -e "GRANT ALL PRIVILEGES ON neutron. TO 'neutron'@'localhost' IDENTIFIED BY 'password'" mysql -uroot......

OpenStack2015
2018/08/06
0
0
Fuel 5.1安装openstack I版本环境 (ESXi)

Fuel 简介 Fuel是Mirantis公司开发的部署openstack集群工具,主要功能为裸机PXE安装操作系统,master节点提供DHCP、TFTP服务,能够实现openstack服务编排,通过puppet进行配置服务管理,此外...

剑气满天
2015/08/18
2.7K
0
OpenStack centos版安装(二)

在OpenStack第一天文档翻译后,丁丁努力坚持每晚抽时间翻译OpenStack官方网站提供的安装与部署指南,本文翻译自官方安装与部署指南的前四章内容,前四章内容主要是对OpenStack整体安装步骤以...

蓝狐乐队
2014/04/18
268
0
OpenStack 的 HA 方案

根据服务自身状况,HA 分为 Active/Active 和 Active/Passive 两种 Active/Active: 适合于 stateless/stateful 服务,常用 Load Balancer + Keepalive(VIP) 配置 HA Active/Passive: 适用于 ......

koala bear
2014/10/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MainThreadSupport

MainThreadSupport EventBus 3.0 中的代码片段. org.greenrobot.eventbus.MainThreadSupport 定义一个接口,并给出默认实现类. 调用者可以在EventBus的构建者中替换该实现. public interface ...

马湖村第九后羿
31分钟前
3
0
指定要使用的形状来代替文字的显示

控制手机键盘弹出的功能只能在ios上实现,安卓是实现不了的,所以安卓只能使用type类型来控制键盘类型,例如你要弹出数字键盘就使用type="number",如果要弹出电话键盘就使用type="tel",但这...

前端老手
41分钟前
5
0
总结:Raft协议

一、Raft协议是什么? 分布式一致性算法。即解决分布式系统中各个副本数据一致性问题。 二、Raft的日志广播过程 发送日志到所有Followers(Raft中将非Leader节点称为Follower)。 Followers收...

浮躁的码农
49分钟前
5
0
Flask-admin Model View字段介绍

Model View字段介绍 can_create = True 是否可以创建can_edit = True 是否可以编辑can_delete = True 是否可以删除list_template = 'admin/model/list.html' 修改显......

dillonxiao
今天
5
0
从AnnotationTransactionAspect开始rushSpring事务

0. Spring 事务 with LTW 0.1. Spring 事务 With LTW的原因: Pure Proxy-base mode有缺陷,其失效原因分析及使用方法及运行机制(LoadTimeWeaverBeanDefinitionParser和 AspectJWeavingEnable......

Aruforce
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部