改善OpenStack上DHCP的性能 【已翻译100%】

你有没有碰到过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地址的进程,接着启动或重载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个请求提供服务并且不会失去它们,尽管这依赖于核心(core)速度和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选项和如何根据情况调整他们

时间: 2024-11-13 09:38:21

改善OpenStack上DHCP的性能 【已翻译100%】的相关文章

Groovy 现在可运行在 Android 系统上了! 【已翻译100%】

在最近的GR8Conf Europe 2014期间,SpringSource/Pivotal的Groovy高级软件工程师 Cédric Champeau已经在Andriod上完成一次Groovy代码的现场pull请求的合并. Groovy开发人员为了在Android上运行Groovy已经等待好几年了.因为各种困难,它的实现被推迟了,这包括Andriod Dalvik虚拟机的不同字节码和Groovy代码的动态特性等.官方对Android的支持可能在Groovy2.4版本.InfoQ采访了 Cham

远程执行 Android 设备上的代码 【已翻译100%】(2/2)

我设置好AP后,从13,119个标明有潜在漏洞的app中随机选了一些,把它们安装到接入了AP的一台Nexus 5(运行4.4.3)和一台三星XE700t(运行AOSP 4.2的x86平板).我们只不过是启动每个App,做些简单的交互操作,就成功地在超过半数的应用中触发了远程代码执行,它们加载了通过中间人代理注入的恶意代码. 为了好玩,我们把注入到一个app中javascript代码反复修改,直到显示Bromium的标志替换了原有广告. 被扰乱而显示了Bromium标志的app的UI截屏. 全是广

远程执行 Android 设备上的代码 【已翻译100%】(1/2)

"你走进一个咖啡店坐下来.等咖啡的时候,你拿出你的智能手机开始玩一款你前些天下载的游戏.接着,你继续工作并且在电梯里收邮件.在你不知情下,有攻击者获取了公司网络的地址并且不断地感染你所有同事的智能手机. 等下, 什么? 我们在Bromium实验室博客上不会谈论Android太多.但是不时地我们喜欢修修补补.近来,我的同事Thomas Coudray 和我探索了下Android远程代码执行的易损性,想弄明白易损性在现实应用中是多大的问题. 尽管权限提升技术在Android上很普遍(并形成了&quo

AngularJS 性能优化二三事 【已翻译100%】

在过去的两年中,angularjs 的使用率有了很大的提升.简单的双向绑定是促使其流行的主要原因之一,但与此同时,它导致了在一个应用中出现了大量的 watcher.在后台,angularJS 会执行所谓的 "脏值检查".之所以要做脏值检查目的是为了检查在 "scope" 中的数据是否发生了变化;框架必须周期性的检测数据是否发生了变化- 脏值检查会每 40ms 更新一次.. 想想看.. 如果它需要检查超多数据的时候; Crap!! 让我们来看看如何改善 angular

通过添加一些 gems 来提升 Rails 应用的性能 【已翻译100%】

使用Rails一段时间之后,你可能就会开始吹毛求疵的想要提高它性能.这是一系列文章中第一次考虑如何提高(即使微不足道的)Rails的性能. 我将会关注在一些gem的提速上面,在某些情况下,可能是一小部分的Rails,如html转义,String.blank?和JSON工具类. 基准原则 原则,对于仅仅在控制台wrk运行几次来讲,是一个与其过强的词语,但是我这里不是来寻找"圣杯"的,而是提供一些初始的想法. 我将从旧的apache ab切换到wrk. wrk是现代的 HTTP 基准工具,

利用 View State 缓存优化 ASP.NET 性能 【已翻译100%】

简介 ASP.NET的视图浏览机制提供了客户端的管理方式.它能够保存请求过程中的所有数据. 这对于无状态显示的协议编程如HTTP提供了方便. ASP.NET的 View State被保存在页面上隐藏的Base64字符串中, 它记录了客户端到服务器的请求以及服务端到客户端的回应信息. <input id="__VIEWSTATE" type="hidden" name="__VIEWSTATE" value="/wEPDwUJNzg

8 种提升 ASP.NET Web API 性能的方法 【已翻译100%】

ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web API 性能的技术. 1) 使用最快的 JSON 序列化工具 JSON 的序列化对整个 ASP.NET Web API 的性能有着关键性的影响. 在我的一个项目里,我从 JSON.NET 序列化工具转到了 ServiceStack.Text 有一年半了. 我测量过,Web API 的性能提升了20

在 QEMU 和 KVM 上运行 OS X Mavericks 【已翻译100%】

今天,OS X虚拟化是一件很容易搞定的事情,因为OS X主机完全支持VMware和VirtualBox. 但是在裸机和QEMU上虚拟化会是什么情况呢?在Linux下呢?最终我在QEMU上完全搞定了Mavericks (没有额外内核拓展哦(!)),不过真不容易. 工作人员 许多关于这件事的工作都归于 Gabriel L. Somlo ,他完成了这件事的初步工作,然而我不能从他的指南里得到任何干净的安装引导的OS X Mavericks 版本.因此我只能自己调试了. 为什么? 云中OS X. 这是一

在 Docker 上建立多节点的 Hadoop 集群 【已翻译100%】

在上篇文章中你已经看到了在你的devbox创建一个单点Hadoop 集群是多么简单. 现在我们提高门槛,在Docker上创建一个多点hadoop集群.在开始前,确保你有最新的Ambari镜像: docker pull sequenceiq/ambari:latest 一行命令 一旦你得到了最新的镜像,你就可以启动Docker容器.我们已经创建了几个shell 函数来帮你输入Docker命令,从而避免输入像docker run [options] image [command]这样冗长的命令. 有