繁体   English   中英

如何提高 ASP.Net Web 服务性能

[英]How to Improve ASP.Net Web Service performance

我们的应用程序中有一个旧的 ASP.Net asmx webservice,它有时会接收批量请求。 单个请求的服务耗时不到 5 秒。 但是当它收到 20 个或更多并发请求时,它需要一分钟多的时间。 以下是它的实现方式,

1) 从外部客户端接收带有输入数据的请求

2) 将根据输入数据验证后从数据库中获取 20 种可能性对一个请求

3)然后它将使用 foreach 迭代所有 20 种可能性,并根据可能性数据从其他外部服务或数据库中获取解决方案。 在旧实现中,我们使用 Parallel.Foreach 并行执行所有 20 个调用(服务调用或 DB 调用)以提高性能。

4) 之后,Service 会将所有 20 个解决方案发回给客户端。

这种旧方法适用于少数(1 或 2 个)请求,并且考虑到需要 2-3 秒的外部服务调用,asmx 服务的响应时间非常快(不到 5 秒)。但是这种方法需要超过 60 秒的时间并发请求数超过 20。根据专家分析,并发请求将 CPU 利用率推至 100% 和线程池饥饿,并导致请求排队等待线程分配。

所以我们得到了一个建议,用端到端的 async/await 实现替换并行扩展和完整服务。我已经实现了 async/await 端到端,并在 TPL 中用 Task.WhenAll 替换了 Parallel.foreach。 但是在这个实现之后响应时间增加了很多。对于单个请求 20 秒,它需要超过 2 分钟的批量请求。

我还尝试了 async foreach 代替 parallel.foreach ,如下文所述,但性能仍然很差。

https://stackoverflow.com/questions/14673728/run-async-method-8-times-in-parallel/14674239#14674239

根据日志,基本问题是在旧的并行或新的异步/等待实现中 foreach 内部的外部服务调用/数据库调用。但是对于单个请求,这些服务响应非常快。 与并行扩展实现相比,异步实现在完成服务调用方面花费的时间更多。

如果单个请求少于 5 秒,我认为批量请求的服务不应超过 20 秒。

任何人都可以请我在这里改进性能的方法是什么?

提前致谢。

问候,

拉古。

看起来很多事情同时发生在这里。 我相信您对导致许多副作用的潜在问题有所了解。

我将假设您的服务器在 CPU 和内存方面足以处理并发连接(尽管 CPU 100% 让我感到疑惑)。

在我看来,您的问题是并行任务(或线程)争夺相同的资源。 这将解释为什么多个请求需要更多时间以及为什么异步范式需要更多时间。

让我解释:

实践中的问题

并行实现:1个或2个请求需要最少的同步,所以即使它们争夺相同的资源,也应该没问题。

当 20 个线程尝试访问相同的资源时,会发生很多事情,您会遇到一种称为活锁的情况。

当您切换到异步时,没有请求等待线程(它们正在等待 IO 线程),因此您会使问题变得更糟。

(我怀疑你的数据库有问题。如果你的数据库服务器是同一台机器,它也会解释利用率)。

解决方案

与其尝试提​​高并行度,不如找到有争议的资源并找出问题所在。

如果它在您的数据库中(最可能的情况),那么您需要识别导致问题的查询并修复它们(索引、统计信息、查询计划等等)。 显示锁和查询执行计划的数据库分析器是您的朋友。

如果问题出在您的代码中,请尝试最小化竞争条件并改进您的算法。

要获得有关查找位置的提示,请使用 Visual Studio 分析工具: https : //docs.microsoft.com/en-us/visualstudio/profiling/profiling-feature-tour?view=vs-2019或任何外部 .网络分析软件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM