我正在尝试创建一个ASP.NET Web服务,我可以用它来显示异步实现Web方法与同步实现Web方法之间的区别。这是一种概念验证,我可以用它来展示如何异步编写文件可以使应用程序更具可扩展性。为了进行比较,我实现了两个方法,RunSqlSync和RunSqlAsync。像这样:
[WebMethod]
public int RunSqlSync(string sql)
{
// call SQL synchronously
}
[WebMethod]
public IAsyncResult BeginRunSqlAsync(string sql, AsyncCallback callback, object state)
{
// call SQL asynchronously
}
[WebMethod]
public int EndRunSqlAsync(IAsyncResult result)
{
}
我希望通过使用方法的异步版本来处理更多并发请求,尤其是在SQL调用需要一段时间才能完成的情况下。不幸的是,对于这两种方法,似乎我达到了请求/秒限制(限制取决于SQL调用的延迟),我甚至没有接近最大化我的CPU。当我增加发送到Web服务的请求数量时(通过增加在Ocracoke负载测试中使用的用户数量),平均响应时间会增加而不会改变实际的TPS吞吐量。我在内部检测Web服务以测量请求完成所需的时间,并且在我的代码中,每个单独的请求都在同一时间处理,而不管负载如何。这让我觉得ASP.NET在某种程度上会受到限制。有谁知道为什么会这样?
答案 0 :(得分:2)
您可以在.net sql连接字符串调用中设置最大池大小。我相信默认值是最多20个连接,所以如果你点击那么它只会允许那些使用,基本上你会得到相同的结果。这是一篇关于连接池的文章。
答案 1 :(得分:1)
就像schwig所说,你可能没有遇到带宽限制,你可能在你的进程中耗尽了工作线程。这是你应该从MS中读到的章节,我发现它具有启发性: