内容


在 IBM Bluemix 中扩展应用程序

使用 Bluemix 中的 Auto-Scaling 插件优化应用程序性能

Comments

您一定喜欢 Bluemix 在部署应用程序上的简单性,但现在我们要继续考虑性能和可扩展性。Bluemix 提供了哪些功能来帮助扩展应用程序?

Bluemix 提供了通过垂直和水平扩展来优化应用程序的性能和可扩展性的功能。本文介绍可扩展性的基本知识和 Bluemix 目前提供的众多功能,并提供一个使用 Bluemix Auto-Scaling 插件优化 Java 应用程序的示例。

扩展类型

Bluemix 包含两种扩展应用程序的不同方法:垂直扩展水平扩展。两种技术可同时应用于同一个应用程序。

垂直扩展

垂直扩展通常被称为向上 (scale up) 扩展。垂直扩展通过直接向各个节点添加容量来增加可供应用程序使用的资源,例如,添加更多内存或增加 CPU 核心数。图 1 通过向应用程序增加内存和 CPU,演示了垂直扩展的概念。

图 1. 垂直扩展
该图演示了通过向应用程序添加内存和 CPU 来进行垂直扩展
该图演示了通过向应用程序添加内存和 CPU 来进行垂直扩展

一些资源更改需要重新启动,这会产生应用程序宕机时间。垂直扩展技术通常会改善任何应用程序的性能,但这些改善可能不是线性的。

水平扩展

水平扩展常常称为向外扩展 (scale out)。通过添加完整的节点来增加总体应用程序资源容量。每个额外的节点会添加同样的容量,比如相同的内存量和 CPU。水平扩展的实现通常无需宕机。图 2 演示了水平扩展的概念,可以看到应用程序节点之前的一个负载平衡器添加了更多的相同节点。

图 2. 水平扩展
该图演示了水平扩展,可以看到应用程序节点之前的负载平衡器添加了更多的相同节点
该图演示了水平扩展,可以看到应用程序节点之前的负载平衡器添加了更多的相同节点

Bluemix 提供了内置的负载平衡功能,所以无需部署或管理这些功能。Bluemix 还提供了一种机制来部署为应用程序附加的相同节点。

水平扩展常常会实现近线性的扩展结果,但前提是应用程序的设计具有可扩展性。这种设计至关重要,不仅是对应用程序的性能方面:如果应用程序的设计不支持水平扩展,应用程序在开启水平扩展时甚至可能无法正常运行。

选择水平扩展时的应用程序考虑因素

有许多文章专门介绍了设计云应用程序的最佳实践。作为该主题的一个不错、实用的起点,我们建议您阅读 developerWorks 上的 “关于云应用程序的 9 条重要规则”。这里不打算涉及太多的细节,我们的介绍仅涉及一些重要区域,让您知道为什么应用程序设计如此重要:

  • 设计和开发一个容易伸缩的解决方案。例如,一个实例中的一项长期运行的任务,该任务可能使实例无法在解决方案必须缩小时轻松地关闭。
  • 不要假设代码会始终在某个特定实例上运行。在水平扩展应用程序时,来自同一个来源的一系列请求可能不会被路由到同一个实例。
  • 考虑应用程序的端到端性能。您的应用程序资源将会得到扩展。但是,扩展它们会给所有网络和后端服务带来更多的压力。特别是在您的应用程序访问企业资源的时候,您应该认识到,在扩展应用程序层的时候,后端上的额外压力不会成为瓶颈。
  • 不要假设继续申请更多应用程序资源是提高性能的最佳方式。如果应用程序存在内在的瓶颈,那么在基础应用程序中执行有效的性能分析和改进就会从每个实例提升性能。

自动扩展

自动扩展是动态分配或解除分配应用程序所需的资源,以便满足性能需求和服务水平协议 (SLA) 的过程。基于流量的增长,应用程序可能需要额外的资源,以便及时地、有效地、高效地执行其任务。

自动扩展是一个弹性过程,在负载增加时会配备更多的资源,在对资源的需求减弱时会解除配备资源。自动扩展旨在优化性能来满足 SLA,从而避免过度配备资源。自动扩展有助于减轻管理工作,它可以自动监视系统的性能,不需要操作员就可以决定是否添加或删除资源。

Bluemix 手动资源扩展

Bluemix UI 和命令行可通过增加内存量和增加应用程序运行时的实例数来支持垂直和水平扩展。两种技术可以同时应用于同一个应用程序。图 3 显示了在 Bluemix Liberty for Java 运行时中手动增加实例数量和内存资源的方法。

图 3. 水平和垂直扩展资源的 Bluemix Liberty for Java 运行时
该插图显示了在 Liberty for Java 运行时中手动增加实例数量和内存资源的方法
该插图显示了在 Liberty for Java 运行时中手动增加实例数量和内存资源的方法

Bluemix Auto-Scaling 插件

Auto-Scaling 插件根据策略来监视所选的资源,并相应地增加或减少实例数量。可以定义针对 CPU 利用率、内存和堆利用率度量指标的策略。

Bluemix 提供了一个可在目录中选择使用的自动扩展插件。从目录的搜索框旁边的列表中选择 Add-Ons 类别。从可用的 DevOps 插件中选择 Auto-Scaling,创建一个实例,并将该插件 “绑定” 到您的应用程序。

Bluemix Auto-Scaling 插件用于管理应用程序的向上和向下扩展。扩展决策是基于一组可配置的策略来制定的。我们在试验中使用的策略配置已在本文的 “在 Bluemix 中配置和测试 Auto-Scaling 插件的过程” 一节中提供。Auto-Scaling 服务提供了一组默认的自动扩展策略,但我们不建议采用默认策略。最好根据应用程序的性能测试来测试并调优这些策略。

Bluemix 中的 Auto-Scaling 插件依据策略来监视所选的资源,并相应地增加或减少实例数量。可以定义针对 CPU 利用率、内存和堆利用率度量指标的策略。表 1 给出了目前可供运行时使用的可自动扩展的触发器。基于我们的经验,不建议对 Java 应用程序使用内存触发器。

表 1. Bluemix Auto-Scaling 插件支持的资源和运行时
可自动扩展的资源描述支持的运行时
CPU 使用的 CPU 百分比 Java 和 Node.js
JVM 堆 使用的 JVM 堆内存百分比 Java
内存 使用的内存百分比 Java(不推荐)、Node.js 和 Ruby

Bluemix 实现了扩展的自动化。图 4 演示了如何通过 Bluemix 插件实现自动扩展过程。

图 4. Bluemix Auto-Scaling 插件的工作原理
该图演示了 Bluemix 自动扩展过程
该图演示了 Bluemix 自动扩展过程

此过程是全自动化的,而且对应用程序是透明的。我们将在示例中看到,度量指标和扩展决策可在 Bluemix 控制台中进行查看:

  1. Bluemix Auto-Scaling 插件将一个代理注入运行时,以便捕获应用程序进程的性能数据。
  2. Bluemix Auto-Scaling 插件依据所选的策略来监视性能度量指标,决定何时 扩展多少个 实例。
  3. Bluemix Auto-Scaling 插件请求布置控制器来执行扩展操作。
  4. Bluemix 布置控制器根据不同的参数来决定在何处 创建实例。
  5. Bluemix 布置控制器发出一个请求并启动这些实例。

在 Bluemix 中配置和测试 Auto-Scaling 插件的过程

我们使用了一个从 IBM DevOps Services 下载的 Java 应用程序,对 Auto-Scaling 插件进行了试验。但是,您应该使用自己的 Java 应用程序进行测试,以确定您的策略设置。在负载生成方面,我们使用了 Rational® Performance Tester。以下是我们的 Java 自动扩展试验所采取的步骤。

第 1 步:创建和部署 Java 应用程序

创建应用程序并将它部署到 Bluemix 中。可以从 DevOps Services 或命令行部署应用程序。如果没有 Java 应用程序,那么可以使用这些试验中的示例 Java 应用程序。如果使用命令行和我们的示例应用程序,请执行以下步骤:

  1. 下载 BlueMixM-AutoScalingV1.0.war 并将它保存在一个目录中:
  2. 导航到该目录并运行:
    cf push appname -p BlueMixM-AutoScalingV1.0.war

备注:您需要在配置 Auto-Scaling 插件后重新推送(repush)您的应用程序。

将 Java 应用程序部署到 Liberty 运行时上时,它在一个 JVM 堆中运行。如图 5 所示,一个进程中的所有线程都共享一个堆。随着更多请求传入应用程序,平均 JVM 堆的消耗会增加。考虑到垃圾收集,我们的测试表明,监视平均 JVM 堆大小是自动扩展应用程序的一个合理触发器。但是,您应用程序堆的使用情况可能有所不同,所以对您自己的应用程序执行性能测试很重要。

图 5. 每个应用程序实例使用的堆
该图表明随着应用程序收到更多请求,使用的平均 JVM 堆大小会增加
该图表明随着应用程序收到更多请求,使用的平均 JVM 堆大小会增加

第 2 步:收集应用程序的无负载基准度量指标

开始任何测试之前,在 Bluemix 中捕获应用程序的基准统计数据。如图 6 所示,对于我们的测试,在 Web 应用程序上执行任何负载测试之前,堆使用量为 27.93MB。

图 6. 初始 JVM 堆使用情况(无负载)
堆使用情况测试结果的屏幕截图
堆使用情况测试结果的屏幕截图

第 3 步:对应用程序运行一次负载测试(不使用 Auto-Scaling 插件)

捕获无负载的基准度量指标后,就可以开始执行负载测试。负载测试应能代表您预计您的站点会收到的请求组合。测试应逐步增加负载,并捕获稳定状态的度量结果。您需要了解吞吐量的稳定水平,响应时间何时开始降级,以及出现性能急剧下降的任何悬崖 (cliff)

不仅应对一个实例运行测试,还应使用手动扩展来测试多个实例的水平扩展能力。如果手动应用水平扩展没有带来好处,那么自动扩展也是如此。请记住,在扩展应用程序层时必须监视任何后端服务,因为在水平扩展过程中后端层很容易成为瓶颈。

我们使用 Rational Performance Tester 和 Apache JMeter 工具运行了一次负载测试。

第 4 步:使用单个实例收集并分析初始负载测试结果(不使用自动扩展)

在这一步中,从性能测试工具、Bluemix 性能监视器和您对应用程序使用的任何其他监视工具收集度量指标。仔细查看吞吐量和响应时间结果。使用该数据了解应用程序在达到稳定水平的吞吐量之前处理了多少负载,响应时间何时降低到 SLA 之下,以及任何特定的响应时间峰值或吞吐量峰值何时出现。

还要寻找任何错误提供页面。在高负载条件下,一些应用程序会开始生成错误。因为返回错误通常比完成请求更快一些,而这些错误可能会降低响应时间度量指标。这是一种不好的情形:您有一个无法运行的应用程序,如果您仅监视响应时间而不监视成功结果,那么您将无法认识到这一点。

图 7 显示了我们使用单一实例的测试的吞吐量。我们的吞吐量稳定水平在每秒 54 个请求左右;但是,在高负载条件下,发生了明显的吞吐量下降。响应时间(如图 8 所示)随着应用负载的增加而继续增加。

图 7. 单一实例的吞吐量度量结果(未使用自动扩展)
吞吐量测试结果的屏幕截图
吞吐量测试结果的屏幕截图

了解应用程序的基准负载动态后,让我们分析一下来自 Bluemix 的度量指标,看看哪些度量指标与应用程序性能中的模式有关联。最重要的最终用户度量指标可能是响应时间,所以我们关注的重点是相应的度量指标,这些指标与响应时间开始朝低于 SLA 的方向线性下降相对应,我们还关注在出现这种情况时的吞吐量扩展方式。您还应该分析响应时间中的任何峰值或吞吐量警戒值。

当前的 Bluemix Auto-Scaling 插件中可用作扩展触发器的潜在度量指标包括平均 JVM 大小、CPU 和内存。对于我们的应用程序,经证明平均 JVM 堆大小是 3 个目前可用的度量指标中最有效的一个。在图 8 中可以看到,平均 JVM 堆大小与平均响应时间的增加密切相关。

图 8. 一个实例的平均 JVM 堆大小度量指标和平均响应时间(未使用自动扩展)
平均 JVM 堆大小度量指标和平均响应时间的屏幕截图(单个实例,未使用自动扩展)
平均 JVM 堆大小度量指标和平均响应时间的屏幕截图(单个实例,未使用自动扩展)

如果这些度量指标中没有一个与您的应用程序具有紧密关系,那么可以使用 Bluemix 命令行接口设置一个外部监视功能,使用响应时间等度量指标来触发扩展。外部 性能管理 功能现在可以通过 IBM Service Engage 以 SaaS 模式使进行用,这使得在您的 Bluemix 应用程序中试用这些功能变得很容易。

备注:性能度量结果是在一个共享的开发级系统上进行收集的。我们无法保证这些度量结果在常用系统上仍然是相同的。实际结果可能有所不同。您应验证适合您的特定应用程序和环境的数据。

第 5 步:使用两个实例收集并分析初始负载测试结果(不使用自动扩展)

在这一步中,执行上一步中的相同负载测试来测试水平扩展能力,但手动添加了应用程序的一个实例。

图 9 显示了来自使用两个实例的测试的吞吐量。我们的吞吐量稳定水平高了很多,保持在每秒 80-85 个请求的水平,平均响应时间很好地保持在我们的目标范围内。

图 9. 两个实例的吞吐量度量结果(手动添加一个实例)
吞吐量测试结果的屏幕截图(两个实例,手动添加了一个实例)
吞吐量测试结果的屏幕截图(两个实例,手动添加了一个实例)

在应用水平扩展后,吞吐量(从图 7 到图 9)和响应时间(从图 8 到图 10)的一致性得到了改善。类似地,可以看到平均 JVM 堆大小很稳定(从图 8 到图 10)。

图 10. 两个实例的平均 JVM 堆大小度量指标和平均响应时间(未使用自动扩展)
平均 JVM 堆大小度量指标和平均响应时间的屏幕截图(两个实例,未使用自动扩展)
平均 JVM 堆大小度量指标和平均响应时间的屏幕截图(两个实例,未使用自动扩展)

我们的应用程序的水平扩展明显改善了总体吞吐量,并降低了平均响应时间。但是,通过手动技术执行水平扩展,需要一个人来监视所有实例,否则增加的扩展容量甚至在不需要时也会始终开启。在不需要实例的时候运行实例可能会增加成本。

因此,我们前进到下一步,看看通过使用自动扩展功能,如何在更多的工作负载导致响应时间增加时动态地让另一个实例上线,并在负载减少时删除该实例。

第 6 步:配置 Bluemix 中的 Auto-Scaling 插件

要配置应用程序的自动扩展,可以从 Bluemix 目录中选择 Auto-Scaling 插件。该插件现在已包含在您的应用程序中,如图 11 所示,并已经可供配置。

图 11. Auto-Scaling 插件
Bluemix Auto-Scaling 插件的概述页面的屏幕截图
Bluemix Auto-Scaling 插件的概述页面的屏幕截图

单击 Auto-Scaling 插件中的 Open Dashboard 链接并配置触发自动扩展的策略。在该配置中,您可以根据三个度量指标 来扩展应用程序:CPU、内存和 JVM 堆。

基于所选的度量指标,可以使用不同的自动扩展策略配置。在此示例中,我们配置了一个针对 JVM 堆度量指标的策略,以便在上限阈值超过堆的 50% 时进行扩展,在下限降低到堆的 20% 以下时精减。这些阈值的选择应该与响应时间目标一致。图 12 显示了我们的 Auto-Scaling JVM 堆策略。

图 12. JVM 堆的示例策略配置
Bluemix Auto-Scaling 插件的配置页面的屏幕截图
Bluemix Auto-Scaling 插件的配置页面的屏幕截图

第 7 步:执行相同的负载测试(使用自动扩展)

对多个实例执行之前执行的相同负载测试。这一次,随着负载的生成,Bluemix 会根据配置好的策略来监视 JVM 堆度量指标。如果 JVM 堆达到扩展或精减度量指标,则会自动添加或删除应用程序的实例。

第 8 步:查看自动扩展结果

正常情况下,我们会告诉您首先查看吞吐量和响应时间度量指标,但我们知道您一定会查看应用程序是否已自动扩展。您可以在 Auto-Scale 插件仪表板上查看 Scaling History,如图 13 所示。可以看到,基于配置的触发器,自动扩展功能会在负载增加时自动添加一个新实例,在测试负载减轻时,它会自动删除附加的实例。

图 13. 扩展历史
Auto-Scaling 历史页面的屏幕截图
Auto-Scaling 历史页面的屏幕截图

如果单击 Metrics Statistics 选项卡,就可以看到触发扩展的实际的 JVM 堆度量结果,如图 14 所示。

图 14. 平均 JVM 堆大小度量指标统计数据
Metric Statistics 页面中平均 JVM 堆大小度量指标的屏幕截图
Metric Statistics 页面中平均 JVM 堆大小度量指标的屏幕截图

在图 14 中可以看到:

  • 随着负载增加和堆大小增长到超出(自动扩展策略中配置的)上限,会通过扩展来增加堆峰值和实例数。
  • 向外扩展后,随着负载分散在多个实例上,堆大小会降低。
  • 随着测试完成且负载下降到自动扩展策略配置中配置的下限阈值之下,会通过自动精减来删除这些实例。

第 9 步:检查吞吐量(使用自动扩展)

现在看看自动扩展是否改善了应用程序的性能动态。吞吐量度量结果(如图 15 所示)拥有每秒大约 50 个请求的初始吞吐量稳定水平,在单一实例测试中响应时间逐步降级。

图 15. 使用自动扩展的吞吐量度量结果
使用自动扩展的吞吐量测试结果的屏幕截图
使用自动扩展的吞吐量测试结果的屏幕截图

但是,在此测试中,在达到自动扩展配置策略的上限阈值(Java 堆)时,会添加额外的应用程序实例来实现更高的性能,如图 16 所示。

在图 15 中,随着第二个实例的添加,最大吞吐量达到了每秒 80 个请求的第二个稳定水平,响应时间稳步下降到我们的目标范围内。

图 16. 平均 JVM 堆大小度量指标和平均响应时间
平均 JVM 堆大小度量指标和平均响应时间的屏幕截图(使用自动扩展)
平均 JVM 堆大小度量指标和平均响应时间的屏幕截图(使用自动扩展)

图 15 中的吞吐量与 图 9 中手动扩展后的两个实例的测试结果相似,这表明自动扩展有助于在没有手动干预的情况下实现类似的结果。随着自动扩展配置策略下降到下限阈值,实例会精减,因为使用单个实例就可以处理该负载。

结束语

本文介绍了 Bluemix 中提供的垂直和水平扩展应用程序的功能。通过一个分步示例,我们展示了如何配置 Bluemix Auto-Scaling 插件,基于 Java 堆度量指标触发器来自动扩展和精减 Java 应用程序。Auto-Scaling 插件会自动监视 Bluemix 应用程序的性能,基于所选的度量指标阈值设置来添加和删除容量。自动扩展和精减有助于优化与配备的资源和操作监视需求相关的应用程序性能。

在本教程中使用到的 Bluemix Service:


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Cloud computing
ArticleID=992193
ArticleTitle=在 IBM Bluemix 中扩展应用程序
publish-date=12112014