我对网络服务有很奇怪的问题。安装程序如下:在IIS7(win2008)下的x64单核,1gb ram机器上部署了6个Web服务,每个都在专用应用程序池中运行。 Web服务通过LB连接到mysql集群。我们正在使用mysql odbc连接器5.1.6连接池,.net v3.5。构建目标平台x64。 粗略地说,每3个小时,一个Web服务开始消耗100%的CPU(或者更好地说100%的CPU核心,但因为它是单核机器,它将是100%的CPU)。同时mysql服务器处于空闲状态。从任务管理器中“挂”w3wp无济于事,IIS重启有所帮助。我正在查看进程资源管理器,并在w3wp中查看一个奇怪的线程,其中包含以下堆栈跟踪,我无法理解:
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 :(得分:0)
如果你还没有这样做,你可以免费试用Redgate Ants Performance Profiler:如果你的代码中有任何瓶颈,一个未闭合的连接或者其他什么应该告诉你确切的位置。只需在完成后卸载它。
它可能比堆栈跟踪更有帮助:)
希望有所帮助 - 祝你好运!
答案 1 :(得分:0)
我们决定开始使用mysql连接器.net而不是mysql连接器odbc。我们所做的就是从OdbcConnection更改为MySqlConnection,从OdbcCommand更改为MySqlCommand,从OdbcParameter更改为MySqlParameter。我们针对它进行了几次加速测试,看起来我们不仅获得了稳定性而且还提高了性能。 因此,作为结论:使用MySql Connector .NET而不是MySql Connector ODBC。