我们想启动一个大型的多层应用程序。服务器端应用程序必须同时响应 1000 多个用户。我们想通过 64 位编译器和 32 位客户端创建服务器应用程序。在这种情况下,我们不知道 DataSnap 是否可以毫无问题地响应所有客户端?在这种情况下,服务器计算机非常强大(多处理器和超过 16GB 的 RAM),数据库管理系统是 FireBird 2.5。
3 回答
您需要一种方法来执行实际的负载测试。
对于 Firebird 数据库,您可以使用免费的 Apache JMeter 工具模拟并发用户。它可以运行 SQL 语句并记录它们的执行时间统计信息(平均值、最小值/最大值等)。因此,例如,您可以创建一个包含 20 个不同 SQL 查询的线程组,然后运行 20 个线程,每个线程将按顺序执行这些查询。
JMeter 允许定义 SQL 查询的时间限制,如果查询超过此限制,JMeter 将其视为错误。然后,您可以尝试找出总错误率仍低于(例如)5% 的最大客户端数。
但是您还需要知道预期的数据库负载会有多高,并且您还需要有一个实际大小的测试数据库,而不仅仅是几条记录。此外,一些数据库查询(如报告)可能会导致更高的负载 - 这些也应该包含在模拟中,因为它们会影响整体性能。在 JMeter 中,您可以创建第二个线程组,与第一个线程组并行运行,用于具有不同设置(较少模拟客户端)的这些长时间运行的语句。
测试数据库将显示该区域是否已经存在瓶颈。例如,测试结果可能是数据库可以为 20 个客户端提供服务,总平均事务率为 20 TPS(每秒事务数),这意味着一个客户端每秒执行一个事务。但是这个 TPS 值会随着用户数量的增加而降低。
相关问题:Firebird 在大型项目中的使用,也有指向http://www.firebirdsql.org/en/case-studies-catalog/的链接
关于 DataSnap 客户端负载模拟:这可以通过脚本客户端完成,该客户端通过连接运行一组预定义的语句/命令。要同时运行大量负载测试客户端,您可以使用 Amazon Elastic Compute Cloud ( EC2 ) 之类的服务来启动测试机器映像的克隆,从而节省硬件成本。但当然我会从一台小型客户端机器开始,它只运行十个或二十个脚本客户端。
据我所知,DataSnap 是基于 Indy 的。而且 Indy 的连接处理模型不是很可扩展——每个连接一个线程,这非常消耗资源。我认为即使使用 Indy 的线程池也不是一种选择……例如,在 Windows(32 位)中,您可以创建的最大线程数有一个限制(2000 IIRC)。无论如何 - 使用多线程并不好,并且会影响服务器的性能(供参考 - Windows Internals book、Windows Performance Team blog 等)
可扩展、强大且专业的应用服务器将使用 IO 完成端口 (IOCP) 进行数据处理。但我不知道 DataSnap 是否可以利用它。
更新: 在 CodeRage7 上,我问了类似的可扩展性问题。以下是答案:
问:最近 StackOverflow 上有一个关于 DataSnap 的可扩展性/性能的问题。那么 DS 能否在网络和应用程序级别处理 2000 个或更多并发用户请求?
答:可伸缩性基于 TCP/HTTP/HTTPs 的可伸缩性和服务器操作系统中允许的连接数。还基于您使用的内存和硬件。DataSnap 没有具体限制。
我的评论:虽然这是真的,但 Indy 的连接处理模型,即每个连接一个线程,会引入瓶颈,尤其是在 32 位 Windows(最大 2000 个线程)中。在 Win64 中,这应该不是什么大问题,但同样 - 这种处理数据流会导致性能下降。
问: DataSnap 是否支持某种负载平衡?
答:不直接。您可以在 DataSnap 服务器的代码中执行此操作。
我的评论:我在 Andreano Lanusse 的博客中找到了关于在 DataSnap 中实现故障转移/负载平衡的非常好的论文
问: DataSnap 是否支持 IO 完成端口以获得更好的可扩展性?
我的这个问题没有得到回答。
希望这可以帮助!
更新2:
我在 DS 性能上发现了非常有趣的帖子:基于速度和稳定性测试的 DataSnap 分析
更新3:
在制定系统规范时,当涉及多个用户时,您需要非常精确。
例如:您创建了一个网站,而客户期望有 15.000 个唯一用户。然后客户端通常会提出系统需要支持15.000个同时用户的要求,这是非常幼稚的。
您将需要比这更详细的规范。
通常更明智的说法是:在 99% 的请求中,99% 的用户可以在平均 5 秒内得到响应。
在正常使用中,您永远不会看到所有用户在同一秒内发送请求。如果在某个时刻它们都在同一分钟内到达(也不太可能),那么并发用户会少很多。
即使对于拥有数以万计用户的网站,其中大多数人每天都连接,网络服务器大部分时间都是空闲的,有时它会跳到 5%,在极端情况下会跳到 20%。如果我们真的必须同时为所有这些用户提供服务,那我们就完蛋了,但这永远不会发生,而且为这样的负载准备服务器是不现实的。