Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与IIS相比,红隼的性能较慢_C#_Asp.net Core_.net Core_Benchmarking_Kestrel Http Server - Fatal编程技术网

C# 与IIS相比,红隼的性能较慢

C# 与IIS相比,红隼的性能较慢,c#,asp.net-core,.net-core,benchmarking,kestrel-http-server,C#,Asp.net Core,.net Core,Benchmarking,Kestrel Http Server,对于演示,我打算运行一个基准测试,比较Kestrel上运行的.NET Core与IIS上运行的.NET Framework 4.6.1。都在本地计算机上 说Kestrel要快得多,但在我自己的基准测试中,与IIS没有明显区别。大多数情况下,IIS甚至更快。怎么样 我在.NETFramework(使用EF)和.NETCore(使用EFCore)上运行了“相同”的代码。控制器如下所示。它将向DB写入一些内容,然后获取并返回它。我关闭DBContext以确保没有缓存。下面是.NET核心的代码(除了没有

对于演示,我打算运行一个基准测试,比较Kestrel上运行的.NET Core与IIS上运行的.NET Framework 4.6.1。都在本地计算机上

说Kestrel要快得多,但在我自己的基准测试中,与IIS没有明显区别。大多数情况下,IIS甚至更快。怎么样

我在.NETFramework(使用EF)和.NETCore(使用EFCore)上运行了“相同”的代码。
控制器
如下所示。它将向DB写入一些内容,然后获取并返回它。我关闭
DBContext
以确保没有缓存。下面是.NET核心的代码(除了没有DI外,.NET Framework的代码与之类似)

我使用
dotnet
作为
dotnetdemoapp.dll
运行它

我用一个发出许多请求的应用程序来测试它

    var cts = new CancellationTokenSource();
    int processed = 0;
    int seconds = 30;

    var url = new Uri($"http://localhost:{port}");
    var tasks = new Task[20];
    for (int i = 0; i < tasks.Length; i++)
    {
        tasks[i] = Task.Factory.StartNew(() =>
        {
            while (!token.IsCancellationRequested)
            {
                var client = new RestClient(url);
                var request = new RestRequest("/api/values");
                client.ExecuteAsyncGet(request, (response, handle) =>
                {
                    if(!token.IsCancellationRequested)
                        Interlocked.Add(ref processed, 1);
                }, "GET");
            }
        });
    }
    Thread.Sleep(seconds * 1000);
    cts.Cancel();
var cts=new CancellationTokenSource();
int=0;
整数秒=30;
var url=新Uri($”http://localhost:{port}”);
var任务=新任务[20];
for(int i=0;i
{
而(!token.IsCancellationRequested)
{
var client=新的RestClient(url);
var请求=新的重新请求(“/api/values”);
client.ExecuteAsyncGet(请求,(响应,句柄)=>
{
如果(!token.IsCancellationRequested)
联锁。添加(参考处理,1);
}“得到”);
}
});
}
线程睡眠(秒*1000);
cts.Cancel();
当我使用IIS在.NET Framework上运行它时,收到的请求比使用Kestrel在Core上运行时多

我尝试过更改
选项。在红隼中限制
,但没有成功。我的假设是我的“基准测试应用程序”有问题,或者我的本地机器本身就是瓶颈

为什么IIS处理请求的速度比Kestrel快得多

更新:

如果我删除EF并在控制器中只返回
OK()
,IIS的性能仍然会更好

在进行基准测试之前,我会唤醒服务器

我将其构建为
Release

当我用10个线程运行30秒时,IIS将处理600个请求和Kestrel 300个请求

    var cts = new CancellationTokenSource();
    int processed = 0;
    int seconds = 30;

    var url = new Uri($"http://localhost:{port}");
    var tasks = new Task[20];
    for (int i = 0; i < tasks.Length; i++)
    {
        tasks[i] = Task.Factory.StartNew(() =>
        {
            while (!token.IsCancellationRequested)
            {
                var client = new RestClient(url);
                var request = new RestRequest("/api/values");
                client.ExecuteAsyncGet(request, (response, handle) =>
                {
                    if(!token.IsCancellationRequested)
                        Interlocked.Add(ref processed, 1);
                }, "GET");
            }
        });
    }
    Thread.Sleep(seconds * 1000);
    cts.Cancel();

gcServer
设置为
true

您无法通过将web主机连接到数据库来测试其性能。db或您的业务逻辑将成为瓶颈

从一个干净的项目开始,或者更好地抓住基准。要实现高端性能,需要做很多事情


事实上,你正在处理300或600个请求(可怜的),这意味着还有其他事情在进行中。。请注意,您的控制器在每个请求上都注入了一个db上下文+您拥有的任何中间件。

您可能正在测试EF Core vs EF Performance,例如,您无法通过这样的测试得出结论。如果您正在测试Kestel vs IIS-您必须排除所有不相关的因素。@Evk-我实际上在没有EF的情况下首先测试了它。但同样的结果是,我们在过去对dotnet核心应用程序也有过类似的观察。根据一些建议,我们已将gcServer设置启用为true,这增加了每秒的请求。你可以在这里阅读---@user1672994-Thx。我两个都试过了,但都不走运。我们在这里讨论的区别到底有多大?对于一个人来说,这是一段相当长的时间吗?谢谢你的回答,但正如我在评论中提到的,我也在没有Db的情况下尝试过。同样的结果。除了MVC,没有其他的中间件。你做了一个干净的项目吗?即使您没有通过构造函数注入与db对话,您发布的代码仍然会执行db调用。。。300或600的请求告诉你有问题/不同。。您可以创建一个新项目,运行10个客户端,并获得10到100*个以上的返回静态Ok。是。先做一个干净的项目。后来添加了db。除了MVC没有中间件。你在使用一些项目默认的愚蠢的IIS集成吗?很抱歉,我错过了这个回复,但我只想抓取一个性能示例,然后从这个示例开始/看看我的代码有什么不同,但我可以告诉你,对于许多项目来说,它是开箱即用的,它们中的大多数都是核心而不是net 461.nope。没有IIS集成。但我相信你是对的。我应该抓取一些其他的基准项目并从那里继续下去。。。
    var cts = new CancellationTokenSource();
    int processed = 0;
    int seconds = 30;

    var url = new Uri($"http://localhost:{port}");
    var tasks = new Task[20];
    for (int i = 0; i < tasks.Length; i++)
    {
        tasks[i] = Task.Factory.StartNew(() =>
        {
            while (!token.IsCancellationRequested)
            {
                var client = new RestClient(url);
                var request = new RestRequest("/api/values");
                client.ExecuteAsyncGet(request, (response, handle) =>
                {
                    if(!token.IsCancellationRequested)
                        Interlocked.Add(ref processed, 1);
                }, "GET");
            }
        });
    }
    Thread.Sleep(seconds * 1000);
    cts.Cancel();