Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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# 负载测试下的DbContext/Ninject依赖项GetService Slow SingleOrDefault_C#_Entity Framework_Ninject - Fatal编程技术网

C# 负载测试下的DbContext/Ninject依赖项GetService Slow SingleOrDefault

C# 负载测试下的DbContext/Ninject依赖项GetService Slow SingleOrDefault,c#,entity-framework,ninject,C#,Entity Framework,Ninject,由于我一直在收集诊断信息,但似乎不能完全指出问题所在,因此我对这篇冗长的帖子提前表示歉意 EF6/WebAPI 2 首先,我注意到一个运行缓慢的端点,在负载测试中情况变得更糟 代码: 有趣的是,随后的电话显示,“加速”的时间已经过去了 因此,这将是一个打开和关闭的情况,除了在负载测试下,端点显示每个调用的延迟4秒。(例如,同时运行250次的测试将显示每个测试需要4秒以上的时间。) 手写负载测试代码: public override IEnumerator<WebTestRequest&g

由于我一直在收集诊断信息,但似乎不能完全指出问题所在,因此我对这篇冗长的帖子提前表示歉意

EF6/WebAPI 2

首先,我注意到一个运行缓慢的端点,在负载测试中情况变得更糟

代码:

有趣的是,随后的电话显示,“加速”的时间已经过去了


因此,这将是一个打开和关闭的情况,除了在负载测试下,端点显示每个调用的延迟4秒。(例如,同时运行250次的测试将显示每个测试需要4秒以上的时间。)

手写负载测试代码:

public override IEnumerator<WebTestRequest> GetRequestEnumerator()
{
   WebTestRequest request6 = new WebTestRequest("http://localhost:57874/api/acts/10553697");
   request6.Timeout = 120;
   request6.Method = "GET";
   request6.Headers.Add(new WebTestRequestHeader("Authorization", "Bearer h0aHdT6..."));
   request6.Headers.Add(new WebTestRequestHeader("Accept","application/..."));
   request6.Headers.Add(new WebTestRequestHeader("ContentType", "application/json"));
   request6.ValidateResponse += new EventHandler<ValidationEventArgs>(request6_ValidateResponse);
   yield return request6;
   request6 = null;
}
public覆盖IEnumerator GetRequestEnumerator()
{
WebTestRequest6=新的WebTestRequest(“http://localhost:57874/api/acts/10553697");
请求6.超时=120;
request6.Method=“GET”;
添加(新的WebTestRequestHeader(“授权”、“承载h0aHdT6…”));
添加(新的WebTestRequestHeader(“接受”、“应用程序/…”);
添加(新的WebTestRequestHeader(“ContentType”,“application/json”);
request6.ValidateResponse+=新事件处理程序(request6\u ValidateResponse);
收益回报请求6;
request6=null;
}
所以

  • 我的负载测试是否不正确或
  • 我的EF 6设置是否不正确或
  • 我的对象重用是否不正确,或者
  • 我实际使用SingleOrDefault有问题吗
  • 我已经查看了ninject实例化的对象的构造函数,没有发现任何东西会导致延迟


    我确实遇到了这个问题,作为一个PluralSight迷,我能够立即进入课程。然而,这是一个七小时的课程,最后我不确定是EF造成了延误。

    很抱歉有人跟了上来。我想出来了,但忘了在这里更新

    所以你可以说问题出在Ninject上……但你也可以提出一个强有力的理由,那就是我们的设计,这就是问题所在

    最后我要说的是,问题出在我们的设计上。一点小小的灵活性可能会阻止设计成为一个问题,但如果一个糟糕的设计从未出现,它仍然是糟糕的设计吗

    无论如何,我们的端点在执行操作时是灵活的。这很好,除了加上Ninject,即使不需要,所有的东西都被构造出来了

    例如,一个端点可能有13个注入对象,但对于给定的操作,只需要3个。(其他10个将由其他消费者使用)

    不管只需要3个,Ninject将实例化所有13个,并在10分钟750恒定负载下…这是一个非常紧张的过程

    因此,为了更具体的目的,出现了几个端点,jit时间急剧下降

    根据我们上面的例子:

    一个端点上的13个注入对象变为:

  • 3注入物体
  • 5注入物体
  • 4注入对象
  • 3注入物体
  • 因此,结束点1-4加起来不等于13,因为现在有一些冗余。在一些端点注入相同的对象,但在一天结束时,一切都会像我们预期的那样在负载下执行

    COREIOC_Enter GetService Timein: 7:15:56 AM:
    COREIOC_Complete CreateRequest Elapsed: 00:00:00.0008914
    COREIOC_Resolve Elapsed: 00:00:00.0032197    
    COREIOC_SingleDef Resolve Elapsed: 00:00:04.4787988
    COREIOC_Exit  Elapsed: 00:00:04.4803695
    
    COREIOC_Enter GetService Timein: 7:27:08 AM:
    COREIOC_Complete CreateRequest Elapsed: 00:00:00.0000266
    COREIOC_Resolve Elapsed: 00:00:00.0018957
    COREIOC_SingleDef Resolve Elapsed: 00:00:00.0307401
    COREIOC_Exit  Elapsed: 00:00:00.0354408
    
    public override IEnumerator<WebTestRequest> GetRequestEnumerator()
    {
       WebTestRequest request6 = new WebTestRequest("http://localhost:57874/api/acts/10553697");
       request6.Timeout = 120;
       request6.Method = "GET";
       request6.Headers.Add(new WebTestRequestHeader("Authorization", "Bearer h0aHdT6..."));
       request6.Headers.Add(new WebTestRequestHeader("Accept","application/..."));
       request6.Headers.Add(new WebTestRequestHeader("ContentType", "application/json"));
       request6.ValidateResponse += new EventHandler<ValidationEventArgs>(request6_ValidateResponse);
       yield return request6;
       request6 = null;
    }