Как ускорить запуск Powershell в среде 4.0?
Я рассматриваю возможность использования сценариев Powershell для триггеров на нашем сервере Perforce. К сожалению, даже на нашем быстром оборудовании для запуска Powershell все еще требуется 2 секунды. Теперь это не похоже на много времени, если вы не считаете, что 200 пользователей постоянно забивают сервер, а триггер (в зависимости от условий) вызывает блокировку таблицы во время ее запуска, останавливая другие связанные запросы.
Я ищу способы сократить время запуска Powershell. Вещи, которые я нашел в Google:
- Уменьшить профиль. Это установка по умолчанию, настройка профиля, отсутствие PSCX и т.д., Поэтому это не помогает.
- Запустите NGEN в бинарных файлах Posh. Это старый совет по проблеме V1. Мы на V2.
- Держите тепло. Первоначальный запуск Posh медленный, но более поздние стартапы бывают быстрыми. Также не полезно для нас. На сервере теплый старт составляет 2 секунды, и он постоянно нагревается частыми запросами.
- Не используйте Powershell для этой цели. Ну, я надеюсь избежать этого "решения"...
Есть ли у кого-нибудь другие предложения по сокращению времени запуска? Я не ожидаю стартапа так быстро, как cmd.exe или .NET командной строки, но если я смогу получить это .5 секунд, я думаю, что все будет в порядке. Невозможно?
ОБНОВЛЕНИЕ. Оказывается, это проблема 4.0. Если я добавлю конфигурационный файл, как описано в другом вопросе SO, запуск займет 2 секунды. Если я оставлю его по умолчанию, то запуск будет за четверть секунды.
Тогда я подумал... возможно, это проблема 4.0 GAC. Поэтому я запустил script в блоге PowerShell, но он говорит, что все сборки уже ngen'd. Я убедился, что он действительно использует 4.0 ngen.
Итак, у меня осталось два варианта:
- Выясните, почему 4.0 намного дороже 3.5.
- Переключитесь на фреймворк 3.5, где он мне не нужен, и мне нужна производительность.
Я бы хотел решить первое, но не знаю с чего начать. Может ли кто-нибудь помочь?
Ответы
Ответ 1
Я боюсь, что вам, вероятно, не повезло, если вы придерживаетесь консольного хоста powershell.exe, если только вам не хочется писать оптимизированный процессор script, разместив в рабочей области приложение runpace/workspacefactory, или служба windows - вы сами катитесь. Вы можете избавиться от второго, но запуск 0.5s для приложения .NET маловероятен, особенно если серверы жесткие для памяти.
Ответ 2
Запустите NGEN в бинарных файлах Posh. Это старый совет по проблеме V1. Мы на V2.
Я играл с этим под V3, и я узнал, что некоторые изображения были
генерируется.
И это, безусловно, похоже, что запуск намного быстрее. Я буду знать лучше после
перезагрузка, так как в первый раз всегда самое худшее. (Мой обновленный) script, чтобы сделать это
с Win 7
$env:path = [Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()
[AppDomain]::CurrentDomain.GetAssemblies() | % {
if (! $_.location) {continue}
$Name = Split-Path $_.location -leaf
Write-Host -ForegroundColor Yellow "NGENing : $Name"
ngen install $_.location | % {"`t$_"}
}
Ответ 3
После отличного ответа на мой вопрос о Technet, я обнаружил гораздо более простой способ запуска NGEN вручную (поскольку, похоже, он не происходят автоматически при чистой установке Windows 8.1):
schtasks /Run /TN "\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319"
schtasks /Run /TN "\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64"