【发布时间】:2011-06-20 14:03:06
【问题描述】:
我目前使用 Web Deploy http://learn.iis.net/page.aspx/346/web-deploy/ 发布我的 MVC2 应用程序。以前很好用,现在用不了了:
当 MVC 应用程序很小且只有少数用户时,它很容易发布。只需右键单击 Visual Studio 中的项目并选择“发布”。由于只有少数用户,因此很容易找到没有人使用该网站进行快速更新的时间。
然后应用变得更大,并拥有更多用户。 “发布”操作开始花费越来越长的时间,并且有时会超时。即使我在部署之前回收了应用程序池,它仍然需要很长时间。
此外,很难找到没有人使用该网站的时间,因此可以在不影响任何人的情况下完成更新。
然后“发布”操作每次都开始超时,我不得不根据之前未回答的问题切换到手动部署:Visual Studio 2010 - web deploy times out - what to do?
现在手动部署需要的时间越来越长,从 5 分钟到 20 分钟。并且用户数量显着增长,因此部署总是会影响某人(响应时间慢、超时、站点不可用等)
那我该怎么办?有没有比使用 Web 部署更好的选择?
编辑:
今天的部署仅用了 18 分钟就发布了 49 个更改的文件。这种情况很荒谬,是我们网站目前最大的弱点之一。所以我开始了一个体面的赏金计划,希望能解决这个问题。
还有一些问题可能会导致解决方案:
- 为什么只更改了几个文件就需要这么长时间?
- 为什么网络部署 zip 总是包含整个代码库,而不仅仅是更改的文件?
- 为什么我不自己手动复制更改的文件并跳过整个 Web 部署?但是很难手动计算出哪些文件发生了变化。我使用 SVN - 它有没有办法只输出在两个分支之间发生变化的文件?
- 还有哪些我还没有想到的问题?
回复答案:
Re: http://www.troyhunt.com/2010/11/you-deploying-it-wrong-teamcity_24.html 这正是我进行部署的方式,并且将是一种理想的方法。 Web 部署确实可以正确识别哪些文件已更改,但它会超时并且不会发生发布。解决方案中有大约 2500 个文件,可能需要很长时间才能确定哪些文件已更改?或者可能是发布的超时值很短,并且仅上传 15mb 的 zip 文件就使用了所有的时间。
我确实可以完全控制服务器,并且它确实支持 Web 部署。实际上有 2 台服务器:主要的实时服务器,以及我们准备好的冗余服务器,以防第一台服务器发生故障。因此,任何解决方案都必须易于部署到多台服务器(网络部署在它停止工作之前是理想的)。
建议为每个版本创建一个新文件夹,然后仅将 IIS 更改为指向该新文件夹,这听起来会导致发布期间的停机时间/速度变慢。但这是一个非常手动的过程,我更喜欢自动化。
编辑#2
我已经设法缩小范围,并准确地找到了慢的地方——但不知道为什么。这是来自部署日志:
[9/02/2011 12:11:56 a.m.] Performing synchronization pass #1.
[9/02/2011 12:11:56 a.m.] Parameter entry 'IIS Web Application Name/1' is applicable to 'iisApp/C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp' because of its scope.
[9/02/2011 12:11:56 a.m.] Parameter entry 'IIS Web Application Name/2' is applicable to 'setAcl/C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp' because of its scope.
[9/02/2011 12:11:56 a.m.] Parameter entry 'IIS Web Application Name/2' is applicable to 'setAcl/C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp' because of its scope.
[9/02/2011 12:11:56 a.m.] Parameter entry 'Add write permission to App_Data Folder/1' is applicable to 'setAcl/C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp\App_Data' because of its scope.
[9/02/2011 12:11:56 a.m.] Source createApp (C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp) does not match destination (Default Web Site/virtual-dir/) differing in attributes (isDest['False','True']). Update pending.
[9/02/2011 12:11:56 a.m.] Update operation on createApp (C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp) skipped because of rule CreateApplicationRule.
[9/02/2011 12:11:56 a.m.] Source filePath (C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp\App_Data\Create.sql) does not match destination (Default Web Site/virtual-dir/App_Data\Create.sql) differing in attributes (size['259691','259697'],lastWriteTime['02/08/2011 10:45:20','02/06/2011 03:48:16']). Update pending.
[400 lines of file updates skipped, time expired 2 seconds ....]
[9/02/2011 12:11:58 a.m.] Delete operation on filePath (Default Web Site/v2/zzz_app_offline.htm) skipped because of rule DoNotDeleteRule.
[9/02/2011 12:11:58 a.m.] Source setAcl (C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp) does not match destination (Default Web Site/virtual-dir/) differing in attributes (isDest['False','True'],setAclUser,setAclAccess). Update pending.
[9/02/2011 12:11:58 a.m.] Updating setAcl (Default Web Site/virtual-dir/).
[9/02/2011 12:13:47 a.m.] Source setAcl (C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp) does not match destination (Default Web Site/virtual-dir/) differing in attributes (isDest['False','True'],setAclUser,setAclAccess). Update pending.
[9/02/2011 12:13:47 a.m.] Updating setAcl (Default Web Site/virtual-dir/).
[9/02/2011 12:17:11 a.m.] Source setAcl (C:\src\Site.2010\Site.UI\obj\Release\Package\PackageTmp\App_Data) does not match destination (Default Web Site/virtual-dir//App_Data) differing in attributes (isDest['False','True'],setAclUser,setAclAccess). Update pending.
[9/02/2011 12:17:11 a.m.] Updating setAcl (Default Web Site/virtual-dir//App_Data).
[9/02/2011 12:17:11 a.m.] The dependency check 'DependencyCheckInUse' found no issues.
[9/02/2011 12:17:11 a.m.] The synchronization completed in 1 pass(es).
缓慢的原因是"Updating setAcl" 组件。我正在检查开发箱和服务器箱的 ACL,看看有什么不同。然而,将 ACL 从开发盒复制到服务器盒似乎是一个非常糟糕的主意!我已经在服务器上设置好了 ACL。
【问题讨论】:
-
是什么导致部署增长 - 代码或内容,例如图片?
-
代码库非常大,但自网站首次启动以来并没有显着增长,现在可能增长了 10 - 20%。网络部署 zip 文件约为 15mb。
-
Web 部署需要大约 30 秒才能到达登台服务器(位于开发箱旁边),但相同的部署需要很长时间才能到达实时服务器(托管公司数据中心的 vps)。
-
那太糟糕了。我不知道赏金在赏金期到期的同一秒自动授予。一点宽限期会很好。
标签: asp.net-mvc visual-studio performance deployment web-deployment-project