MSBUILD(VS2010)在某些机器上速度很慢

时间:2011-03-14 12:20:05

标签: performance visual-studio-2010 msbuild

我有一个非常奇怪的。

我的开发部门中有大约十几台PC都遭遇同样的问题: 使用msbuild4.0(VS2010)的命令行构建比应该的慢。比预期慢4倍到5倍。

所有机器都是HP z400工作站(四核Xeon +超线程,2.4 GHz,6GB RAM)  在Win7 X64上运行Windows 7 Pro 64位或HP Elitebook笔记本(Core-i7 4GB RAM)。 如果我选择预先安装了Win7的vanilla工厂中的一个,安装VS2010并进行构建,它们的速度与预期一样快。如果我使用我们公司的标准软件映像安装它们,它们在同一个VS项目中的速度会慢4到5倍。

联想笔记本电脑(Core-i5)或台式机(Core-i7)上的相同公司软件映像显示公司映像与出厂预装Win7之间没有明显差异。 它甚至更奇怪:如果我在HP系统上安装带有Win7映像的VirtualBox,问题是虚拟机没有问题。

我尝试的每个基准测试工具都显示公司映像与预安装的Win7之间没有明显差异。只有msbuild受到影响,且仅在公司映像上运行Win7的HP计算机上受到影响。

在您提出问题之前:我已禁用公司图像中的所有软件/后台进程,但这没有任何区别。它显然不是在后台运行的东西,它以某种方式与msbuild交互。我最好的猜测是,在HP硬件上,一些设置会发生变化,从而影响msbuild。这在其他硬件上不会发生。 (并且根本不使用/执行VS2010 GUI。我知道如果两者都尝试访问相同的解决方案/文件,它可以与msbuild交互。防病毒也没有任何区别。)

任何人都知道什么可能影响msbuild减速? 任何建议,无论多么牵强,都是受欢迎的。

4 个答案:

答案 0 :(得分:4)

首先,我假设您没有像在网络位置或映射驱动器上构建或重定向“文档”文件夹那样做任何蠢事?

下一步是使用任务管理器查看哪些进程正在减慢您的速度。处理器使用率是否为100%?哪些流程有效?它是否分页很多(看看“页面错误增量”)?哪个流程?

我不得不说这听起来像杀毒软件。您应该从防病毒读写扫描中排除OBJ,LIB,ILK,PDB和类似文件类型。

我知道你说“防病毒没有任何区别”,但你还没有确认你已经尝试完全关闭它。

另请参阅搜索索引器,连续备份或可能响应构建活动的类似过程。

答案 1 :(得分:2)

我自己回答了这个问题。 有问题的计算机都安装了“Entrust Entelligent Security Provider”软件。 (我们公司用于加密邮件处理的证书管理员。)

.NET4(其中编写了VS2010)和.NET4代码的编译需要大量的证书检查,而这个软件(在此过程中被调用)显然在多核PC上存在问题。内核越多,事情变得越慢。

core-i5系统也存在这个问题,但并不是那么糟糕。它们仍然可用。 i7和Xeon系统(8个核心)慢慢变得几乎无法使用。

不幸的是我无法摆脱这个Entrust软件。它是公司强制软件套件的一部分。 我希望供应商能为此提供解决方案。

编辑:Entrust Entelligence版本10解决了问题。默认情况下,它不会将自身设置为系统中的第一个证书处理程序 在v9上,需要手动编辑注册表以将MS处理程序放回默认位置 这是真正的问题:每个证书检查首先通过Entrust DLL,它将队列中的所有内容推送到仅由单线程/ CPU清空的队列中。然后它发现它不应该处理这个证书并将其交给微软处理程序。

答案 2 :(得分:1)

从命令行运行MSBuild,其详细程度设置为diag:

MSBuild mysolution.sln /v:diag

这将生成一个列表,其中包含每个任务所花费的时间。这应该会给你一些信息。

答案 3 :(得分:0)

诊断报告将显示MSBuild如何在详细级别上运行,但并不总是有助于诊断性能问题。尝试运行正常构建,将以下附加选项添加到msbuild命令行:

/ds /clp:performancesummary

这将输出有关节点使用情况的诊断摘要,并在构建的控制台输出结尾添加详细的性能摘要,显示每个任务的运行时间。如果您使用文件记录器,则可以在文件记录器参数的末尾添加“; presentationsummary”选项(/ flp:...)。

要注意的另一件事是减少AssemblySearchPaths属性以仅使用您在项目中使用的路径,这是我见过的某些构建的性能问题的原因。只需在Microsoft.Common.targets中搜索,在所有项目使用的标准导入中重新定义它(你确实有其中一个,正确:)并在导入标准文件之前重新定义它,删除任何{.. 。}你没有使用的项目。