我承认这将是模糊的,但我会尽力而为。我有一个网站,通常每天会看到几百个用户,而很少看到CPU使用率超过5%。该网站在Windows 2012 R2,IIS 8.5,MS SQL Server 2016,.NET 4.5上运行。
问题是偶然请求需要30秒才能响应。我进行了跟踪,以查看减速发生的位置,它是在控制器返回ActionResult
和Application_EndRequest
的过程之间-总是 30秒,+ /-0.1-和结果是200(OK),而不是服务器超时-或数百个日志条目中最多为1-3秒(即,我从未见过延迟> 3和<30)。从Application_BeginRequest
到控制器返回的时间可以忽略不计,最多只有几十毫秒。
奇怪的是,只有少数用户遭受此困扰。我从未见过这种情况发生,也没有其他人发生。但是一小部分可以相当定期地复制它,尽管可能只有十分之一到五十倍。所有人都有合理的互联网连接(至少他们这样说)。
IIS应用程序池设置为4000个队列长度,唯一提及的30s是Ping周期。
部分控制器:
public class MyController : Controller
{
private readonly ApplicationDbContext db = new ApplicationDbContext();
public async Task<ActionResult> MyMethod(string x)
{
[...more code here, but log the time just before returning...]
HttpContext.Items.Add("stopTimer", DateTime.Now.ToString("HH:mm:ss.fff"));
return contentResult;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
}
db
是ApplicationDbContext
,没有花哨,只有一堆DbSet。控制器方法本身会执行“选择”查询,但不会插入/更新/删除任何内容。
global.asax.cs的一部分:
protected void Application_EndRequest(Object sender, EventArgs e)
{
string stopTimer = HttpContext.Current.Items["stopTimer"] as string;
LoggerController.LogWarning("c " + stopTimer);
LoggerController.LogWarning("d " + DateTime.Now.ToString("HH:mm:ss.fff"));
}
日志文件输出:
Today at 14:57:10 Warning c 22:56:40.673
Today at 14:57:10 Warning d 22:57:10.684
我不知所措,无法确定造成此延迟的原因。有什么想法下一步要寻找吗?谢谢。