我一直在调查我们生产应用程序启动缓慢的问题,结果出乎意料。
在不同的 Azure 虚拟机上测试显示,启动时间与应用程序服务器性能密切相关(因此不包括外部请求,包括 SQL),但真正有趣的是与 Azure Web 应用程序和我的本地计算机进行比较(所有时间均为约三次运行的平均值):
VM A0: >1m
VM A2: 13s
VM D2V2: 6.8s
VM D5V2: 7.8s
Wep App P2: 25s
Web App S2: 26.5s
My local machine: 6.6s
我的本地机器是一台3.3GHz的i5。
即使它通过互联网连接到相同的SQL Azure数据库并包括Entity Framework模型检查,本地机器也是最快的。
所有测试都使用.NET 4.6.1,这是当时发布的最新版本。
显然的结论:
- 对于不可并行化的作业,我的四年旧的台式机比任何大小的Azure VM都要快。
- 即使你愿意花500美元每月的费用,Azure Web应用程序也运行缓慢。
这似乎有些可疑。还有其他可能发生的事情吗?或者有什么测试可以进行吗?
在进行了一些分析后进行编辑:以下内容对我的问题没有任何启示,但这仍然是有趣的信息(在连接了分析器的另一个A2 VM上测试总共需要20秒):
- 58%是JIT编译。
- 文件IO阻塞几乎为零(应用程序已经启动过,所以我猜所有必需的dll部件都在内存缓存中)。
- <1%是针对SQL Azure的请求。
- 因此,其余90%的运行时间应该是.NET执行或分析器开销。
- 分析器本身的开销很大,因为没有它的请求只需要15秒就可以运行(我使用了JetBrains dotTrace的试用版,我真的很喜欢)
- 50%的时间用于第一个Entity Framework请求,其中80%是JIT编译。
- 15%是使用SignalR的第一次使用,几乎没有JIT编译(做一些反射混乱)
几乎没有进行并行化处理。