Azure 网站提供静态 JS/CSS 但不是二进制的速度很慢
Posted
技术标签:
【中文标题】Azure 网站提供静态 JS/CSS 但不是二进制的速度很慢【英文标题】:Azure Website slow to serve static JS/CSS but not binary 【发布时间】:2015-03-31 16:08:40 【问题描述】:我有一个 Azure 网站/Web 应用程序,它提供静态 JS 和 CSS 文件的速度非常慢,但提供二进制文件似乎非常好。
为了测试问题,我上传了两个 30MB 的文件,一个是 big.js,另一个是 big.rar。如果幸运的话,JS 文件的下载速度约为 100KB/s。 RAR 文件的下载速度约为 4,000KB/s。结果非常一致。
我已经检查了 Fiddler,并且在这两种情况下都发生了 gzip 压缩。正如预期的那样,JS 文件使用 MIME 类型 application/x-javascript 发送,而 RAR 文件作为 application/octet-stream 发送。
我很难理解这一点 - 为什么 IIS 提供一种类型的静态内容比另一种慢得多?
【问题讨论】:
在我的例子中,它在三分钟内下载了一个 900KB 的 js 文件 您找到解决方案了吗?除非我在请求中指定范围 你并不孤单......***.com/questions/33134991/… 您是否有一些扩展程序可以处理文本文件,例如 Bundle 可以压缩/缩小 js 文件等? 【参考方案1】:我们遇到了这个问题,并在 Azure 支持团队的帮助下解决了这个问题。问题是慢速文件会使用 TransferEncoding: Chuncked。他们建议我们强制静态压缩来解决这个问题。
我们必须将以下内容添加到<system.webServer>
:
<serverRuntime enabled="true" frequentHitThreshold="1" frequentHitTimePeriod="00:00:20" />
【讨论】:
太棒了!在这里也工作过:) 这对我也有用。启用此 web.config 选项时,您是否注意到任何性能损失(CPU 或其他)? 非常感谢!更快 20 倍 不错的一个.. 看起来像一个隐藏的宝石.. 但是,打开这个配置有什么缺点吗?谁能解释一下? @Learner 查看我的答案以获得完整的解释:)【参考方案2】:详述John Tseng的回答:(来自here)
如您之前所见,IIS 7 缓存了静态的压缩版本 文件。所以,如果一个请求到达一个静态文件的压缩 版本已经在缓存中,不需要压缩 再次。
但是如果缓存中没有压缩版本怎么办?将 IIS 7 然后立即压缩文件并将其放入缓存中?答案 是的,但前提是文件被频繁请求。通过不 压缩仅不经常请求的文件,IIS 7 保存 CPU 使用率和缓存空间。
默认情况下,如果文件被频繁请求,则认为该文件被频繁请求 每 10 秒请求两次或更多次。
因此,为您的用户提供未压缩版本的 javascript 文件的原因是它不符合压缩的默认阈值;也就是说,javascript 文件在 10 秒内没有被请求 2 次。
要控制这一点,我们必须更改 <serverRuntime>
元素上的一个属性,该属性控制压缩:frequentHitThreshold
。为了让您的文件在被请求一次时被压缩,请将您的 <serverRuntime>
元素更改为如下所示:
<serverRuntime enabled="true" frequentHitThreshold="1" />
如果您有许多正在提供的 javascript 文件并且您经常拥有用户,这将略微影响您的 CPU 性能,但如果您的用户经常足以影响 CPU 压缩这些文件,那么它们可能已经被压缩和缓存!
【讨论】:
【参考方案3】:看起来这是 IIS 8.5 上的问题,而不仅仅是 Azure 特定的问题。
现在应用服务upgrade to Windows Server 2016 looks complete 应该不需要这种解决方法。
【讨论】:
以上是关于Azure 网站提供静态 JS/CSS 但不是二进制的速度很慢的主要内容,如果未能解决你的问题,请参考以下文章
限制来自 Blob 存储中静态网站的 Azure 函数调用?