Bu yazıda SQL Server Error Loglarına düşen hata ilgili bilgi paylaşımı yapacağız. Event viewer Application logları, SQL Server Error loglarınında bilgisini topladığı için bu hataya ilişkin bilgiye Event viewer üzerinden de görüntülenebilecektir.
Error (Event ID: 4014): A fatal error occurred while reading the input stream from the network. The session will be terminated (input error: 0, output error: 0).
Event Viewer => Windows Logs=> Application;
SQL Server Error Logs (Error 4014, Severity:20, State:11);
Bu hatanın loglara düşmesinde birden çok sebep olabilir. Bu hatanın düştüğü durumlarda kullanıcılar bazı sorunlar yaşayabilir. Sistemde yığılmalar meydana gelebilir ve Network Latency’ler meydana gelebilir. Teml sebep olarak bu hatanın düşmesine network katmanından gelen sessionların ISS katmanı ile veri tabanı katmanı arasında paket kayıplarından meydana gelmektedir. Büyük paketler içindeki sessionlar kendisine ait bilgiyi kaybettiğinde drop olabilmektedir.
Yaşanabilecek olası sonuçların kök sebeplerine baktığımızda karşımıza bazı problemler çıkmaktadır. Bunlardan bazıları;
- SQL Server’da Implicit transaction’ların açık olması, yani begin transaction ve commit işlemlerinin default değil manuel olarak bunun açılıp, transaction işlemleri commit edilmez taki siz commit edene kadar. Açık transaction’lar ağ da meydana gelebilecek yoğunluğu artıracağı için bu hatanın oluşmasına neden olacaktır.
- Network bant genişliğinizin uygulama sunucularından gelen ve giden trafiğinizi kaldırabilecek boyutlarda olmalı. Özellikle Jumbo paketlerde bu sorun ortaya çıkabilir. Bu konu da ağ ile ilgili Jumbo paketlerinizin ağ trafiğinde işlem yapabilmesi için açık olması gerekmektedir. Jumbo paketler yoğun olarak geliyorsa ağ paket boyutunun yapılandırmasını 8192 byte’a çıkarılabilir.
- TCP Chimney Offloads: Chimney, Microsoft’a network ürünleri sağlayan vendor’lardan biri. Windows kurulumlarından 2003 sonrası bu ürünün özelliği pasif gelmekte fakat bazen açık olabiliyor. IPV4 ve IPV6 üzerinden trafik transferi yapılmakta. Bu özelliği pasife çektikten trafiğin sadece bir kanaldan transferi sağlanacağı için paket kayıpları olma ihtimali azalacaktır. IPV6 üzerinden yükün az olduğu zamanlarda bu test edilebilir.
- NIC Teaming yapılması,sunucunuzda 2 veya daha fazla network kartı var ise bunları gruplandırarak tek bir kartı gibi çalıştırmak gerekir. Network kartı üzerinde meydana gelebilecek arıza durumunda diğer network kartı üzerinden trafik akışı devam edecektir. Bu şekilde olması load balancing yapacağı için network trafiğinde ki performansı da artıracaktır.
- Jumbo paketlerin bir pakete sığabilmesi için SQL Server üzerinden Network Packet Size değerini 8192 byte olarak yeninden configure edilebilir. Bu değer yeniden setlenmesi sonrası sistemin belirli bir süre izlenmesi faydalı olacaktır.
1 2 3 4 5 6 7 8 9 |
sp_Configure 'show advanced options',1; reconfigure sp_Configure 'network packet size (B)',8192; reconfigure sp_Configure |
- Network adaptörlerinin update edilmesi, firmware ve güncel driver’ların update edilmesi bu hatanın giderilmesine ilişkin bir diğer yollardan biri olacaktır.
Aşağıdaki script ile 4014 hatasından kaynaklı paket kayıplarını inceleyebilirsiniz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
;WITH RingBufferConnectivity as ( SELECT records.record.value('(/Record/@id)[1]', 'int') AS [RecordID], records.record.value('(/Record/ConnectivityTraceRecord/RecordType)[1]', 'varchar(max)') AS [RecordType], records.record.value('(/Record/ConnectivityTraceRecord/RecordTime)[1]', 'datetime') AS [RecordTime], records.record.value('(/Record/ConnectivityTraceRecord/SniConsumerError)[1]', 'int') AS [Error], records.record.value('(/Record/ConnectivityTraceRecord/State)[1]', 'int') AS [State], records.record.value('(/Record/ConnectivityTraceRecord/Spid)[1]', 'int') AS [Spid], records.record.value('(/Record/ConnectivityTraceRecord/RemoteHost)[1]', 'varchar(max)') AS [RemoteHost], records.record.value('(/Record/ConnectivityTraceRecord/RemotePort)[1]', 'varchar(max)') AS [RemotePort], records.record.value('(/Record/ConnectivityTraceRecord/LocalHost)[1]', 'varchar(max)') AS [LocalHost] FROM ( SELECT CAST(record as xml) AS record_data FROM sys.dm_os_ring_buffers WHERE ring_buffer_type= 'RING_BUFFER_CONNECTIVITY' ) TabA CROSS APPLY record_data.nodes('//Record') AS records (record) ) SELECT RBC.*, m.text FROM RingBufferConnectivity RBC LEFT JOIN sys.messages M ON RBC.Error = M.message_id AND M.language_id = 1033 WHERE RBC.RecordType='Error' and RBC.Error=4014 ORDER BY RBC.RecordTime DESC |
–
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
-XE Events (Extended Events) Query: /*************************************************************** ** Errors reported along with the error counts ****************************************************************/ --Aşağıdaki extend event ile sistemde meydana gelen paket kayıplarını ve neden kayıp olduğunu bulabilirsiniz. SET NOCOUNT ON -- Store the XML data in a temporary table SELECT CAST(xet.target_data AS XML) AS XMLDATA INTO #xeTmpTbl FROM sys.dm_xe_session_targets xet JOIN sys.dm_xe_sessions xe ON ( xe.address = xet.event_session_address ) WHERE xe.name = 'system_health' -- Get statistical information about all the errors reported ;WITH myXEinfo ( EventXML ) AS ( SELECT C.query('.') EventXML FROM #xeTmpTbl a CROSS APPLY a.XMLDATA.nodes('/RingBufferTarget/event') AS T ( C ) ), myXEErrorInfo ( EventTime, ErrorNum ) AS ( SELECT EventXML.value('(/event/@timestamp)[1]', 'datetime') AS EventTime , EventXML.value('(/event/data/value)[1]', 'int') AS ErrorNum FROM myXEinfo WHERE EventXML.value('(/event/@name)[1]', 'varchar(255)') = 'error_reported' ) SELECT ErrorNum , MAX(EventTime) AS LastRecordedEvent , MIN(EventTime) AS FirstRecordedEvent , COUNT(*) AS Occurrences , b.[text] AS ErrDescription FROM myXEErrorInfo a INNER JOIN sys.messages b ON a.ErrorNum = b.message_id WHERE b.language_id = SERVERPROPERTY('LCID') GROUP BY a.ErrorNum , b.[text] -- Get information about each of the errors reported ; WITH myXEinfo ( EventXML ) AS ( SELECT C.query('.') EventXML FROM #xeTmpTbl a CROSS APPLY a.XMLDATA.nodes('/RingBufferTarget/event') AS T ( C ) WHERE C.query('.').value('(/event/@name)[1]', 'varchar(255)') = 'error_reported' ) SELECT EventXML.value('(/event/@timestamp)[1]', 'datetime') AS EventTime , EventXML.value('(/event/data/value)[1]', 'int') AS ErrNum , EventXML.value('(/event/data/value)[2]', 'int') AS ErrSeverity , EventXML.value('(/event/data/value)[3]', 'int') AS ErrState , EventXML.value('(/event/data/value)[5]', 'varchar(max)') AS ErrText --EventXML.value('(/event/action/value)[2]', 'varchar(10)') AS Session_ID FROM myXEinfo ORDER BY EventTime DESC -- Drop the temporary table DROP TABLE #xeTmpTbl |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
/************************************************************************** ** Extract Ring Buffer Information for SQL Server 2008 instances and above **************************************************************************/ SELECT CONVERT (VARCHAR(30), GETDATE(), 121) AS run_time , DATEADD(ms, ( a.[record_time] - sys.ms_ticks ), GETDATE()) AS [notification_time] , a.* , sys.ms_ticks AS [current_time] FROM ( SELECT x.value('(//Record/Error/ErrorCode)[1]', 'varchar(30)') AS [error_code] , x.value('(//Record/Error/CallingAPIName)[1]', 'varchar(255)') AS [calling_API_name] , x.value('(//Record/Error/APIName)[1]', 'varchar(255)') AS [API_name] , x.value('(//Record/Error/SPID)[1]', 'int') AS [SPID] , x.value('(//Record/@id)[1]', 'bigint') AS [record_id] , x.value('(//Record/@type)[1]', 'varchar(30)') AS [type] , x.value('(//Record/@time)[1]', 'bigint') AS [record_time] FROM ( SELECT CAST (record AS XML) FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = 'RING_BUFFER_SECURITY_ERROR' ) AS R ( x ) ) a CROSS JOIN sys.dm_os_sys_info sys ORDER BY a.[record_time] ASC |
0 Yorum