2013-05-21 26 views
5

Mam problemy z usługą, która łączy się ze zdalnym wystąpienie SQL Server 2012.SQL Server 2012 zdalne połączenie daje błędach timeout i ASYNC_NETWORK_IO

.NET 2.0 Usługa działa na maszynie klientów i łączy za pomocą protokołu TCP/IP na zdalny serwer WWW, na którym obecnie działa instancja SQL Server 2012. Serwer sieciowy był systemem Windows Server 2003 i SQL Server 2005 i został uaktualniony 6 miesięcy temu bez żadnych problemów. Następnie usługa sprawdza, czy są jakieś dane, które musi pobrać.

Client Maszyna

  • Windows Server 2003

Web Server

  • Windows Server 2012
  • SQL Server 2012

To był uruchomiony grzywny na 5+ lat, aż do ostatniego piątku, kiedy to nagle przestał działać i daje komunikat dziennika następujący błąd

Event Type: Warning 
Event Source: 
Event Category: None 
Event ID: 0 
Date:  21/05/2013 
Time:  16:45:11 
User:  N/A 
Computer: 
Description: 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 
    at System.Data.SqlClient.TdsParserStateObject.ReadByteArray(Byte[] buff, Int32 offset, Int32 len) 
    at System.Data.SqlClient.TdsParserStateObject.ReadUInt32() 
    at System.Data.SqlClient.TdsParser.ReadSqlValueInternal(SqlBuffer value, Byte tdsType, Int32 typeId, Int32 length, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParser.ReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, Int32 length, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.ReadColumnData() 
    at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i) 
    at System.Data.SqlClient.SqlDataReader.ReadColumn(Int32 i, Boolean setTimeout) 
    at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i) 
    at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i) 
    at RedBlack.Data.Synchronisation.SyncManager.UpsertRecords(String sourceSelect, String destTable, String[] destFields, List`1 relations) 
    at General.CyPro.Application.WebSynchronisation.SyncRoutines.FetchOrders(UpsertFlags upsertOptions) 
    --- End of inner exception stack trace --- 
    at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Delegate.DynamicInvokeImpl(Object[] args) 
    at RedBlack.CyPro.Application.WebSynchronisation.Job.Run(Object[] args) 
... 
System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) 
    at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 
    at System.Data.SqlClient.TdsParserStateObject.ReadByteArray(Byte[] buff, Int32 offset, Int32 len) 
    at System.Data.SqlClient.TdsParserStateObject.ReadUInt32() 
    at System.Data.SqlClient.TdsParser.ReadSqlValueInternal(SqlBuffer value, Byte tdsType, Int32 typeId, Int32 length, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.TdsParser.ReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, Int32 length, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlDataReader.ReadColumnData() 
    at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i) 
    at System.Data.SqlClient.SqlDataReader.ReadColumn(Int32 i, Boolean setTimeout) 
    at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i) 
    at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i) 
    at RedBlack.Data.Synchronisation.SyncManager.UpsertRecords(String sourceSelect, String destTable, String[] destFields, List`1 relations) 
    at General.CyPro.Application.WebSynchronisation.SyncRoutines.FetchOrders(UpsertFlags upsertOptions) 

Sprawdziłem monitor aktywności na serwerze WWW i kiedy zapytanie jest prowadzony jest zawieszone z WAIT_TYPE z ASYNC_NETWORK_IO.

mam uruchomić kwerendę, która stara się uruchomić ręcznie w Management Studio na serwerze klientów łączących się zdalnie do instancji serwera WWW i działa na około 40 sekund przed powracającym 2600+ wiersze daje mi następujący błąd

Msg 121, Level 20, State 0, Line 0 
A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The semaphore timeout period has expired.) 

Uruchomiłem to samo zapytanie na moim komputerze w Management Studio, zdalnie łącząc się z instancją serwera WWW i zwracając kompletne 4000 wierszy w 0.312 sekund.

Brakuje mi próby rozwiązania tego problemu, ponieważ wydaje mi się, że jest to problem związany z siecią. Technicy sprzętu klienckiego sprawdzili sieć i powiedzieli, że wszystko jest w porządku, jeśli o nich chodzi.

Jeśli potrzebujesz więcej informacji daj mi znać

Dzięki

Odpowiedz

3

Zostało to rozwiązane, a problem z końcem okazał się być problemem z internetem klientów. Nie mam wszystkich szczegółów, ale BT znalazła problem na giełdzie i kiedy to zostało naprawione, program znów zaczął działać.

2

Oto coś spróbować. Here is an article on MSDN Blog sugeruje, że 2 rzeczy:

Long running task or uncommited transaction 

30 sekund jest wartością domyślną dla programu SQL Client czekać. To sprawia, że ​​maszyny klienta mają limit czasu. Może być rzeczywista szybkość przesyłania danych dla tego połączenia dla klientów jest zbyt wolny, aby uzyskać wszystkie wiersze w czasie? Może inny proces zamyka to połączenie, a czas oczekiwania klienta na odpowiedź?

+0

Rozwiązało to błędy limitu czasu, ale nie powodowało problemu, komunikaty o błędach zostały zmienione na 'Wystąpił błąd poziomu transportu podczas odbierania wyników z serwera. (dostawca: dostawca TCP, błąd: 0 - upłynął limit czasu semafora.) zamiast błędu limitu czasu. Klient ma wolny internet, ale od 6 lat ma tę samą prędkość połączenia, a obecnie otrzymuje dostawcę usług szerokopasmowych, aby sprawdzić połączenie. – Croberts

+0

Czy sprawdziłeś zmiany wprowadzone na serwerze internetowym tuż przed rozpoczęciem? Może to być łatka lub uaktualnienie, czy zmiana ustawień? A może twój klient został zmodernizowany/zmieniony? – Stoleg

+0

Limit czasu semafora - jest dolnym limitem czasu - może znajdować się na poziomie sieci lub systemu plików. Możesz uruchomić 'DBCC CHECKTABLE MyTable', aby sprawdzić, czy twój stół jest w porządku, ale sinse możesz uruchomić skrypt dobrze ze swojego komputera, problem jest poza bazą danych. – Stoleg

2

Sądząc uchwały przez innych, którzy mieli (nieco) podobne problemy, to prawie zawsze okazuje się być jedną z trzech rzeczy:

  1. uszkodzony lub nie disk (s). Użyj adresu CHKDSK /r, aby rozwiązać ten problem.

  2. Zły NIC lub

  3. problemy DHCP, szczególnie z upływem Lease/przedłużenia.

Nie jestem świadomy żadnych przypadków, gdy okazało się, że jest to coś konkretnego dla SQL Server.