我们正在运行一个程序,该程序会在每个实例上在我们的 MS SQL Server 上创建 4-5 个进程。当进程数超过 230 时,程序会停止工作并每隔几分钟崩溃一次(sql server 日志显示“由于大量工作线程在等待 ASYNC_NETWORK_IO,node0 上的所有调度程序似乎都死锁了。进程利用率:0%”)。当这种情况发生时,我们的解决方案是直接终止 sql server 上的进程,这似乎不会导致任何其他问题,但我们希望永久解决这个问题。我们如何解决根本问题?或者,如果这是只有有问题的应用程序的开发人员才能做的事情,我们有什么可能性来创建解决方法(例如,让这些进程超时?)
答案1
如果您的程序在 SQL 实例上创建了 5 个连接,并且您看到实例上有 230 个繁忙的工作程序,则意味着该程序至少有 46 个副本。它们都在同一工作站上运行吗?如果我没记错的话,默认的工作程序数量是 255,您很可能会遇到这种情况。这样做的一个后果是客户端登录时间过长。根据应用程序的不同,登录超时可能会导致崩溃,长时间运行的查询也可能导致崩溃。
ASYNC_NETWORK_IO 表示 SQL Server 正在等待客户端应用程序从 SQL Server 读取数据。也许您已使工作站甚至服务器上的网络连接饱和?
您的服务器中装有哪种网络硬件?它是多核服务器吗?
答案2
看看这是否有帮助: 工作原理:17888 - 节点上的所有调度程序都出现死锁