1

NHibernate と Npgsql プロバイダーを中心に構築された Web アプリケーションがあり、サーバー 2008 R2 と .NET 4 で正常に動作しています。サーバー 2012 と 4.5 スタックにアップグレードしたところ、データベース レイヤーで奇妙なハングが発生しています。 .

テスト サーバー (サーバー 2012 の仮想インスタンス) で永久にフリーズするスレッドがあり、実稼働サーバーでは約 7.5 分または 15 分 (約 450 秒または 900 秒) ハングします (通常はわかるので、これだけは知っています)。ログで)。

テストサービスでこれを再現し、デバッガーをアタッチすると、1 つのスレッドが次の状態になることがわかります。

[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 (最新の安定版) を使用しています。

このハングの原因と、この非常に長いタイムアウト (またはテストでのタイムアウトの欠如) の原因は何ですか? そして、なぜ異なるOSで異なるのでしょうか?

以前に、1 つのサーバーで .NET 4.5 を使用してサーバー 2008 R2 でこれを実行しましたが、この動作も見られませんでした。しかし、これはネイティブ呼び出しなので、OS に依存していると思いますか?

なぜこれが起こるのかについて誰かが理論を持っていますか?

4

1 に答える 1