我们对客户机器上的重复错误感到非常困惑。我有一个长期运行的应用程序,可以在大约20个小时内处理大约600万条记录。在我们的开发环境本地一切正常,该过程每天都成功完成。但是,在我们客户的机器上,我们会继续超时。
程序只是在每条记录上使用Parallel.Foreach
来生成一个线程并处理记录,执行一些查询和插入。
在客户端的sql日志中,我们看到:
2013-11-21 09:02:12.10 spid4s SQL Server has encountered 4 occurrence(s) of I/O requests taking longer than 15 seconds to complete on file [E:\Program Files...
2013-11-21 09:02:12.10 spid4s SQL Server has encountered 5 occurrence(s) of I/O requests taking longer than 15 seconds to complete on file [E:\Program Files...
2013-11-21 09:18:02.35 spid4s SQL Server has encountered 10 occurrence(s) of I/O requests taking longer than 15 seconds to complete on file [E:\Program Files...
在我的C#应用程序的日志文件中,我收到错误:
------ERROR------
Time : 11/21/2013 9:05:14 AM
Source : .Net SqlClient Data Provider
Module : SqlInternalConnection
Method : Void OnError(System.Data.SqlClient.SqlException, Boolean)
Message : Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
Occurring At :
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.ReadByte()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
在客户能够给我们的一些痕迹中,没有什么看起来与众不同,直到查询开始超时。我们没有看到查询时间或任何明显模式的稳定攀升。
我们已经在查询中添加了with (nolock)
以确保我们没有死锁,即使sql日志没有报告任何问题。机器上有16GB内存,sql的最大值设置为~14GB。
基本上我想知道是否有人可以帮我开始找到问题。它不会在一天中的同一时间发生,并且永远不会出现在相同的记录中(在不同的运行中崩溃之前已经处理了20万到150万之间)。