你如何进行网站容量规划?

29
我刚刚读了一本书,书名为容量规划的艺术(顺便说一句,我很喜欢它),作者在书中解释了衡量服务、找出瓶颈、预测需求、确保轻松部署等方面的重要性。但他在全书中讲述了自己在Flickr的经历,这里他不断地面对同一个产品。
我们中的许多人都在为其他公司处理中小型项目。我们必须了解他们的业务、需求、计划架构、模型等等。
然后,客户说:“我需要支持1000个用户。”好吧,每个用户每秒钟请求多少次?他们的会话有多长?他们传输多少数据?他们执行哪些操作?他们的时长是多长?
有时可以知道这些数字(通过监视其现有应用程序或因为他们已经进行了这些测量),有时则不可能(因为他们没有当前的网站,或者只是无法知道)。
您如何猜测服务器数量、带宽、存储等等?您使用哪些参考数字?
谢谢。

3
这个内容可能应该发布在webmasters.stackoverflow.com上。 - the Tin Man
6个回答

21

为了做好规划,需要掌握以下几点:

  1. 每天有多少用户。
  2. 你要控制多少数据。
  3. 你要向每个用户展示多少数据。
  4. 平均每个用户可能需要的带宽。
  5. 每个用户使用你的站点的平均时间。

平均数可以给出一些月度需求的想法。当然,你也需要考虑高峰期的数字,但是当他们租用网络服务器计算机时,网站会按月提供带宽和硬盘上的一些千兆字节,所以高峰期在起始点并不是问题。在这里,您必须考虑,如果您运行需要太多内存的 SQL 查询,或者如果您与许多其他站点共享计算机。

测量

没有站点,没有经验,你实际上没有准确的测量。

  • 无论做什么,都要试图使数据/功能/流程的增长呈线性而非对数趋势。
  • 网站速度不仅取决于计算机的容量和速度。只有当计算机达到其极限时才会受到影响。如果计算机达到其极限,则添加额外的资源。但是当您设计软件和高速运行的软件时,必须注意速度。
  • 每天数据库中是否有数百万条数据?你需要更多的内存和硬盘。
  • 视频和很多大文件需要发送吗?你需要更多的带宽。
  • 站点上有使用工作的人吗?你需要更快,更稳定的速度。
  • 要创建一个电子商务网站吗?你需要更安全,更稳定的性能。

目标是同时满足所有需求,并优先考虑首先关注哪些需求。

速度规划

性能和容量是两个不同的方面。性能基于更多的人力工作,而容量基于更多的计算机资源。为了提高速度,首先需要知道如何使计算机平稳快速地运行,然后掌握一般的技巧来加速程序,特别是网络程序,最后需要花费更多时间在程序运行后,针对关键区域进行性能改进。

扩展规划

进行良好的软件设计,并考虑扩展可能性,以便向客户提供从小开始、只有在需要时才支付更多的机会。因此,在设计软件时,请像将其用于 Web 池一样思考,注意同步,注意共享资源,提供从不同服务器获取数据的能力等。

限制规划

假设客户说只有1000个用户,对于扩展和速度都不感兴趣,只需要一个成本效益高的站点来完成他的工作。在这种情况下,您也要设计符合这些限制的网站。这些限制是什么?您不会为同步放置十个检查,并使其像单线程、单池程序一样工作。您不会使用任何互斥锁、双重检查或在运行相同应用程序的2个池或2台计算机时发生的任何事件。您只需注意代码点以在需要升级时更改它们。

您也不会编写使用多计算机资源的代码。当您运行它时,必须确保它仅在一个池下运行才能正常工作。

这种单池设计更易于开发、调试、控制、更新错误代码并且成本较低,但速度较慢(一个用户在一个线程池上等待另一个用户),无法扩展资源,这实际上也与速度有关。

查找统计数据

如果您不知道可能有多少用户,则可以使用Alexa查看与您的相似站点以及每月平均用户数/平均页面浏览量。然后您就可以知道可能的带宽。

在需要之前不要购买

从您对硬件的预测开始,但不要从第一天起租用两台计算机。从第一台开始,进行测量,查看数据增长情况,只有在需要时才进行扩展。

汽车或F1?

程序运行时,如果您跟随它,会发现许多需要更正的事情。我可以说我的生活中只有两个。

将程序在线上后,我们的客户开始添加数据。几个月后,我们注意到数据库增长太快了-这是我们没有从数据输入中预期到的。我们花了近一个星期的时间找出原因并修复它,那是一个使某些统计数据呈对数增长的设计错误,我们纠正了它并继续前进。

运行两年后,我们注意到我们对 SQL Server 进行了太多不必要的调用。我们追踪下来,并再次发现了设计错误,我们改正了它,然后继续前进。

实际上,我们每个月都会发现和修复许多性能方面的小问题。对我来说就像F1赛车。您决定拥有什么车,需要不断校正以获得最大优势的F1赛车,还是只需要每年进行一次服务的简单汽车?

客户视角

然后,客户说:“我需要支持1000个用户。” 实际上,客户并不懂编程,试图从自己的角度找到一种比较提案的方法。实际上这里有很多因素,1000个用户并不是一个正确的参数。是每天、每分钟还是每月需要支持1000个用户?需要通过实时聊天来提供支持,还是需要看大量数据,或者需要快速处理?因此,也许就由您向客户正确销售您的程序,解释给他们好的程序对于一个用户和一百万用户来说都是一样好的,而实际上它的起点是由开发成本而不是用户数量决定的。

现在,如果这是一个实际规划网站的问题,那么简单的答案是开始做它,剩下的将被揭示出来。如果这是一个因为你在为你的客户寻找答案而问的问题,那么你必须问自己:为什么F1只有一个座位,而你的车可以坐五个人?电影的成本是多少?我们知道如何写作,但为什么不是我们所有人都写过并出版了一本书?我的意思是成本实际上是从你花费在项目上的时间得到的,而用户本身无法确定。

猜测、知识还是预测?

如何猜测服务器数量、带宽、存储等等... 实际上,我们不猜测,我们有很多站点,每天自动收集许多统计数据,具有多年的经验,并且从站点内容中知道每天可能拥有多少用户和可能消耗多少带宽。我们还拥有许多在我们服务器上运行的数据库,并且我们可以看到它们使用了多少数据。对于我们99%的网站来说,这些都是较低的数字。因此,这是通过真实的实时统计数据得出的知识和经验。预测是通过监视流量和使用情况来进行的,我们尝试使它们更好,以获得更多的流量、更多的用户,并从我们所达到的目标来预判未来是否需要更多资源。此外,99%的网站都是单池运行非常简单的演示文稿。

'*来自书籍


2
嗯,对于容量规划,我想了解的是峰值数字,而不是平均数。 - Stephan Eggermont
1
@StephanEggermont 我认为如果你计划网站将使用100Mg,那么你需要在服务器上安装3GB的硬盘。 - Aristos
谢谢,这是书中内容的一个很好的简介。 - vtortola
@vtortola,我尊重您的意见。但是我并没有阅读这本书,只是浏览了一下,其余的都来自我的工作和知识。祝您与客户好运。 - Aristos
抱歉@Aristos,我并不是想说你抄袭了它或者这只是书中的内容,我只是想说这本书谈到了那些事情,但它没有给出任何数字。你的回答非常好,只是我想要一个数字,一个大概的数值或者其他可以用作参考的东西来猜测。 - vtortola
2
@vtortola,正如我告诉你的那样,我尊重你的意见,我实际上是出于爱心在这里帮助,而且仍然继续帮助而不期望任何回报。我的导师让我走上了爱的道路 :) 一切都是爱和美好的,生活是美好的,当我提供任何形式的帮助时,我感觉非常酷。 :))) - Aristos

8
通常情况下,当客户询问这个问题时,由于系统甚至没有被设计出来,因此这非常困难,甚至是不可能的。
粗略地说,我们使用每秒100个请求每个服务器的规则。实际数字会因应用程序和用户使用系统的方式而有所不同,但我们发现这是一个很好的第一估计值。
文档系统的磁盘使用量仅为文档数量乘以平均大小。带宽是请求次数乘以请求的平均大小。
您只需记录所有假设并说明硬件要求基于这些假设即可。

那就是我想要的,一个可以作为参考的数字。即使它不是精确的,或者是粗略的,但至少能给出一个初步的猜测。 - vtortola

4
在开发最近的Asp.Net MVC网站时,我使用了selenium来对我的网站进行负载测试。基本上,您记录一组宏,在其中执行随机任务。

然后使用selenium模拟多个用户执行这些宏。我用十几、几百甚至几千个用户测试了我的网站。这可以让您在上线之前找到代码和基础设施中的问题点。


+1 for selenium,非常好的测试环境。 - Travis J

4

你使用哪些参考数据?

实际上只有一个需要被关注并进行推算的数字:数据。其他所有数字都源于数据需求。

小例子:每小时十亿个8字节二进制数的请求不会使任何事情崩溃,并且可以从最简单的Web服务器上运行。原因是请求时间将是毫秒的一小部分。一天中有8640万毫秒,这意味着即使每个请求需要一整毫秒,也仍然可以使用1百万个请求,因为获取8字节所需的速度将在8kb/s范围内。

现实版本:查看数据将确定需求,而被检索的数据几乎总是在数据库中。数据库的设计(即使是概念上的)可以帮助确定将使用多少数据。现实生活中有许多要求。必须检查数据库或文件系统的最大容量。可以通过计算每个表行所需的空间,通过总结每个列消耗的总空间(例如类型为int的id长度为6将占用6个字节的空间),来计算容量。为每个数据库表的每个列相加,就可以轻松地了解每个表集合所需的内存量(通常表通过外键连接)。在考虑表的内存消耗之后,必须检查用户的需求。主要关注每个用户在每个会话中将访问多少表(如果没有数据,则这将是一个估计 - 最好高估)。因为我们已经知道或有一个很好的想法数据库表的大小,所以我们可以假设用户需要多少服务器内存。将此内存使用率与预期用户数量进行比较将有助于确定要使用哪个服务器或使用多少台服务器。接下来要找出的是有多少表将被插入到数据库中(再次进行平均估计或通过一些收集的测试数据)。这非常具有推测性,最好用测试来完成。没有测试,应该高估假设。根据每个用户将插入多少行,将能够推算出数据库的大小和带宽需求。这些将通过将一个用户的数据需求扩展到n个用户每t时间的需求来确定。n个用户所需的数据将使其可能在t时间内看到带宽需求,并且还将确定n个用户如何在t时间内增加数据库。


糟糕的例子。你有没有想过一个请求的大小有多少字节?以及响应有多大?即使它只包含一个字节的有效负载?还有建立HTTP连接所需的数据包数量? - Stephan Eggermont
1
一个请求/响应和“建立http连接”,肯定是指TCP握手。因为握手的足迹在实际使用中往往是微不足道的,所以它没有被包含在示例中。 - Travis J
这就使它成为一个不好的例子,因为连接占用量将限制你的可扩展性(远低于每小时十亿个请求)。 - Stephan Eggermont
那么你的观点是没有人能够每小时服务十亿个请求?确切地说,是每毫秒277个。我认为像谷歌这样的地方最终会以那种速度提供服务。所以你关于能够达到每小时十亿个请求的观点相当无意义。连接印记......不幸的是,这不是一个技术术语,在那种情况下并不重要。最重要的是可用于连接到数据库或缓存服务器的连接线程的总数,以及这些线程被多频繁地重用。你的评论过于模糊,无法被认真对待。 - Travis J

3
实际上,我们并不这样做。我们确保能够快速扩展(devops),有可能回退到使用更少的资源/请求,从很少量的用户开始并观察性能。大多数小型到中等规模的项目不想花费太多时间和金钱在这方面。对于大型或关键项目,创建和运行模拟是有意义的。
记住,一天的计划成本与一台额外的机器的成本相当于一年。

2
您使用容量来涵盖系统的许多非功能性质,并且可能试图将性能、容量和可扩展性封装为一个概念。
首先,让我们从性能开始。如果您正在处理基于Web的架构,其中您正在提供资源,则这实际上非常简单,并且可以分为两个不同的KPI:服务器响应时间和页面加载时间(应该称为资源加载时间,因为Web上并不是所有资源都是Web页面)。
服务器响应时间测量给定资源请求的最后一个字节的时间。请注意,这不包括诸如内容协商之类的内容。您(或业务)需要为给定类型的资源指定预期的服务器响应时间。这基于单个请求/响应,例如对于任何属于“汽车型号”类型的资源的请求的响应,应在0.5秒内完成,即最后一个字节的时间。
页面加载时间进一步推进了事情。给定对资源的请求,加载该资源以及任何依赖资源需要多长时间。它真正具有更多的意义,当处于Web页面的上下文中时。Web充满了未知数,因此在这种情况下会出现一些灰色地带(网络、客户端、内容协商),因此您需要在固定/稳定的网络和客户端条件下指定此内容(有各种工具可实现此目的)。它还应始终定义为平均值,而不引入并发问题(我们仍未考虑容量)。
一旦您指定了两者,就可以开始确定系统的即时容量,即我可以以何种性能方式(如上所述)每秒请求多少资源。有很多工具可帮助您定义此内容。这将为您提供即时容量测量值。您会注意到我使用“即时”一词,因为业务经常可能会回过头来说,太好了,但是如果我们需要增加这个容量会发生什么。
因此,我们转向第三个非功能性质,即可扩展性(注意,系统有多于3个非功能性质,包括可用性、可靠性、有效性、可用性、可访问性、可扩展性和可管理性)。在给定一定容量的情况下,我可以将其性能增加多少。也有各种方法可以增加容量,但大多数系统通常都有某个瓶颈会创建约束。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接