我有一个单线程C#/ .NET爬虫,它从SharePoint服务器(托管在VM上)下载文件。该服务器有大约345k文件,并使用默认的Windows NTLM身份验证。过去大约需要12到13个小时来下载和处理整个文件。现在,神秘地说,同样的过程大约需要21-24个小时才能完成。我将下载时间(每100个文件)记录在一个日志文件中,并查看每个批次的不同时间。请参阅以下内容:
...
12:04:22.521 Scanned items: 1700, Duration(ms): 15850
12:04:38.028 Scanned items: 1800, Duration(ms): 15506
12:04:54.236 Scanned items: 1900, Duration(ms): 16209
12:05:11.115 Scanned items: 2000, Duration(ms): 16879
...
12:08:02.109 Scanned items: 3000, Duration(ms): 14945
12:08:17.444 Scanned items: 3100, Duration(ms): 15334
...
...
17:10:08.835 Scanned items: 90600, Duration(ms): 33150
17:10:49.208 Scanned items: 90700, Duration(ms): **40373**
17:11:29.363 Scanned items: 90800, Duration(ms): **40155**
17:12:08.098 Scanned items: 90900, Duration(ms): 38735
17:12:46.007 Scanned items: 91000, Duration(ms): 37908
17:13:24.165 Scanned items: 91100, Duration(ms): 38158
17:13:52.292 Scanned items: 91200, Duration(ms): 28127
17:14:17.860 Scanned items: 91300, Duration(ms): 25568
17:14:43.569 Scanned items: 91400, Duration(ms): 25709
...
...
09:36:46.476 Scanned items: 345000, Duration(ms): 18533
09:37:05.680 Scanned items: 345100, Duration(ms): 19203
09:37:23.994 Scanned items: 345200, Duration(ms): 18315
...
最初,下载一批100个文件需要大约14-16秒。现在我看到有时需要40-45秒来处理同一批次。 SharePoint服务器上的文件大小相似(每个大约1MB,MS-word文档)。
我已经对应用程序进行了概要分析,但无法发现客户端(C#crawler)方面的任何明显差异(现在和早期代码之间)。我正在使用UnsafeAuthenticatedConnectionSharing=true并且已经为ServicePoint.ConnectionLeaseTimeout尝试了不同的值,包括 -1 (永不超时)和 PreAuthenticate = false (因为真的慢了)为NTLM进一步下降。
通过将下载的文件写入 System.IO.Null 流,我已经消除了本地磁盘I / O问题。应用程序的 GC行为也很好(始终<1%CPU时间),没有峰值。
我无能为力导致几乎100%的性能下降以及批处理时序变化如此之大的原因(从14秒/ 100个文件到有时45秒/ 100个文件)?
提前致谢,任何指示。
-BJ
答案 0 :(得分:0)
发布我自己的答案,因为它可能有助于某人。
在我们的案例中,在消除客户端(爬虫)中的任何问题后,我们开始调查SharePoint(SP)服务器。 SP和SQL Server DB共同位于VM上,随着时间的推移,我们注意到SP服务器将记录以下错误:
System.ServiceModel.ServiceActivationException :服务 '/_vti_bin/client.svc'由于异常期间无法激活 汇编。异常消息是:内存门检查失败 因为空闲内存(1041514496字节)小于总数的5% 记忆。因此,该服务将无法用于传入 请求..
以下link中也讨论了类似的问题:
修复SP服务器配置后,性能恢复到(几乎)早期级别。
-BJ