14

我正在 ASP.NET CORE 1.0 上构建一个 REST API。在生产中,恕我直言,不使用 JIT 非常有用,因为带有应用程序的 docker 容器正在向上和向下扩展,在 CI 期间一遍又一遍地重新部署,因此每个已部署容器的即时编译会导致可怕的滞后,LB健康检查死亡和其他痛苦。

正如我所读到的,使用 dotnet CLI 的本机编译已停止。我尝试使用CoreRT构建,但没有运气(由于复杂性,需要详细说明)。

由于这个问题非常抽象,我没有提供示例代码或详细信息,所以一开始只有几个问题:

  1. 我的假设是否正确 - 提前编译是否会解决每个路径首次执行缓慢的问题 - 或者 - 是否还有其他解决方案?
  2. 如果是真的,目前是否可以从 .NET Core 构建“本机”应用程序(ubuntu x64 目标)?
  3. 如果是,最好的做法是什么——我该怎么做?有没有人有这方面的经验?

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

先感谢您。

4

2 回答 2

8

目前无法提前进行完整的原生编译。这是上面链接的 CoreRT 项目的目标之一,但还没有处于我称之为生产就绪的任何状态。去年在 Connect 上的演示应该有很大的把握。例如,他们仍然没有反射子系统。但是,我们有几个解决方案可以大大减少 JIT 时需要生成的代码量。对于 .NET Core,该工具称为CrossGen,如今它已经非常成熟了。

在引起您注意的同时,我还要提到我们正在努力改进 NGEN/CrossGen 格式,以减轻典型 ni 文件所涉及的大部分典型痛苦。那是在当时的名字下ReadyToRun

希望有帮助。如果您还有其他问题,请告诉我。

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

于 2016-10-18T21:29:46.947 回答
3

在https://github.com/dotnet/coreclr/blob/master/Documentation/building/crossgen.md有使用 CrossGen 的指南。它有点过时了 - 我会看看我是否可以在某个时候更新它。使用 CrossGen 最重要的部分是在命令行上指定 -Platform_Assemblies_Paths 开关,告诉 CrossGen 它需要的所有依赖项的位置(例如,System.Private.CoreLib.dll)。

希望有帮助。如果您遇到任何进一步的问题,请告诉我。

于 2016-10-19T20:57:13.687 回答