我在 Windows Server 2016 上的 IIS 中部署了一个 Web 应用程序。它使用 SQL Server 2016 数据库。目前,它的流量很大。当达到 Web 应用程序堆栈的限制(不知道限制是多少)时,登录页面会出现,但用户不会登录。因此它无法连接到 SQL 服务器。
当我重新启动 IIS 时,Web 应用程序又可以正常运行。现在,我必须每 10 分钟重新启动一次 IIS。我需要知道挂起的真正原因。我无法找出挂起的时间。下面我给出了一些细节。
操作系统 - Windows Server 2016
IIS - 版本 10.0
Web 应用开发平台 - ASP.NET MVC
数据库 - SQL Server 2016
数据库大小 - 3.07 GB,日志文件大小 - 648 MB
数据库索引相当好
服务器资源监视器显示 TCP 连接 500
如果有人有任何解决方案,请分享。谢谢
答案1
我还打算建议使用日志文件,正如 vidarlo 在上面的评论中所做的那样。IIS 日志文件(通常在 %SystemDrive%\inetpub\logs\LogFiles 中)将列出请求。假设您拥有对服务器的完全访问权限,请检查事件查看器。Web 应用软件是贵组织编写的还是外部提供的?您是否观察过服务器上的内存和 CPU 使用情况?Sql Server 是在同一个框中还是分开的?如果是分开的,请观察到 SQL 框的网络流量,以查看当 Web 服务器锁定时是否会发生变化。从另一个角度来看 - 也许问题是 c# 异步线程死锁 - 很容易做到(我自己在 MVC 中使用 aync 做过这件事)。
答案2
您需要使用日志/调查来缩小原因范围。sql 连接池中的连接数是有限的,您应该能够连接到 sqlserver 并查看该端发生的情况。打开查询存储并查看其输出以查看 sqlserver 是否不堪重负,但如果查询耗时过长,则应用程序需要在负载下优雅地降级(提示 - 检查 sql 查询的超时是否为 0,即无限期等待并注意有多个超时选项,请参阅https://learn.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlconnection.connectionstring?view=dotnet-plat-ext-7.0和https://learn.microsoft.com/en-us/troubleshoot/sql/database-engine/connect/timeout-expired-error 另外,请确保数据库服务器是这里的瓶颈,而不是 IIS 端或任何一端的网络基础设施(对客户端或数据库而言)