2009-07-02 45 views

回答

7

当我想到“大规模应用”我觉得三个非常不同的东西:

将在大型横向扩展集群(远远大于1024个核心)运行
  1. 应用。

  2. 的应用程序,将处理的数据集是比物理内存大得多。

  3. 应用具有对代码的一个非常大的源基站。

每种“可扩展性”引入了一种不同类型的复杂性,并且需要一组不同的折衷。

横向扩展应用程序通常依赖于使用MPI来协调各种进程的库。某些应用程序是“令人尴尬的并行”,并且为了完成任务(例如渲染动画电影的不同帧),需要在不同过程之间进行很少(甚至不需要)的通信。这种应用程序往往是基于CPU时钟速率或内存带宽的性能限制。在大多数情况下,添加更多内核几乎总会增加应用程序的“可扩展性”。其他应用程序需要在不同进程之间传输大量消息,以确保解决方案的进展。这种风格的应用程序往往会受限于节点之间互连的整体性能。这些消息密集型应用程序可能受益于非常高带宽,低延迟的互连(例如InfiniBand)。此类应用程序的工程可伸缩性始于最小化所有进程共享文件或资源的使用。

可扩展性的第二种风格是一个小数目的服务器(包括单一SMP服务器的风格)运行的应用程序,但处理一个非常大的数据集,或者一个非常大的一些交易。向系统添加物理内存通常会增加应用程序的可伸缩性。但是,在某些时候物理内存将被耗尽。在大多数情况下,性能瓶颈将与系统的磁盘I/O性能有关。在这些情况下,添加高性能持久性存储(例如剥离的硬盘驱动器阵列),或者甚至为某种SAN添加高性能互连可以帮助提高应用程序的可伸缩性。这种应用程序的工程可扩展性始于算法决策,这将最大限度地减少重复触摸相同数据(或设置相同基础架构)的需求,这些需求超过完成任务所需的数量(例如,打开一个到数据库的持久连接,而不是为每个事务打开一个新的连接)。

最后,还有一个与源代码库的整体尺寸可扩展性的情况下。在这些情况下,良好的软件工程实践可以帮助最大限度地减少冲突,并保持代码基础的清洁。本书Large Scale C++ Software Design是我遇到的第一个真正面临为大型源代码软件开发提供最佳实践的挑战的人。本书着重介绍C++作为实现语言,但指南和实践可以应用于任何项目或语言。工程的可扩展性为这种风格的应用程序包括作出有关的代码,以尽量减少代码库中依赖的结构高度决定(例如没有一个单一的.h,当改变将迫使重建整个代码库,使用一个构建系统将尽可能重用.o's)。

1

非常广泛,可扩展性意味着增加了系统负载可以与资产比例较小的增加,必须封来服务于负荷进行处理。

如果在你的web应用程序的负荷增加了100倍,你会怎么办?可扩展性

的一个基本原则是在处理潜在的瓶颈,包括收缩任务并行的识别和消除。但这只是一种品味。我相信你会得到很多其他同样有效的答案。

编辑:请注意,瓶颈不仅发生在实际任务处理中。他们可以进行全面的流程设置,必要的硬件操作,维护任务,重新设计/重构,您可以将其命名。

+0

这是事实,但是,可扩展性也是一个问题,当显著降低系统负载。您可能经常遇到系统中“缩小”性能问题。因此,可扩展性在广义上与增加或减少资源或客户数量的变化有关。 – jtbradle 2009-07-02 12:53:06

1

当你谈论的网页,我认为,你主要关心的是:

  • 分区你的代码是可以的,如果需要的话,可以沿着许多服务器垂直划分(对于一个请求) 。
  • 调整你的代码,这样,所有的数据(特别是会话数据),在某种全局存储(如数据库)的持久化,而不是在本地文件系统。
  • 负载平衡。

通过这种方式,您可以将一台服务器拉伸到多层(应用层,缓存层,数据库层),并在出现缩放问题时水平扩展这些层。

1

可扩展性意味着如果加载/数据可以通过一些度量N,即用户数,每天进行,等,具有一些固定的响应要求吨交易的总数,该应用程序可以被重新配置来处理测得给定O(f(n))的资源增加的任意N,其中f(n)是相同响应时间t内的线性或接近于N的线性函数。

通常这意味着应用程序使用分布式体系结构,以便可以线性添加更多服务器,应用程序服务器,Web服务器,数据库服务器以处理更多用户。即要处理两倍的用户,你需要增加两倍的数据库服务器,网络服务器,机器等。

即使在理论上这通常是不可能的,因为分配请求通常需要树状结构,以便缩放因子是O(n * log(N))。在实践中,因为您可以在树中使用较大的分支因子,与总体交易成本相比,分销成本较小,因此log(N)因子不重要。

相关问题