如何进行客户端服务器应用程序的压力测试/负载测试?

13

我正在开发一个基于客户端-服务器模式,基于数据库的系统,并且需要设计一种方法来测试系统的压力/负载。客户不可避免地想知道以下信息:

• 服务器可以支持多少客户端?
• 服务器可以支持多少并发搜索?
• 数据库可以存储多少数据?
• 等等。

所有这些问题的关键在于响应时间。我们需要能够测量响应时间和性能如何随着新负载的引入而降低,以便我们可以例如生成某种漂亮的图表,向客户展示特定硬件配置下可以期望什么样的性能。

现在,我们只是根据经验对系统已有的了解进行教育猜测。然而,随着产品在更具挑战性的条件下投入使用,这被证明不足以满足我们未来的需求。

我被赋予了设法以有意义的方式获取此类答案的任务。我意识到这不是任何人都可以明确回答的问题,但我正在寻找有关人们如何处理自己系统的此类工作的建议。

需要注意的一件事是,我们通过Python语言(由SWIG提供)完全访问我们的客户端API,这比C++更易于处理此类工作。

所以,我把这个问题提交给大家:非常想看看你们能想出什么样的想法!


1
让营销人员声称他们认为能卖出最多的东西,然后根据诉讼调整声明的经过考验的方法对你来说不够好吗? - Deestan
@Deestan:哈哈哈哈 - 没错,我的朋友 :p - jkp
5个回答

8
测试1: 疯狂连接和断开客户端,以查看您如何处理会话的初始化和结束,以及在峰值期间您的服务器能够承受多少负载,同时在执行此操作时测量有多少客户端无法连接。这非常重要。 测试2: 连接客户端并让他们保持登录状态,进行一周左右的随机操作(FuzzTest)。计算每个操作的往返时间。还要记录操作的顺序,因为这样你的“客户端”将会发现用例中的漏洞(非常重要,而且非常难以理性地测试)。 测试3和4: 确定系统的主要用例,并编写执行这些任务的脚本。然后运行几个执行相同任务的客户端(测试3),以及运行几个执行不同任务的客户端(测试4)。 系列: 现在您需要的另一个维度是客户端数量。 一个好的系列可能是: 5、10、50、100、500、1000、5000、10000、...
这样您就可以针对不同工作负载的每个测试系列获取数据。
恭喜你成功将客户端API转换为Python!这是准备就绪的好方法。
注意:IBM有一个关于Java模糊测试的示例,虽然与你的情况无关,但可以帮助你设计一个良好的模糊测试系统。

尝试使用Python进行测试:https://quintagroup.com/cms/python/locust - Ilyas

6
如果您能够熟练编写Python测试,我发现funkload非常有能力。您没有说明您的服务器是基于http的,因此您可能需要将其测试设施适应您自己的客户端/服务器风格。
一旦您在Python中拥有一个测试,funkload可以在许多线程上运行它,监视响应时间,并在测试结束时为您汇总。

看起来很有趣:它不是基于HTTP的,我们有自己的API,所有内容都可以通过Python访问,因此也许不难调整这段代码。我会仔细看一下...这正是我所希望的...如果可以避免的话,不喜欢重新发明轮子。 - jkp
现在已经看过了:它非常不错,但是它非常面向Web。话虽如此,代码足够简单,我可以要么a:修改并重用框架,要么b:基于它编写自己的框架。肯定是我见过的最好的方法之一。 - jkp

5
为了性能,你需要关注两个方面:延迟(应用程序的响应速度)和吞吐量(每个时间段内的操作数)。对于延迟,你需要有一个可接受的基准。对于吞吐量,你需要有一个最小可接受的吞吐量。
这些是你的起点。要告诉客户每个时间段可以完成多少个 xyz 操作,你需要了解硬件和软件配置。了解生产硬件对于获得准确的数据非常重要。如果你不知道硬件配置,则需要想办法将测试硬件的数据映射到最终的生产硬件上。
没有硬件知识,你只能观察随时间变化的性能趋势而不是绝对值。
同样重要的是了解软件配置。你是否有集群服务器配置,是否负载均衡,服务器上是否还有其他运行的东西?你能否扩展你的软件或者必须扩展硬件以满足需求?
要知道你可以支持多少客户端,你需要了解什么是标准操作集。一个快速测试方法是移除客户端并编写一个存根客户端,然后尽可能多地启动它们。让每个客户端连接到服务器。你最终会达到服务器连接资源限制。如果没有连接池或更好的硬件,你无法超过这个限制。通常你会在这之前遇到架构问题,但无论哪种情况,你都有一个上限。
将这些信息并设计一个脚本让你的客户端执行。你需要映射你的脚本执行操作所需的时间与预期用户执行相应操作所需的时间。如上所述逐渐增加你的数字,直到增加客户端导致性能下降更多的点。
有很多方法进行压力测试,但关键是了解预期负载。询问客户他们的期望值是什么。每个时间段的期望需求量是多少?从那里你可以计算出上限负载。
你可以进行长时间的并发测试,让多个客户端连续运行数小时或数天。你可以尝试尽可能快地连接尽可能多的客户端,以查看你的服务器如何处理高需求(也是一种DOS攻击)。
并发搜索应该通过代表客户端的标准行为搜索来完成,或者编写一个等待多个线程的信号量的脚本,然后可以同时释放它们。这很有趣,并且会惩罚你的数据库。当执行搜索时,你需要考虑任何可能存在的缓存层。你需要测试有缓存和没有缓存的情况(在每个人都进行唯一搜索请求的情况下)。
数据库存储是基于物理空间的;你可以根据字段长度和预期数据填充来确定行大小。通过统计推断或创建一个数据生成脚本(对于负载测试场景非常有用,应该是你组织的资产),然后将生成的数据映射到业务对象上。你的客户关心他们可以存储多少“业务对象”,而你关心可以存储多少原始数据。

其他需要考虑的事项:预计可用性是多少?启动服务器需要多长时间?如果服务器一旦宕机,恢复在线需要两天,那么99.9%的可用性也不够好。相反,如果重新启动只需5秒钟,并且有一个备用服务器,那么较低的可用性也更加可接受。


0
如果您有预算的话,LoadRunner将非常适合这个任务。

LoadRunner看起来不错,但是你可能是对的:预算超支了。不过还是谢谢你的指引。 - jkp

0

另外一件相关的事情是:Twitter最近开源了他们的负载测试框架。或许值得一试 :)


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