Sql server 如何查找IIS/SQL超时的原因?

Sql server 如何查找IIS/SQL超时的原因?,sql-server,entity-framework,web-services,iis,Sql Server,Entity Framework,Web Services,Iis,我在IIS上有一个web服务,这个服务已经很好用了几个月了,但是现在我超时了,我不知道如何诊断问题所在 客户端将“心跳”消息中的基本信息发送给IIS,然后IIS在SQL数据库(在不同的服务器上)中更新这些信息。在野外有250个客户,每5分钟都会发送一次心跳。。。因此,表中只有250行,在用于更新的列上有适当的索引 通常更新只需要50-100毫秒,但从上周开始,你可以看到IIS日志中的响应时间增加了,我也有超时的情况 设置没有改变,所以我不知道我在寻找什么来确定原因。我得到的错误是: System

我在IIS上有一个web服务,这个服务已经很好用了几个月了,但是现在我超时了,我不知道如何诊断问题所在

客户端将“心跳”消息中的基本信息发送给IIS,然后IIS在SQL数据库(在不同的服务器上)中更新这些信息。在野外有250个客户,每5分钟都会发送一次心跳。。。因此,表中只有250行,在用于更新的列上有适当的索引

通常更新只需要50-100毫秒,但从上周开始,你可以看到IIS日志中的响应时间增加了,我也有超时的情况

设置没有改变,所以我不知道我在寻找什么来确定原因。我得到的错误是:

System.ServiceModel.FaultException:更新时出错 条目。有关详细信息,请参阅内部异常。发生错误 在更新条目时。有关详细信息,请参见内部异常 详细信息。执行超时已过期。在此之前已过超时时间 操作完成或服务器没有响应。这个 语句已终止。等待操作超时

关于从哪里开始寻找,有什么建议吗?我确实在IIS中启用了失败的请求日志跟踪,但如果我完全诚实的话,我不知道这意味着什么。成功的request与失败的request之间的区别在于请求日志在“AspNetStart”条目之后停止

谢谢!
标记

服务可能会逐渐或突然变慢的原因有很多。糟糕的代码结构可能会导致服务器内存泄漏之类的事情,小到无法在测试过程中真正显示或导致问题,但当运行数周/数月后开始累积。如果这是面向公众的服务,或者有指向面向公众服务的链接,则未经授权的请求可能以您的服务器为目标

需要注意的事项:

  • 这种情况是在一天中的特定时间发生还是在一整天中发生
当多个用户同时发送更新时,是否会出现负载问题?250个用户并不多。在过去的几个月里,用户数量是在增长,还是从一开始就相对稳定

  • Web服务器和DB服务器上的内存和CPU使用情况如何
这是检查任一服务器是否处于相当大的负载下的第一条线索。从那里,您可以调查它为什么可能处于负载之下,或者它是否可能需要更多的咕噜声来处理负载。看看正在运行的进程。如果这些服务器由IT部门或类似部门管理,那么一些罪魁祸首可能包括病毒扫描程序占用资源之类的东西。(即,过去几个月的策略更改导致服务器上的额外负载)

  • 您的数据库设置为哪种恢复模式
  • 发送日志(.mdx文件)的大小是多少
  • 您是否有定期的数据库备份和索引维护
新项目往往会忘记这一点。空数据库很小,没有记录Tx日志历史记录,但随着时间的推移,Tx日志会在后台无声地增长,特别是在完全恢复的情况下。随着时间的推移,较大的发送日志可能会导致性能降低,尤其是在需要放大日志文件的情况下。检查日志文件是否设置为按字节或百分比增长是一件好事。我认为百分比是默认值,但这可能会导致指数“增长”时间/空间问题,因此最好将其设置为每次增长的固定大小。您需要执行定期备份,以便重置发送日志。理想情况下,如果备份之间的日志大小保持一致,则不要收缩文件

  • 在给定的一天内,所有表中有多少条记录被插入或更新
这对于构建数据库在备份之间的一天中跟踪的数据量的图片非常重要。您可能有250个客户端,但每个心跳都有可能更新一行并插入其他行

  • 对于插入的记录,PKs使用的是什么?(Ints与UUID)如果使用UUID,您是在使用
    NEWSEQUENTIALID()
    还是
    NEWID()
    /
    Guid.New()
如果做得不好,guid可能成为索引的定时炸弹。当插入行时,GUID与
NEWID()
GUID.New()
组合将导致相当多的索引碎片。如果GUI对客户端不可见,则应使用
NEWSEQUENTIALID()
。如果ID是通过代码设置的,那么您可以找到一些实现来生成顺序GUID。(这是重新安排组成GUID的部分的问题)定期索引维护是在索引字段中使用UUID列的要求

  • 您是否在web服务中使用依赖项注入
  • 执行更新的DBContext的生存期范围是什么
如果DbContext的生存期范围设置不正确,这对web服务器来说是一个潜在的定时炸弹。您希望DbContext的活动时间不超过需要的时间。最大情况下,生存期范围应设置为PerRequest。例如,为Singleton设置的DbContext将跨请求跟踪实体。DbContext跟踪的实体越多,读取和更新操作就越慢。如果web服务器内存使用率正在上升,这可能是罪魁祸首

  • 您正在运行SQL探查器吗
在一个没有任何其他内容涉及数据库的测试环境中,使用SQL探查器在应用程序中运行场景可能会发现潜在的问题,例如由于延迟加载等原因而启动的意外查询。对于一个操作,您可能希望运行一个或一小部分查询,但只会找到几十个甚至数百个查询。将这个值乘以并发请求,数据库服务器就会说“坐下来等待,达姆