TLDR - HTTP 클라이언트 연결 누출 수정 좋지만, 첫 번째 문제는 스레드를 차단하고 있습니다. 또한 민감한 데이터를 노출했을뿐입니다. 또한 iisreset 대신 항상 전체 응용 프로그램 풀 재활용으로 시작하여 전체 서버를 중단시키지 마십시오.
위에서 언급했듯이 HTTPClient를 사용하여 TCP 연결을 유출했는데 다음 문제가 발생하기를 기다리는 확장 제한 항목이긴하지만 중요한 문제는 아닙니다.
플러스 모든 TCP 포트를 다 써 버린 경우, 예외가 나타나면 중단이 아닌 더 명확하게 나타납니다.
debugdiag 분석을 보면 문제가 동기화 SQL 호출로 다른 스레드의 40 %를 차단하고있는 것으로 보입니다. 결국 모든 작업자 스레드가 다른 블로킹 스레드에서 대기 중일 경우, 요청 큐가 가득 차서 503 서비스를 사용할 수 없게 될 때까지 요청이 대기열에 들어갑니다.
The following threads in w3wp.exe__AppXtender Rest Services__PID__12056__Date__03_28_2017__Time_09_58_36AM__83__Manual Dump.dmp are waiting to enter a .NET Lock
(33 34 35 50 52 53 54 56 57 58 59 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107)
50.91% of threads blocked (56 threads)
그리고 그들은 소문에 대기중인 스레드를 SqlCommand.ExecuteReader
실행 55 인은
당신이 변경 (또는 해당 구성 요소의 소유자가 변경 수)
Thread 55 - System ID 17820
Entry point clr!Thread::intermediateThreadProc
Create time 3/28/2017 9:51:46 AM
Time spent in user mode 0 Days 00:00:00.421
Time spent in kernel mode 0 Days 00:00:00.187
This thread is waiting on data to be returned from the database server
The current executing command is : SELECT cfgid, cfgvalue FROM ae_cfg WHERE cfgid = 34 and the command timeout is set to 0 seconds.
The connection string for this connection : *** and the connection timeout : 15 seconds.
.NET Call Stack
System_Data_ni!DomainNeutralILStubClass.IL_STUB_PInvoke(SNI_ConnWrapper*, SNI_Packet**, Int32)+84
[[InlinedCallFrame] (.SNIReadSyncOverAsync)] .SNIReadSyncOverAsync(SNI_ConnWrapper*, SNI_Packet**, Int32)
System_Data_ni!SNINativeMethodWrapper.SNIReadSyncOverAsync(System.Runtime.InteropServices.SafeHandle, IntPtr ByRef, Int32)+6a
System_Data_ni!System.Data.SqlClient.TdsParserStateObject.ReadSniSyncOverAsync()+83
System_Data_ni!System.Data.SqlClient.TdsParserStateObject.TryReadNetworkPacket()+7e
System_Data_ni!System.Data.SqlClient.TdsParserStateObject.TryPrepareBuffer()+65
System_Data_ni!System.Data.SqlClient.TdsParserStateObject.TryReadByte(Byte ByRef)+2e
System_Data_ni!System.Data.SqlClient.TdsParser.TryRun(System.Data.SqlClient.RunBehavior, System.Data.SqlClient.SqlCommand, System.Data.SqlClient.SqlDataReader, System.Data.SqlClient.BulkCopySimpleResultSet, System.Data.SqlClient.TdsParserStateObject, Boolean ByRef)+292
System_Data_ni!System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()+5c
System_Data_ni!System.Data.SqlClient.SqlDataReader.get_MetaData()+66
System_Data_ni!System.Data.SqlClient.SqlCommand.FinishExecuteReader(System.Data.SqlClient.SqlDataReader, System.Data.SqlClient.RunBehavior, System.String)+11d
System_Data_ni!System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, Boolean, Int32, System.Threading.Tasks.Task ByRef, Boolean, System.Data.SqlClient.SqlDataReader, Boolean)+ba0
System_Data_ni!System.Data.SqlClient.SqlCommand.RunExecuteReader(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, System.String, System.Threading.Tasks.TaskCompletionSource`1, Int32, System.Threading.Tasks.Task ByRef, Boolean)+22a
System_Data_ni!System.Data.SqlClient.SqlCommand.RunExecuteReader(System.Data.CommandBehavior, System.Data.SqlClient.RunBehavior, Boolean, System.String)+62
System_Data_ni!System.Data.SqlClient.SqlCommand.ExecuteReader(System.Data.CommandBehavior, System.String)+ca
XtenderSolutions.UtilityLibrary.General.DbCommon.GetStringTypeFromDB(XtenderSolutions.Administration.Database.DbCommonEx)+1aa
XtenderSolutions.UtilityLibrary.General.DbCommon.Open()+11c
XtenderSolutions.CMData.CMConnection.Open()+a7
XtenderSolutions.CMData.CMCfgMgr.Load(XtenderSolutions.CMData.CMConnection, Int16)+55
XtenderSolutions.CMData.CMConnection.InitEAIHooks()+4f
XtenderSolutions.CMData.CMConnection.Init(System.String)+595
XtenderSolutions.CMData.CMConnection..ctor(XtenderSolutions.CMData.CMSession, System.String)+17b
XtenderSolutions.CMData.CMSession.get_Connection()+7e
XtenderSolutions.CMData.CMSession.Login(XtenderSolutions.Configuration.DataSourceConfig, System.String, System.String, System.Security.Principal.WindowsIdentity, System.String, Boolean)+46e
해야하는
async version - ExecuteReaderAsync있다
또한 은 공유하기 전에 debugdiag 공유를 제거하거나 적어도 공유에서 중요한 데이터를 제거하고 변경 사항을 적용하려면을 강력하게 추천합니다. NT 암호.
힌트 : Basic Auth headers -> 64 기수 -> 일반 텍스트 사용자 : PWD
마지막으로 IISReset을이 :
당신이 채워 HTTP.SYS 요청 큐의 단계에서 아직하지 않은 경우, 당신은 또한 응용 프로그램을 시도 할 수 있습니다 풀 리사이클링은 새로운 w3wp.exe 작업자 프로세스를 제공하거나 현재 중지 요청을 기다리지 않으려는 경우에도 풀을 중지/시작합니다. 풀 재활용은 전체 IIS 서버를 중단시키는 데 덜 관입입니다. 그러나 http.sys 큐에서 많은 요청을 받자 마자 iisreset이 필요할 수 있습니다. 나는 항상 그 호스트에 다른 사이트/vdirs가있는 경우 iisreset을 피하려고 노력합니다 ... IIS perf counters을 모니터링하고이를 기반으로 결정할 수 있습니다.
감사합니다. 정적 HttpClient를 사용하는 수정 된 코드와 db 요청을 차례로 보내기 위해 SQL Server에 데이터를 쓰는 몇 가지 메소드에 semaphoreslim을 추가했습니다. 앱 풀 중단은 어느 정도 감소했지만 여전히 발생합니다. 당신은 시사 포림이 어떤 영향을 미칠 것이라고 생각합니까? 또한 요청이 생성되어 다른 서버 (단일)로 전송되어 처리되도록하는 웹 팜 (3 서버)이 있습니다. 이것이 교수형과 관련이 있습니까? –