Socket接收在Windows 2012下的.NET 4.5中挂起

时间:2013-09-04 15:31:36

标签: .net postgresql windows-server-2012 npgsql

我们有一个围绕NHibernate和Npgsql提供程序构建的Web应用程序,它在服务器2008 R2和.NET 4上运行良好。我们现在已经升级到Server 2012和4.5堆栈,并且正在经历奇怪的挂起数据库层。

我们的测试服务器(服务器2012的虚拟实例)上的线程将永久冻结,并且在生产服务器上挂起约7.5或15分钟(约450秒或900秒)(我只知道这是因为它通常会在日志中说明。

当我设法在我的测试服务上重现这个并附加调试器时,我发现一个线程将处于以下状态:

[Managed to Native Transition]   
System.dll!System.Net.Sockets.Socket.Receive(byte[] buffer, int offset, int size, System.Net.Sockets.SocketFlags socketFlags, out System.Net.Sockets.SocketError errorCode)  
System.dll!System.Net.Sockets.NetworkStream.Read(byte[] buffer, int offset, int size)    
mscorlib.dll!System.IO.BufferedStream.ReadByte()     
Npgsql.dll!Npgsql.NpgsqlState.ProcessBackendResponses_Ver_3.MoveNext()   
Npgsql.dll!Npgsql.ForwardsOnlyDataReader.GetNextResponseObject()     
Npgsql.dll!Npgsql.ForwardsOnlyDataReader.GetNextRowDescription()     
Npgsql.dll!Npgsql.ForwardsOnlyDataReader.NextResult()    
Npgsql.dll!Npgsql.ForwardsOnlyDataReader.ForwardsOnlyDataReader(System.Collections.Generic.IEnumerable<Npgsql.IServerResponseObject> dataEnumeration, System.Data.CommandBehavior behavior, Npgsql.NpgsqlCommand command, Npgsql.NpgsqlConnector.NotificationThreadBlock threadBlock, bool synchOnReadError)     
Npgsql.dll!Npgsql.NpgsqlCommand.GetReader(System.Data.CommandBehavior cb)    
Npgsql.dll!Npgsql.NpgsqlCommand.ExecuteBlind()   
Npgsql.dll!Npgsql.NpgsqlTransaction.Rollback()   
NHibernate.dll!NHibernate.Transaction.AdoTransaction.Rollback() 

在postgres结束时,我也看到了一个正在运行的查询,但我想这是因为事务永远不会回滚。我们正在使用Npgsql v2.0.12(最新的稳定版)。

这种挂起的原因是什么,以及这种极长的超时(或测试中没有超时)?为什么不同的操作系统会有所不同?

我们之前在一台服务器上使用.NET 4.5在服务器2008 R2上运行了这个,并且从未看到过这种行为。但我认为,因为这是一个Native调用,它依赖于OS?

有没有人知道为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

要检查的事项:

  1. 锁定服务器端。

  2. 网络中断和超时。

  3. 服务器的响应能力。

  4. 长时间运行的查询。