Wir haben vor kurzem die Rückwandplatine mit SQL-Server implementiert. Der Server, auf dem wir die Backplane erstellt haben, enthält auch andere Datenbanken. Auf diese anderen Datenbanken greifen verschiedene Anwendungen zu, die sich auf unterschiedlichen Servern befinden. Für Stresstests haben wir ein einfaches Signal-Client-Programm implementiert, das alle 30 Sekunden eine Nachricht an den Server sendet. Es gibt zwei Server, die von einem Load Balancer behandelt werden. Die Backplane funktioniert perfekt, wenn die Anzahl der Clients klein ist.Signaler SQL-Backplane verursacht Die Wartezeit abgelaufen überschritten Ausnahme
Das Problem tritt auf, wenn die Anzahl der Clients höher ist. (näher an 50 oder mehr). Die folgende Ausnahme wird von anderen Anwendungen ausgelöst, die versuchen, den Datenbankserver für eine andere Datenbank zu verwenden.
System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. ---> System.ComponentModel.Win32Exception: The wait operation timed out
--- End of inner exception stack trace ---
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.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext)
at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
--- End of inner exception stack trace ---
at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)
at System.Data.Entity.Core.Objects.Internal.ObjectQueryExecutionPlan.Execute[TResultType](ObjectContext context, ObjectParameterCollection parameterValues)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func`1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectQuery`1.<>c__DisplayClass7.<GetResults>b__5()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
at System.Data.Entity.Core.Objects.ObjectQuery`1.<System.Collections.Generic.IEnumerable<T>.GetEnumerator>b__0()
at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
at System.Linq.Queryable.Count[TSource](IQueryable`1 source)
Aufgrund dieser Ausnahme alle anderen Anwendungen Pausen, da sie nicht auf die Datenbank zugreifen können. Das Problem wird sofort behoben, wenn wir die Backplane deaktivieren. (Stoppt die beiden Signalserver). Ist dies das erwartete Verhalten bei Verwendung der Backplane mit einer hohen Anzahl von Benutzern oder ist es ein Problem mit der Backplane?
PS - Wir haben festgestellt, dass die Maschinen, die diese Ausnahmen auslösen, mehr als 3000 Threads für den Prozess w3wp.exe zugewiesen haben. Scheint so, als ob sie bei einer Operation stecken bleiben.
Haben Sie versucht, SQL-Server Profil und finden Sie heraus, gibt es schwere Abfragen, die mehr als 30 Sekunden dauern zu beenden? Irgendwelche Leistungsuntersuchungen? – cassandrad
Leider haben wir keinen Zugriff für diesen Datenbank-Rechner, aber die gleichen Abfragen, die Timeout-Ausnahme bekommen, funktionieren einwandfrei, wenn wir die Backplane deaktivieren. – janitha000
Normalerweise sollte die Rückwandplatine keine Probleme verursachen. Darüber hinaus kann SQL Server eine größere Arbeitslast bewältigen. Haben Sie die Anzahl der Verbindungen überprüft und Nachrichten gesendet? – cassandrad