2017-05-03 6 views
2

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.

enter image description here

enter image description here

+0

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

+0

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

+0

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

Antwort

1

Wenn Sie nicht asynchrone Aufrufe verwenden dann ihre möglich, dass eine der Nachrichten-Threads werden dauert länger als erwartet, und während es wartet ein anderer Thread zurückkehren klemmt und Sie sind im Grunde immer Threadlocked.

Die 2 mögliche Lösungen, die ich denken kann ist:

1) Stellen Sie sicher, dass Sie Asynchron-Anrufe auf die Datenbank machen.

2) Stellen Sie sicher, dass auf dem IIS-Server genügend Threads eingerichtet sind. Sie benötigen ein Minimum von 12, Standard-Setup ist in der Regel nur 1.

Verwandte Themen