【问题标题】:IIS: Unable to get high throughputIIS:无法获得高吞吐量
【发布时间】:2016-10-18 20:37:08
【问题描述】:

我有一个 IIS 应用程序;在我们的应用程序的负载测试期间,我们发现吞吐量非常低。在尝试解决问题的同时,我们运行了一个测试——对一个返回大约 1000 字节静态数据的页面进行负载测试,并在控制器中休眠。我们发现,如果睡眠持续时间约为 1 秒,IIS 无法在 1 秒内以超过 10 rps 的负载处理请求。

现在我阅读了并发请求以及如何发布 .Net 4.5,默认值为 5000。因此,如果 IIS 正在处理 5000 个并发请求,为什么它无法以 10 rps 的速度处理请求,每个请求需要 1 秒?数学不加起来。

注意返回的是静态数据,数据量很小,所有的功能都是休眠。因此,CPU、磁盘、网络等机器参数都没有超出限制。服务器几乎不眨眼。

这是整个控制器代码

public ActionResult Contact()
{
    Thread.Sleep(1000);
    return View();
}

那里的视图返回一些静态 HTML;我使用 Visual Studio 模板创建了 Web 应用程序;模板返回静态 HTML。

当我取消睡眠时,我在高 rps 下运行服务器没有问题。但随后请求完成得如此之快,以至于 IIS 甚至在高 rps 下都不会遇到任何高并发。

【问题讨论】:

    标签: c# iis


    【解决方案1】:

    所有请求都属于同一个会话吗?如果是这样,this post 会指出问题的原因。

    实际上,事实证明 ASP.NET 会话不是线程安全的,您不能从同一会话中获得并行请求。 ASP.NET 将简单地序列化调用并按顺序执行它们。这会导致您在调用 Thread.Sleep() 时看到的阻塞。

    如果请求来自不同的会话,则不应有阻塞。在任何情况下,您都可以尝试关闭会话:

    <sessionState mode="Off" />
    

    【讨论】:

    • 我有一个简单的 C# 负载测试程序 HttpWebResponse objWebResponse = (HttpWebResponse)objRequest.GetResponse();从多个线程调用以获得所需的负载。没有明确的会话创建。这会导致 IIS 上的相同会话吗?因为我没有发回任何会话信息,所以我想不会。
    • 除非另有说明,否则在响应中会有一个会话 ID 作为 cookie 发回。如果后续请求一起发送该 cookie,ASP.NET 会将它们全部视为同一会话的一部分。尝试关闭会话状态并查看这是否适用于您的情况是值得一试的。
    • 我会试试的;但我们不会通过该负载生成器发回 cookie。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多