2011-12-21 70 views
0

我有非常奇怪的網絡服務問題。安裝如下:在IIS7(win2008)下部署在x64單核,1gb ram機器上的6個Web服務,每個運行在專用應用程序池中。 Web服務通過LB連接到一個mysql集羣。我們正在使用mysql odbc連接器5.1.6,連接池爲.net v3.5。構建目標平臺x64。大約每3個小時,一個網絡服務開始佔用100%的CPU(或者更好地說100%的CPU核心,但是因爲它是單核心機器,它將是100%的CPU)。同時mysql服務器空閒。從任務管理器中「掛起」w3wp無效,IIS重新啓動有幫助。我期待在進程管理器,看看裏面的w3wp一個奇怪的線程與以下堆棧跟蹤,這是我無法理解:asp.net網絡服務高CPU使用率

ntoskrnl.exe!IoAcquireRemoveLockEx+0xe7 
ntoskrnl.exe!memset+0x22a 
ntoskrnl.exe!KeWaitForSingleObject+0x2cb 
ntoskrnl.exe!KeDetachProcess+0x120d 
ntoskrnl.exe!PsReturnProcessNonPagedPoolQuota+0x3a3 
ntoskrnl.exe!CcSetDirtyPinnedData+0x433 
myodbc5.dll!SQLTablePrivilegesW+0x22dac 
myodbc5.dll!SQLTablePrivilegesW+0x2bffd 
myodbc5.dll!SQLTablePrivilegesW+0x107ea 
odbc32.dll!SQLAllocHandle+0xba5 
odbc32.dll!SQLAllocHandle+0x9c8 
mscorwks.dll!IEE+0xa913 
System.Data.ni.dll+0x56f8c3 
System.Data.ni.dll+0x5c1efe 
mscorwks.dll!IEE+0xb0ee 
mscorwks.dll!CompareAssemblyIdentity+0x2bb8f 
mscorwks.dll!CompareAssemblyIdentity+0x39deb 
mscorwks.dll!CompareAssemblyIdentity+0xe63d 
mscorwks.dll!CertCreateAuthenticodeLicense+0x21b12f 
mscorwks.dll!StrongNameTokenFromPublicKey+0x49f7 
mscorwks.dll!PreBindAssembly+0x88a46 
mscorlib.ni.dll+0x3988d0 
mscorlib.ni.dll+0x39877a 
mscorwks.dll!IEE+0xb042 
mscorwks.dll!CompareAssemblyIdentity+0x2610d 
mscorwks.dll!CompareAssemblyIdentity+0x26358 
mscorwks.dll!CompareAssemblyIdentity+0x2ae50 
mscorwks.dll!CompareAssemblyIdentity+0x97ad7 
mscorwks.dll!CompareAssemblyIdentity+0x97877 
mscorwks.dll!CopyPDBs+0x170f3 
mscorwks.dll!InitializeFusion+0x5994 
mscorwks.dll!GetMetaDataInternalInterfaceFromPublic+0x34ad9 
mscorwks.dll!InitializeFusion+0x1282d 
mscorwks.dll!CorExitProcess+0x802d 
mscorwks.dll!InitializeFusion+0xb5db 
mscorwks.dll!CertCreateAuthenticodeLicense+0x240021 
mscorwks.dll!CompareAssemblyIdentity+0x97bcc 
mscorwks.dll!CompareAssemblyIdentity+0x97877 
mscorwks.dll!CreateAssemblyNameObject+0x2c29d 
mscorwks.dll!InitializeFusion+0x5994 
mscorwks.dll!GetMetaDataInternalInterfaceFromPublic+0x34ad9 
mscorwks.dll!InitializeFusion+0x1282d 
mscorwks.dll!StrongNameErrorInfo+0x130fe 
mscorwks.dll!InitializeFusion+0xbf48 
mscorwks.dll!StrongNameErrorInfo+0x76b0 
kernel32.dll!BaseThreadInitThunk+0xd 
ntdll.dll!RtlUserThreadStart+0x21 

我也能再現那些具有VS2010部署在另一臺機器上同樣的問題並能夠連接到「掛」 W3WP,看到GC終結線程坐在一起類似下面的一個堆棧跟蹤:

[Native to Managed Transition] 
System.Data.dll!System.Data.Odbc.OdbcHandle.ReleaseHandle() 
[Native to Managed Transition] 
[Managed to Native Transition] 
mscorlib.dll!System.Runtime.InteropServices.SafeHandle.Dispose(bool disposing) 
mscorlib.dll!System.Runtime.InteropServices.SafeHandle.Finalize() 
[Appdomain Transition] 

還有一堆棧跟蹤存在,我相信這是第一個的反射最後。

my_SQLFreeStmtExtended strmov Highest 
myodbc5.dll!strmov(char * dst, const char * src) Line 38 + 0xd bytes  
myodbc5.dll!cli_safe_read(st_mysql * mysql) Line 731  
myodbc5.dll!cli_read_query_result(st_mysql * mysql) Line 2739 + 0x8 bytes 
myodbc5.dll!mysql_next_result(st_mysql * mysql) Line 5221 + 0xd bytes 
myodbc5.dll!my_SQLFreeStmtExtended(void * hstmt, unsigned short fOption, unsigned int clearAllResults) Line 427 + 0xc bytes  
odbc32.dll!000007fef1d43ee9()  
[Frames below may be incorrect and/or missing, no symbols loaded for odbc32.dll]  
odbc32.dll!000007fef1d43d3e()  
mscorwks.dll!000007fef102cd27() 
System.Data.ni.dll!000007feebe73ad3() 

這個問題在生產16核心機器上顯然也是可重現的。 我們已經執行代碼審查,並在我們可能可能遺留連接未關閉且未處置的地方修復/重寫代碼。 我會感謝這個問題的任何幫助,並接受任何建議,我還能看到什麼。

回答

0

我們決定開始使用mysql連接器.net而不是mysql連接器odbc。我們所做的所有事情都從OdbcConnection更改爲MySqlConnection,從OdbcCommand更改爲MySqlCommand,從OdbcParameter更改爲MySqlParameter。我們對它進行了幾次加速測試,看起來我們不僅獲得了穩定性,而且還獲得了改進的性能。 因此,作爲結論:使用MySql連接器.NET而不是MySql連接器ODBC。

0

如果你還沒有這樣做,你可以免費試用Redgate Ants Performance Profiler:如果你的代碼有任何瓶頸,一個未關閉的連接或任何這應該告訴你究竟在哪裏。只需在完成後卸載它。

這可能比堆棧跟蹤:)

。希望helps-好運更有幫助!