最近在一台嵌入式设备上安装 .NET Framewok 后发现整个系统非常卡,进入桌面后右下角的网络连接图标几分钟才能显示出来,但是十几二十分钟后就恢复正常了。
排查后发现是安装 .NET Framework 后会启动一个名为.NET Runtime Optimization Service
的服务程序,它一直占用着 CPU,导致系统失去响应。
这个服务是干嘛的呢?这得先说下 .NET 程序是如何运行的。
.NET 程序是如何运行的
当 .NET 编译器编译 C# 或 VB.NET 代码时,并不像 C++ 语言那样会生成本地代码(Native Code),而是生成了一种名为 CIL 的代码,它并不被计算机识别,而是要待到启动时通过 JIT(Just-In-Time)将其翻译为本地代码。而本地代码特定于 JIT 编译器运行的计算机环境。
所以 .NET 程序启动肯定是慢于 C/C++ 这样的本地语言所开发出的程序的,因为每次启动时多了一个翻译的过程,而这个翻译的过程在一些低性能的 CPU 上特别耗时,这就导致了 .NET 程序冷启动很慢。
NGen 是什么
NGen(Native Image Generator)是 .NET Framework 中的一个工具(ngen.exe),用于将托管程序集编译成本地代码,以便在运行时直接执行本机代码,而不需要 JIT 编译。
NGen 的主要作用是减少应用程序的启动时间和提高性能。
计算机停止响应的原因
前面说到的.NET Runtime Optimization Service
服务程序,它主要负责在安装 .NET Framework 后对 .NET 程序集进行预编译,以提高应用程序的性能和启动速度。
预编译这个步骤的 CPU 占用在消费型 CPU 上都是无感的,毕竟性能足够,核心多。但是在一些用于嵌入式设备,性能极低的 CPU 上会非常明显,CPU 占用率 100%,导致整个系统失去响应。
解决办法
解决办法就是敦促 ngen 赶紧完成预编译工作:
1 | NET2:%WINDIR%\Microsoft.NET\Framework\v2.0.50727\ngen.exe executeQueuedItems |
ngen executeQueuedItems
命令的作用是强制.NET Runtime Optimization Service
立即执行队列中的所有待处理项。
相关阅读
当 mscorsvw.exe 进程开始执行时,计算机停止响应
How and when does ngen.exe work?
Common Intermediate Language
Ngen.exe