我在我的服务器上运行 dbWarden 的 CheckFiles 程序。
工作从未结束,我的日志开始以每分钟 1 条的速度填满消息:2014-01-07 08:40:04.07 Server Process 58:0:0 (0x1438) Worker 0x00000000D62B41C0 appears be non-yielding on调度程序 4。线程创建时间:13033413586324。使用的大约线程 CPU:内核 46 毫秒,用户 2421 毫秒。工艺利用率 10%。系统空闲 82%。间隔:79691009 毫秒。
据我了解,这意味着 CPU 上的线程刚刚被锁定。
SSMS GUI 不再适用于该实例。在 TSQL 中,大多数事情都有效,除非它们引用快照,这会禁止大多数 dmv 和系统过程。SP_Who2 不起作用,但 SP_Who 起作用。
SP_WHO 向我展示了 58 在 ready 和 spinloop 之间交替。
58 正在运行代码以检查快照上的文件(位置、增长信息等)。
当我杀死 58 时,它说它正在回滚,但什么也没有发生,它仍然处于自旋循环中。
当我尝试 SP_Who2 时,它被 spinloop 阻止了。当我放下快照时,它被自旋循环阻止了。当我重新启动或停止/启动实例服务时,错误返回到日志并且自旋循环恢复。
有什么想法或建议吗?
默认值是问题所在,因为流氓进程会利用所有可用线程并导致线程饥饿。更好的方法是调整 maxdop 设置,如 什么是在 SQL Server 上计算 MAXDOP 的良好、可重复的方法?
另外,让回滚完成,就像在回滚进行时重新启动 sql server 一样,它将重做服务重新启动时已经完成的所有操作。
可以找到类似的案例Need to understand parallel query execution error。我提供了更多详细信息,可以更好地向您解释。