性能效率

已完成

假设发布了一则有关贵组织某个最新产品公告的新闻报道。 新闻报道带来的额外宣传效果会为你的网站带来巨大的流量。 网站能否应对这种流量突增? 网站是否能承受高负载,而不会变得缓慢甚至无响应?

本文将会探讨确保优异的应用程序性能的一些基本原则。 特别是构成性能效率支柱的缩放和优化原则。

什么是性能效率?

性能效率是指将提供给应用程序的资源量与应用程序收到的需求量进行匹配。 性能效率包括缩放资源、识别和优化潜在瓶颈,以及优化应用程序代码来获得峰值性能。

让我们看看一些可以增强应用程序可伸缩性和性能的模式和做法。

纵向扩展和横向扩展

计算资源可朝两个方向进行扩展:

  • 纵向扩展是指向单个实例添加更多资源。 也称为垂直缩放

    An illustration that shows scaling up by adding resources to a virtual machine.

  • 横向扩展是指添加更多实例。 也称为水平缩放

    An illustration that shows scaling out by adding instances to increase performance.

纵向扩展涉及到向单个实例添加更多资源(如 CPU 或内存)。 此实例可以是虚拟机或 PaaS 服务。

向实例添加更多容量可以增加提供给应用程序的资源量,但存在一个限制。 虚拟机的容量限制为运行这些虚拟机的主机的容量,而主机本身存在物理限制。 最终,在纵向扩展某个实例时,可能会遇到这些限制。 这些限制使你无法向该实例添加更多资源。

横向扩展涉及到向服务添加更多实例。 这些实例可以是虚拟机或 PaaS 服务。 横向扩展不是通过使单个实例变得更强大来添加更多的容量,而是通过增加实例的总数来添加容量。

横向扩展的优点是,只要还有更多的计算机可添加到体系结构,你就可以根据设想不断地进行横向扩展。 横向扩展需要某种类型的负载分配。 例如,使用负载均衡器在可用的服务器之间分配请求,或者使用服务发现机制来识别要向其发送请求的活动服务器。

在这两种扩展中,资源都可以减少,从而实现成本优化。

自动缩放是动态分配资源以满足性能需求的过程。 当工作量增大时,应用程序可能需要更多资源来维持所需的性能级别和满足服务级别协议 (SLA)。 当需求降低,不再需要已添加的资源时,可以取消分配资源,最大程度地降低成本。

自动缩放可以利用云托管环境的灵活性,同时降低管理开销。 这样就不怎么需要操作员持续监视系统性能并做出添加或删除资源的决策。

优化网络性能

优化性能时,需要查看网络和存储的性能,确保其级别在可接受的限制范围内。 这些性能级别会影响应用程序的响应时间。 为体系结构选择适当的网络和存储技术有助于确保向使用者提供最佳的体验。

在服务之间添加一个消息层可能对性能和可伸缩性有利。 消息层会创建一个缓冲区,以便在接收应用程序无法跟上进度时,请求可以继续流入且不出错。 在应用程序处理请求的过程中,它们会按照请求的接收顺序予以应答。

优化存储性能

在许多大型解决方案中,数据分割成独立的分区,而这些分区可以单独进行管理和访问。 必须慎重选择分区策略,才能最大程度地提高效益,将负面影响降到最低。 分区可以改善可伸缩性、减少争用,以及优化性能。

在体系结构中使用缓存可帮助改进性能。 缓存是存储频繁使用的数据或资产(网页、图像)以加快检索速度的机制。 你可在应用程序的不同层中使用缓存。 可在应用程序服务器与数据库之间使用缓存,以减少数据检索时间。

还可以在用户与 Web 服务器之间使用缓存,方法是将静态内容放在更靠近用户的位置。 此缓存类型会减少向用户返回网页所需的时间。 这种做法产生的一个次要效果是转移来自数据库或 Web 服务器的请求负载,提高其他请求的性能。

确定应用程序中的性能瓶颈

云中运行的分散式应用程序及服务是由许多移动部件组成的复杂软件片段。 在生产环境中,重要的是能够跟踪用户使用系统的方式。 跟踪资源利用率以及在一般情况下监视系统的运行状况和性能也很重要。 你可以将此信息用作辅助诊断手段来检测和更正问题。 还可以使用此信息来帮助找出潜在问题并避免它们发生。

性能优化包括了解应用程序本身的性能。 通过应用程序性能管理工具可以揭示相关系统中的所有错误、性能不佳的代码和瓶颈。 这些问题往往对用户、开发人员和管理员是隐藏的或者含混的,但它们可能对应用程序的整体性能造成不利影响。

检查应用程序的所有层,识别并补救性能瓶颈。 这些瓶颈可能体现在应用程序中的内存处理不佳,甚至是在数据库中添加索引的进程出现问题。 它可能会反复出现,在解决一个瓶颈后,又会出现另一个你不了解的瓶颈。

使用全面的性能监视方法,你就可以确定什么类型的模式和做法有益于体系结构。

知识检查

1.

以下哪一项是纵向扩展(垂直缩放)示例?

2.

以下哪一项是横向扩展(水平缩放)示例?