System.Data.SqlClient.SqlException (0x80131904): 超时已过期。三种不同的案例

System.Data.SqlClient.SqlException (0x80131904): Timeout expired. Three different cases

提问人:Nikita Kalimov 提问时间:7/19/2022 更新时间:7/19/2022 访问量:7181

问:

我已经开始遇到超时错误,但不确定如何处理它们,因为它们每次都不同。

第一种超时类型

System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
 ---> System.ComponentModel.Win32Exception (258): Unknown error 258
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
   at System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()
   at System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()
   at System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()
   at System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte& value)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalConnectionTds.ExecuteTransactionYukon(TransactionRequest transactionRequest, String transactionName, IsolationLevel iso, SqlInternalTransaction internalTransaction, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.SqlInternalConnection.BeginSqlTransaction(IsolationLevel iso, String transactionName, Boolean shouldReconnect)
   at System.Data.SqlClient.SqlConnection.BeginTransaction(IsolationLevel iso, String transactionName)
   at System.Data.SqlClient.SqlConnection.BeginDbTransaction(IsolationLevel isolationLevel)
   at System.Data.Common.DbConnection.BeginDbTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken)

第二种超时

System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
 ---> System.ComponentModel.Win32Exception (258): Unknown error 258
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult)
   at System.Data.SqlClient.SqlCommand.EndExecuteNonQuery(IAsyncResult asyncResult)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)

第三种超时

System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
 ---> System.ComponentModel.Win32Exception (258): Unknown error 258
   at System.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__126_0(Task`1 result)
   at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location where exception was thrown ---
   at Dapper.SqlMapper.QueryAsync[T](IDbConnection cnn, Type effectiveType, CommandDefinition command) in C:\projects\dapper\Dapper\SqlMapper.Async.cs:line 419

如何诊断这些问题?去哪里看?为什么在三个不同的操作上会发生相同的超时错误?在客户端,设置是我最后的手段吗?CommandTimeout

另外,一个重要的细节:我碰巧遇到了这个超时错误,即使在TEST环境中没有负载。 .NET 6,MARS=false,Windows,超时=30。仅具有默认值。不幸的是,我没有设法捕捉到确切的堆栈跟踪。CommandTimeout

附言。 查看搜索结果,似乎没有解决我的问题的方法。在一种情况下,可能会有所帮助 [尝试过 - 帮助消除连接超时]。在另一个 - [好吧,我可能会尝试一下,但是在我使用数据库的任何地方输入它?它还可以帮助解决 BeginTransaction 超时吗?某处甚至存在 -setting,但即使禁用,问题也会重现。Linux 或 Windows - 也没关系,因为在 Windows 上也会遇到问题。我们认为迁移到 .NET 6 可能会有所帮助,但也没有帮助。TimeoutCommandTimeoutMARSMARS

C# SQL-Server System.Data.SqlClient

评论

1赞 McNets 7/19/2022
您是否检查了与服务器的连接?这似乎是网络问题。
0赞 Nikita Kalimov 7/19/2022
@McNets什么意思?这些错误不是某种中断 - 有些查询运行良好,但有些查询会超时。甚至是一样的。
0赞 Nikita Kalimov 7/19/2022
我的意思是,连接性总体上很好。应用程序连接到服务器,看起来是一些暂时性错误,或者服务器的线程池可能已耗尽。我只是不知道如何进行诊断。如何检查连通性?如何查看线程池?如何确定是客户端、服务器端还是网络端问题?是一个根本原因还是多个根本原因?:\
0赞 Charlieface 7/19/2022
您确定这不仅仅是一个糟糕的查询计划花费了太长时间吗?
0赞 mikkel 7/19/2022
@Charlieface:第一个例子只是一个 - 所以看起来像一个连接问题。编辑:当然,这可能是另一个计划糟糕的查询,将所有内容都带走。BeginTransaction()

答:

2赞 mikkel 7/19/2022 #1

指向 MSDN 的链接,有人遇到同样的问题。我相信相关信息是这样的:

当无法访问实例时,该消息本身是标准消息。但是,错误 258 在这种情况下是不寻常的。这不是 SQL Server 错误,而是操作系统错误;NET HELPMSG 258 说等待操作超时。

这可能表明您正在到达某个地方,但实际上没有人在听。也就是说,端口是开放的,但进程正忙于其他事情。(这不一定不是 SQL Server 进程。

那么,您的 SQL Server 运行情况如何?跟不上工作量?间歇性崩溃?防病毒和/或网络保护软件?

疑难解答提示

谷歌sp_Blitz和兄弟姐妹。它们是免费脚本,可帮助您查找 SQL Server 上的问题。另外sp_whoIsActive - 它非常擅长显示阻塞问题。

要找到线程池饥饿,你最好的选择可能是等待统计数据。

检查 sql server 中的 DMV。选择它(并保存),稍等片刻,然后再次选择 - 等待统计数据是累积的,所以不会给你任何有用的东西。顺便说一句,sp_Blitz将帮助您做到这一点。sys.dm_os_wait_statsselect * from sys.dm_os_wait_stats

如果启用了查询存储,则可以轻松找到资源消耗最多的查询,还可以找到一些有用的等待统计信息细分 - 但不确定 Threadpool 在哪里等待。