Azure SQL 单个数据库 DTU 超时过期错误
Azure SQL Single Database DTU Timeout Expired Error
我正在使用 Azure SQL 单一数据库 DTU 购买模式。平均负载似乎低于 10%。有时我会收到一个错误,现在几乎每天都在发生。我正在使用 EF Core 3.1 进行数据库访问。从 API 使用 ASP.NET 核心 3.1 构建并部署在 Linux Azure 应用服务上的数据库访问该数据库。
错误是:
Execution 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
堆栈跟踪:
An exception occurred in the database while saving changes for context type 'MTP.Api.Persistence.MTPDbContext'.
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
---> Microsoft.Data.SqlClient.SqlException (0x80131904): Execution 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 Microsoft.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__164_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 Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
ClientConnectionId:16f899d4-cfc9-4401-b631-1b4d547c4c19
Error Number:-2,State:0,Class:11
ClientConnectionId before routing:02e37a1e-981c-4ff6-9437-cade8b401cc5
Routing Destination:c71faab34237.tr1.francecentral1-a.worker.database.windows.net,11018
--- End of inner exception stack trace ---
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IList`1 entriesToSave, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(DbContext _, Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
知道是什么原因造成的吗?或者我如何找到导致问题的原因?
这可能与 EF Core exception when i send multiple requests #13452 有关:
I updated my project to ASP.NET Core 2.1 RTM.
When I send multiple requests, i get this exception:
Exception has occurred: CLR/System.Data.SqlClient.SqlException
An exception of type 'System.Data.SqlClient.SqlException' occurred in Microsoft.EntityFrameworkCore.dll but was not handled in user code: 'Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.'
Inner exceptions found, see $exception in variables window for more details.
Innermost exception System.ComponentModel.Win32Exception : Unknown error 258
@ajcvickers I found problem.The SQL Server host has received two updates: KB4338815, KB4338824.
Known issues in this update
Restarting the SQL Server service may fail occasionally with the error, “Tcp port is already in use”.
当我删除这些更新后,我的项目运行没有问题。
当然,这也可能只是一个死锁场景。为了更轻松地跟踪这一点,您可能需要记录两者:非常慢但成功的查询和失败的查询。
在死锁场景中,至少涉及到两个查询。至少一个会超时,但另一个可能仍低于超时阈值,然后在第一个查询被取消后成功。所以如果你记录两者,你可以追踪死锁的原因。
在任何情况下,如果您想要处理此类问题,您可能需要使用 options.EnableRetryOnFailure()
设置 Connection Resiliency 并可能降低命令超时值。这将重试失败的操作。
我将 nuget 包 Microsoft.Data.SqlClient 更新到了 2.0 版。这似乎解决了问题。
API 正在使用 EF Core 3.1。 EF Core 使用 MARS(MultipleActiveResultSets)。在 Linux 上部署并使用 MARS 时,Microsoft.Data.SqlClient 版本 1.0 似乎存在问题。 EF Core 默认使用 v1.
我正在使用 Azure SQL 单一数据库 DTU 购买模式。平均负载似乎低于 10%。有时我会收到一个错误,现在几乎每天都在发生。我正在使用 EF Core 3.1 进行数据库访问。从 API 使用 ASP.NET 核心 3.1 构建并部署在 Linux Azure 应用服务上的数据库访问该数据库。
错误是:
Execution 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
堆栈跟踪:
An exception occurred in the database while saving changes for context type 'MTP.Api.Persistence.MTPDbContext'.
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while updating the entries. See the inner exception for details.
---> Microsoft.Data.SqlClient.SqlException (0x80131904): Execution 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 Microsoft.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__164_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 Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
ClientConnectionId:16f899d4-cfc9-4401-b631-1b4d547c4c19
Error Number:-2,State:0,Class:11
ClientConnectionId before routing:02e37a1e-981c-4ff6-9437-cade8b401cc5
Routing Destination:c71faab34237.tr1.francecentral1-a.worker.database.windows.net,11018
--- End of inner exception stack trace ---
at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(IEnumerable`1 commandBatches, IRelationalConnection connection, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(IList`1 entriesToSave, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(DbContext _, Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken)
at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)
知道是什么原因造成的吗?或者我如何找到导致问题的原因?
这可能与 EF Core exception when i send multiple requests #13452 有关:
I updated my project to ASP.NET Core 2.1 RTM. When I send multiple requests, i get this exception:
Exception has occurred: CLR/System.Data.SqlClient.SqlException An exception of type 'System.Data.SqlClient.SqlException' occurred in Microsoft.EntityFrameworkCore.dll but was not handled in user code: 'Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.' Inner exceptions found, see $exception in variables window for more details. Innermost exception System.ComponentModel.Win32Exception : Unknown error 258
@ajcvickers I found problem.The SQL Server host has received two updates: KB4338815, KB4338824.
Known issues in this update Restarting the SQL Server service may fail occasionally with the error, “Tcp port is already in use”.
当我删除这些更新后,我的项目运行没有问题。
当然,这也可能只是一个死锁场景。为了更轻松地跟踪这一点,您可能需要记录两者:非常慢但成功的查询和失败的查询。
在死锁场景中,至少涉及到两个查询。至少一个会超时,但另一个可能仍低于超时阈值,然后在第一个查询被取消后成功。所以如果你记录两者,你可以追踪死锁的原因。
在任何情况下,如果您想要处理此类问题,您可能需要使用 options.EnableRetryOnFailure()
设置 Connection Resiliency 并可能降低命令超时值。这将重试失败的操作。
我将 nuget 包 Microsoft.Data.SqlClient 更新到了 2.0 版。这似乎解决了问题。
API 正在使用 EF Core 3.1。 EF Core 使用 MARS(MultipleActiveResultSets)。在 Linux 上部署并使用 MARS 时,Microsoft.Data.SqlClient 版本 1.0 似乎存在问题。 EF Core 默认使用 v1.