Azure网站静态JS/CSS加载缓慢,但二进制文件没有问题

36

我有一个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会比另一种类型的静态内容传输得慢那么多呢?


1
在我的情况下,它需要三分钟下载一个900KB的js文件。 - Yehia A.Salam
你有没有找到解决办法?除非我在请求中指定范围,否则文本文件的下载速度只有10 KB/s。 - makhdumi
你并不孤单... https://dev59.com/LlwY5IYBdhLWcg3wATtt - ymz
你有没有一些扩展可以处理文本文件,例如可以压缩/精简JS文件的Bundle? - Akash Kava
3个回答

40
我们曾遇到这个问题,得到Azure支持团队的帮助后解决了它。问题是缓慢的文件使用了TransferEncoding: Chuncked。他们建议我们强制进行静态压缩以解决此问题。
我们需要在<system.webServer>中添加以下内容:
<serverRuntime enabled="true"  frequentHitThreshold="1"  frequentHitTimePeriod="00:00:20" />

太棒了!这里也起作用了 :) - Boland
这对我也起作用了。当启用此web.config选项时,您是否注意到任何性能损失(CPU或其他方面)? - esilac
非常感谢!速度快了20倍。 - marinbgd
不错..看起来像一个隐藏的宝石..但是,使用这个配置有什么缺点吗?有人能够解释得更详细一些吗? - Learner
@Learner 请查看我的答案,其中有完整的解释 :) - CC Inc
无论如何,我就是不能在生产站点中修复web.config。如果我应用更改,IIS会因为<serverRuntime>是配置的锁定部分而变得疯狂...谢谢微软... - JB.

5
为了阐述John Tseng的答案:(来自这里
正如您之前看到的那样,IIS 7会缓存静态文件的压缩版本。因此,如果请求到达一个已经在缓存中存在其压缩版本的静态文件,它就不需要再次进行压缩。
但是,如果缓存中没有压缩版本怎么办?那么IIS 7会立即压缩文件并将其放入缓存中吗?答案是肯定的,但只有在经常请求该文件时才能实现。通过不压缩仅偶尔请求的文件,IIS 7可以节省CPU使用率和缓存空间。
默认情况下,如果一个文件在10秒内被请求两次或更多次,则认为该文件是经常被请求的。
因此,您的用户被提供未经压缩的JavaScript文件的原因是因为它没有达到默认的压缩阈值;换句话说,JavaScript文件在10秒内没有被请求2次。
为了控制这一点,我们必须更改 <serverRuntime> 元素上的一个属性,该属性控制压缩: frequentHitThreshold。 为了在请求文件时对其进行压缩,将您的<serverRuntime>元素更改为以下内容:
<serverRuntime enabled="true" frequentHitThreshold="1" />

这将会对CPU性能产生轻微影响,如果你有很多JavaScript文件需要服务并且用户使用频繁。但是,如果你的用户足够频繁以至于压缩这些文件会影响CPU,那么它们已经被压缩和缓存了!

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接