我们中的许多人都在为其他公司处理中小型项目。我们必须了解他们的业务、需求、计划架构、模型等等。
然后,客户说:“我需要支持1000个用户。”好吧,每个用户每秒钟请求多少次?他们的会话有多长?他们传输多少数据?他们执行哪些操作?他们的时长是多长?
有时可以知道这些数字(通过监视其现有应用程序或因为他们已经进行了这些测量),有时则不可能(因为他们没有当前的网站,或者只是无法知道)。
您如何猜测服务器数量、带宽、存储等等?您使用哪些参考数字?
谢谢。
为了做好规划,需要掌握以下几点:
平均数可以给出一些月度需求的想法。当然,你也需要考虑高峰期的数字,但是当他们租用网络服务器计算机时,网站会按月提供带宽和硬盘上的一些千兆字节,所以高峰期在起始点并不是问题。在这里,您必须考虑,如果您运行需要太多内存的 SQL 查询,或者如果您与许多其他站点共享计算机。
没有站点,没有经验,你实际上没有准确的测量。
目标是同时满足所有需求,并优先考虑首先关注哪些需求。
性能和容量是两个不同的方面。性能基于更多的人力工作,而容量基于更多的计算机资源。为了提高速度,首先需要知道如何使计算机平稳快速地运行,然后掌握一般的技巧来加速程序,特别是网络程序,最后需要花费更多时间在程序运行后,针对关键区域进行性能改进。
进行良好的软件设计,并考虑扩展可能性,以便向客户提供从小开始、只有在需要时才支付更多的机会。因此,在设计软件时,请像将其用于 Web 池一样思考,注意同步,注意共享资源,提供从不同服务器获取数据的能力等。
假设客户说只有1000个用户,对于扩展和速度都不感兴趣,只需要一个成本效益高的站点来完成他的工作。在这种情况下,您也要设计符合这些限制的网站。这些限制是什么?您不会为同步放置十个检查,并使其像单线程、单池程序一样工作。您不会使用任何互斥锁、双重检查或在运行相同应用程序的2个池或2台计算机时发生的任何事件。您只需注意代码点以在需要升级时更改它们。
您也不会编写使用多计算机资源的代码。当您运行它时,必须确保它仅在一个池下运行才能正常工作。
这种单池设计更易于开发、调试、控制、更新错误代码并且成本较低,但速度较慢(一个用户在一个线程池上等待另一个用户),无法扩展资源,这实际上也与速度有关。
如果您不知道可能有多少用户,则可以使用Alexa查看与您的相似站点以及每月平均用户数/平均页面浏览量。然后您就可以知道可能的带宽。
从您对硬件的预测开始,但不要从第一天起租用两台计算机。从第一台开始,进行测量,查看数据增长情况,只有在需要时才进行扩展。
程序运行时,如果您跟随它,会发现许多需要更正的事情。我可以说我的生活中只有两个。
将程序在线上后,我们的客户开始添加数据。几个月后,我们注意到数据库增长太快了-这是我们没有从数据输入中预期到的。我们花了近一个星期的时间找出原因并修复它,那是一个使某些统计数据呈对数增长的设计错误,我们纠正了它并继续前进。
运行两年后,我们注意到我们对 SQL Server 进行了太多不必要的调用。我们追踪下来,并再次发现了设计错误,我们改正了它,然后继续前进。
实际上,我们每个月都会发现和修复许多性能方面的小问题。对我来说就像F1赛车。您决定拥有什么车,需要不断校正以获得最大优势的F1赛车,还是只需要每年进行一次服务的简单汽车?
然后,客户说:“我需要支持1000个用户。”
实际上,客户并不懂编程,试图从自己的角度找到一种比较提案的方法。实际上这里有很多因素,1000个用户并不是一个正确的参数。是每天、每分钟还是每月需要支持1000个用户?需要通过实时聊天来提供支持,还是需要看大量数据,或者需要快速处理?因此,也许就由您向客户正确销售您的程序,解释给他们好的程序对于一个用户和一百万用户来说都是一样好的,而实际上它的起点是由开发成本而不是用户数量决定的。
现在,如果这是一个实际规划网站的问题,那么简单的答案是开始做它,剩下的将被揭示出来。如果这是一个因为你在为你的客户寻找答案而问的问题,那么你必须问自己:为什么F1只有一个座位,而你的车可以坐五个人?电影的成本是多少?我们知道如何写作,但为什么不是我们所有人都写过并出版了一本书?我的意思是成本实际上是从你花费在项目上的时间得到的,而用户本身无法确定。
如何猜测服务器数量、带宽、存储等等...
实际上,我们不猜测,我们有很多站点,每天自动收集许多统计数据,具有多年的经验,并且从站点内容中知道每天可能拥有多少用户和可能消耗多少带宽。我们还拥有许多在我们服务器上运行的数据库,并且我们可以看到它们使用了多少数据。对于我们99%的网站来说,这些都是较低的数字。因此,这是通过真实的实时统计数据得出的知识和经验。预测是通过监视流量和使用情况来进行的,我们尝试使它们更好,以获得更多的流量、更多的用户,并从我们所达到的目标来预判未来是否需要更多资源。此外,99%的网站都是单池运行非常简单的演示文稿。
'*来自书籍
然后使用selenium模拟多个用户执行这些宏。我用十几、几百甚至几千个用户测试了我的网站。这可以让您在上线之前找到代码和基础设施中的问题点。
你使用哪些参考数据?
实际上只有一个需要被关注并进行推算的数字:数据。其他所有数字都源于数据需求。
小例子:每小时十亿个8字节二进制数的请求不会使任何事情崩溃,并且可以从最简单的Web服务器上运行。原因是请求时间将是毫秒的一小部分。一天中有8640万毫秒,这意味着即使每个请求需要一整毫秒,也仍然可以使用1百万个请求,因为获取8字节所需的速度将在8kb/s范围内。
现实版本:查看数据将确定需求,而被检索的数据几乎总是在数据库中。数据库的设计(即使是概念上的)可以帮助确定将使用多少数据。现实生活中有许多要求。必须检查数据库或文件系统的最大容量。可以通过计算每个表行所需的空间,通过总结每个列消耗的总空间(例如类型为int的id长度为6将占用6个字节的空间),来计算容量。为每个数据库表的每个列相加,就可以轻松地了解每个表集合所需的内存量(通常表通过外键连接)。在考虑表的内存消耗之后,必须检查用户的需求。主要关注每个用户在每个会话中将访问多少表(如果没有数据,则这将是一个估计 - 最好高估)。因为我们已经知道或有一个很好的想法数据库表的大小,所以我们可以假设用户需要多少服务器内存。将此内存使用率与预期用户数量进行比较将有助于确定要使用哪个服务器或使用多少台服务器。接下来要找出的是有多少表将被插入到数据库中(再次进行平均估计或通过一些收集的测试数据)。这非常具有推测性,最好用测试来完成。没有测试,应该高估假设。根据每个用户将插入多少行,将能够推算出数据库的大小和带宽需求。这些将通过将一个用户的数据需求扩展到n个用户每t时间的需求来确定。n个用户所需的数据将使其可能在t时间内看到带宽需求,并且还将确定n个用户如何在t时间内增加数据库。