Многие, наверное, замечали, что время от времени компьютер начинает сильно снижать производительность и виной этому процесс (или даже несколько процессов) mscorsvw.exe, который используется службой NET Runtime Optimization Service. Но не все знают, для чего предназначена эта служба и каким образом можно ускорить ее работу. Чтобы устранить этот пробел мы, на основе материалов инженерной команды NET, подготовили данную статью.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Для чего нужен и как работает .NET Framework?
.NET Framework - программная платформа от компании Microsoft, которая позволяет разработчикам создавать приложения, не привязываясь к аппаратным особенностям платформы и версиям ОС. Написанное с помощью .NET Framework приложение будет одинаково работать в любой системе, где установлена данная платформа. Такой подход также позволяет облегчить разработку и устранить возможные конфликты версий библиотек, так как наличие необходимой версии платформы автоматически подразумевает наличие необходимых компонентов и их не требуется включать в поставку программы. В настоящий момент .NET Framework выпускается как свободное ПО под лицензией MIT.
Для написания программного кода может быть использовать один из поддерживаемых платформой языков программирования, который затем компилируется в промежуточный байт-код CIL (Common Intermediate Language) и исполняется виртуальной машиной платформы CLR (Common Language Runtime). Использование виртуальной машины позволяет исполнять один и тот же код на системах с различными версиями аппаратной и программной платформы.
Проще говоря, он будет одинаково эффективно работать и на одноядерном стареньком Pentium 4 c 32-битной системой, и на многоядерном Core i7 в современной 64-битной среде. При этом разработчику не надо вникать в тонкости работы платформы, это задача разработчиков .NET Framework.
Как можно ускорить запуск и работу .NET Framework приложений?
Несмотря на то, что современные процессоры уже давно позволяют эффективно использовать JIT-компиляцию (just in time, компиляция "на лету"), несложно заметить, что компилятор CLR будет выполнять много повторяющихся действий, каждый раз компилируя в машинный код используемой платформы CIL-код общих библиотек и компонентов. Этого можно избежать, если выполнить компиляцию один раз и разместить готовый машинный код в кэше.
Для выполнения этой задачи предназначен механизм NGEN (The Native Image Generator) - генератор образов в машинном коде. Чтобы NGEN мог выполнять свою задачу в фоновом режиме предназначена служба .NET Runtime Optimization Service (mscorsvw.exe), которая запускается каждый раз после того, как набор библиотек .NET Framework был изменен.
Когда это происходит? Прежде всего после установки данной платформы, но это довольно редкий сценарий, тем более что .NET Framework уже входит в состав современных версий Windows. Однако обновления для .NET Framework выпускаются достаточно регулярно, что заставляет mscorsvw.exe выполнять перекомпиляцию библиотек платформы.
Как поясняют сотрудники инженерной команды NET, система обновлений Windows Update, через которую получает обновления и .NET Framework, настроена по-умолчанию таким образом, чтобы производить обновление системы в ночное время, когда компьютер не используется пользователем. Но иногда это сделать невозможно, например, если компьютер выключен, поэтому процесс обновления может начаться и посреди дня, в этот момент вы можете заметить снижение производительности системы, так как основные ресурсы будут заняты mscorsvw.exe.
В Windows 8 на смену NGEN пришел более совершенный механизм AutoNGEN. Теперь компилируются только те библиотеки, которые фактически используются на ПК, и данная работа производится только в период простоя, при необходимости служба способна остановить свою работу в течении 2 секунд. Начиная с Windows 8.1 ряд важных библиотек .NET Framework уже имеют готовые образы в машинном коде для большинства актуальных платформ и могут быть получены через Windows Update, что позволяет отказаться от их компиляции на клиентских ПК.
Как заставить mscorsvw.exe работать быстрее?
Начавшийся в разгар рабочего дня ресурсоемкий процесс оптимизации .NET Framework конечно же неприятен и, чаще всего, пользователи, не разбираясь в причинах происходящего, завершают работу mscorsvw.exe или идут еще дальше и отключают службу. Однако делать этого не стоит, так как .NET Runtime Optimization Service выполняет важную задачу и поможет вашим приложениям работать эффективнее. В тоже время есть способ выполнить эту работу быстрее, по умолчанию служба использует только одно процессорное ядро, если разрешить ей использовать большее количество ядер (в настоящее время не более 6), то оптимизация будет выполнена за меньшее количество времени, и вы снова сможете вернуться к своей работе.
Для запуска NGEN без ограничения на количество используемых ядер инженерная команда NET подготовила специальный скрипт:
Вам нужно будет запустить его из командной строки с правами администратора. Данный скрипт успешно работает в системах до Windows 7 / Server 2008R2 включительно. При его запуске в среде Windows 8.1 мы сталкивались с ошибками, поэтому для Windows 8 / Server 2012 следует использовать сценарий PowerShell (также никто не мешает его использовать и в среде Windows 7):
Так как PowerShell, к сожалению, еще недостаточно знаком многим системным администраторам, остановимся на запуске сценария более подробно. Если вы просто попытаетесь его выполнить, то скорее всего получите следующую ошибку:
По умолчанию выполнение сценариев PowerShell запрещено даже Администратору, что в общем-то правильно с точки зрения безопасности. Чтобы узнать текущие разрешения запустим среду исполнения PowerShell с правами администратора и выполним команду:
Get-ExecutionPolicy -list
В ответ вы получите политики для различных уровней: текущего сеанса, текущего пользователя или компьютера.
По-умолчанию политики не заданы: Undefined, что соответствует уровню Restricted, который разрешает запуск любых команд, но запрещает запуск скриптов. Для выполнения сценария нам нужно установить один из режимов разрешающий выполнение скриптов: Unrestricted или Bypass. В целях безопасности такой режим следует устанавливать только для текущего сеанса, т.е. на уровне Process. Для этого выполним команду:
Set-ExecutionPolicy Bypass -Scope Process
После чего можем успешно выполнить наш сценарий без каких-либо ошибок:
Что именно делает данный сценарий и можно ли обойтись без него?
Данные скрипты были подготовлены для тех, кто не хочет иметь дело с командной строкой, если же вы предпочитаете делать все самостоятельно, то можете выполнить несколько команд вручную:
.NET Framework 4 в Windows 7 и более ранних версиях:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe executeQueuedItems
В 64-битных системах также выполните:
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe executeQueuedItems
.NET Framework 4 в Windows 8 / 8.1:
c:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe executeQueuedItems
schTasks /run /Tn "\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319"
В 64-битных системах также выполните:
c:\Windows\Microsoft.NET\Framework64\v4.0.30319\ngen.exe executeQueuedItems
schTasks /run /Tn "\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64"
Если вы используете .NET 2.0 или 3.5, то команды будут следующими:
c:\Windows\Microsoft.NET\Framework\v2.0.50727\ngen.exe executeQueuedItems
В 64-битных системах также выполните:
c:\Windows\Microsoft.NET\Framework64\v2.0.50727\ngen.exe executeQueuedItems
Эти команды должны быть выполнены в командной строке работающей с правами администратора, в противном случае вы получите ошибку выполнения.
Подготовлено по материалам:
- Wondering why mscorsvw.exe has high CPU usage? You can speed it up.
- Got a need for speed? .NET apps start faster.
Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Последние комментарии