什么是打包一组巨大文件的好方法,以便它们可以快速部署在Azure上



我的Azure角色依赖于一个巨大的本地库,该库以一组目录的形式提供,总共约700兆字节。图书馆大约每年更新一次。当前的解决方案是将整个树打包到一个.zip文件中,然后将其拆分为块并上传到Blob存储中。当一个角色实例启动时,它会逐个下载块,并将它们按顺序保存到一个文件中,从而恢复原始.zip。然后使用Info-zip unzip程序解压缩.zip。

现在下载大约需要25秒,但开箱可能需要2-4分钟,这还不够快。我查看了每个进程的性能计数器,看起来unzip.exe消耗的CPU时间不超过25%,因此问题可能是I/O繁重——必须从磁盘读取.zip,然后将提取的数据写入磁盘。我正在寻找一些其他方法来打包(和拆包)库,以便更快地进行部署。

当我的代码在Azure上运行时,我如何打包库,使其尽可能快地解包?

长期运行的安装(即使在您的情况下大约需要5分钟)是您使用VM角色的完美原因。您可以构建自定义映像(包含这些库),上传它,并将该映像用作实例的映像。现在,如果您查看文档,则不应在生产部署中使用VM角色-http://msdn.microsoft.com/en-us/library/windowsazure/gg433107

另一种选择可能是云硬盘。这是一个页面blob,您在实例中作为NTFS驱动器装载。这里的问题是,只有一个实例可以装载云驱动器(没有对多个实例的真正支持)。

我的建议是:

  1. 在本地计算机上创建包含所需库的VHD
  2. 将其作为页面blob上载到您的存储帐户
  3. 确保缓存足够大,可以容纳所有文件,以避免网络延迟(更多信息:CloudDrive.InitializeCache方法)
  4. 对于每个实例,创建一个快照并将该快照装载为云驱动器。这是一种能够在多个实例上使用"同一"云驱动器的解决方法。(更多信息:CloudDrive.Snapshot方法)

另一种解决方案可以是将VHD下载到LocalResource,并使用diskpart(在启动任务中)将其装载。

注意:我认为VHD文件是打包文件的另一种方式。

25%的CPU通常意味着你的盒子有4个核心,其中一个是100%使用的。压缩数据通常是单线程的。

所以你被CPU限制了。

你可以单独压缩每个区块,这样你就可以单独解压缩它们。这样拆分工作可以实现并行化。你可能会从中获得3x-4倍的加速。

如果你需要走得更快,你需要寻找一个更快的压缩实用程序,如QuickLZ。

最新更新