使用CoreRT /另一个AOT编译.NET Core应用程序

14

我正在使用ASP.NET CORE 1.0构建REST API。在生产环境中,我认为不使用JIT会非常有用,因为具有应用程序的docker容器正在不断缩放和重新部署,因此每个部署的容器都进行即时编译会导致可怕的延迟、LB健康检查死亡和其他问题。

据我所知,使用dotnet CLI的本地编译已经停止了。我尝试使用CoreRT进行构建,但没有成功(由于复杂性,可要求详细信息)。

由于这个问题相当抽象,我没有提供样本代码或详细信息,因此首先有几个问题:

  1. 我的假设是否正确-预先编译是否解决了每个路径的缓慢首次执行的问题-或者根本没有其他解决方案?
  2. 如果是真的,目前是否可以从.NET Core构建“原生”应用程序(ubuntu x64目标)?
  3. 如果是,最佳实践是什么-我该如何做?有人有这方面的经验吗?

(目标平台将是ubuntu-14.04-x64 docker镜像以及编译平台。对于开发目的,在OSX上编译它也很好。)

预先编译是否可以解决每个路径的缓慢首次执行的问题,目前可否从.NET Core构建“原生”应用程序(ubuntu x64目标),以及最佳实践是什么,这是一个相当抽象的问题。感谢您提前的回答。


如果在这个阶段可以做到这一点,我想知道为什么微软还没有宣布。因此,我的理解是时机还不成熟,你不应该为这样一个大问题烦恼。 - Lex Li
你确定吗?CoreRT项目听起来非常有前途 [https://github.com/dotnet/corert/blob/master/Documentation/how-to-build-and-run-ilcompiler-in-console-shell-prompt.md] - rudolfdobias
每个人都知道它很有前途,甚至微软去年在Connect上演示了它。但在它达到生产质量之前,请不要碰它。 - Lex Li
我已经在下面发布了一个我认为有帮助的答案,但是...你能分享一下你的启动时间吗?你提到了健康检查失败..那么你需要达到什么样的容差? - MattWhilden
2个回答

8
在目前还不可能进行完全的本地提前编译。这是CoreRT项目的目标之一,但它并没有达到我所说的生产就绪状态。去年Connect展示的演示应该要有所保留。例如,他们仍然没有反射子系统。然而,我们有一些解决方案,可以大大减少需要在JIT时间生成的代码量。对于.NET Core,工具称为CrossGen,并且现在已经非常成熟了。
当我引起你的注意时,我也会提到我们正在开发NGEN / CrossGen格式的演变版本,该版本减轻了典型ni文件涉及的大部分痛苦。这被称为ReadyToRun。
希望这有所帮助。如果您有其他问题,请告诉我。

声明:我在UWP的.NET Native运行时和编译器团队工作(这是CoreRT和LLILC等项目的姊妹项目)。


感谢您的关注,我一定会看看这些内容。-- 回到上面的问题 - 几乎每个路径的启动时间都是10-20秒。而且这只是一个小项目。 - rudolfdobias
所以我尝试使用CrossGen。在nuget包缓存的第十个文件夹级别中找到了它。但现在我意识到我不知道如何使用它,因为几乎没有文档可供参考。当我在项目上运行它时,它告诉我缺少'System.Private.CoreLib.dll'。你能给我一些基本的指导吗?我可以开一个新问题。 - rudolfdobias
1
为了避免误导您,我已联系拥有crossgen的开发人员。希望他们中的一位可以帮助我们解决问题。 - MattWhilden

3
这里有一份使用CrossGen的指南,链接为https://github.com/dotnet/coreclr/blob/master/Documentation/building/crossgen.md。这份指南可能有点过时,我会尽快更新它。使用CrossGen最重要的部分是在命令行上指定-Platform_Assemblies_Paths开关,告诉CrossGen它所需依赖项的位置(例如System.Private.CoreLib.dll)。希望这能帮到您。如果您遇到任何其他问题,请告诉我。

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