Почему мой Windows 10 загружается так долго?


Давно руки не доходили проанализировать загрузку корпоративных систем, и вот это случилось.

Есть давний инструмент Windows Performance Toolkit, который следует регулярно применять в корпоративной сети — рекомендую.

Собственно проблемы медленной загрузки можно разделить на два вида — общие (для всех корпоративных компьютеров из-за использования общих шаблонов конфигурирования) и частные (которые возникают только на отдельных компьютерах из-за их специфики). Вот примеры.

При анализе трассировки загрузки Windows 10 была обнаружена общая проблема: сервис «Служба Office Нажми и Работай» при запуске пытается сделать сетевой запрос, который тормозит. По всей видимости это запрос в Облако, а так как корпоративная сеть закрыта фаерволом, то неудивительно, что запрос тормозит и замедляет старт службы. Собственно облачные сервисы не используются, поэтому хорошо бы от этого избавиться. После перевода службы в Delayed Start загрузка системы улучшается. (Не понятны последствия для самого Office, но, как говорится, жизнь покажет, точнее, протестируем.)

Второй пример частный. При анализе трассировки загрузки системы было замечено замедление при вызове некой функции, в имени которой присутсвует Home. Имена соседних функций также информативны и говорят о сетевом запросе — очевидно проблема с монтированием сетевой домашней папки в виде диска. В свойствах доменной учётной записи на закладке Profile действительно есть эти настройки. Только указан старый, уже неиспользуемый, сервер! Так как пользователь никогда не пользовался домашней папкой, то никто не знал об ошибке конфигурации. После удаления этой настройки время загрзки улучшилось на 17 секунд, а вместе с первым изменением более чем на 20 секунд.

Общее впечатление после анализа процесса загрузки — Windows 10 поприятнее Windows 7. Я ожидал худшего на старом железе, но ожидания не оправдались.

Хотя загрузка теперь в пределах нормы (100 секунд) для корпоративной системы (с кучей групповых политик и злобным антивирусом на борту, тем не менее вижу ещё потенциал для ускорения загрузки. Возможно удастся найти другие узкие и проблемные места в загрузке из-за «ошибок» в корпоративных шаблонах конфигураций.

Вышел PowerShell 7.0 Preview2


Стоит попробовать его в деле!

В основе уже .Net Core 3.0 Preview6, который очень хорош в быстродействии и особенно в управлении памятью: вы можете обнаружить, что теперь процесс PowerShell не раздувается в памяти во многих сценариях как ранее.

Помимо улучшений производительности полученных из Net Core 3.0 Preview6 в самом PowerShell Core добавлено несколько коммитов, которые также улучшают производительность.

Так Foreach-Object в некоторых случаях будет работать вдвое быстрее! Также можно сказать о WildcardPattern.IsMatch(). Последний используется в нескольких местах в движке, который также стал бастрее, например, при файловых операциях глоббинга. Там также есть ещё несколько улучшений производительности для файловых операций.

Из функциональных добавлений DBNull.Value и NullString.Value теперь работают точно также как $null, что полезно при работе с базами данных.

-split оператор теперь понимает отрицательный параметр, чтобы выполнять разбиение строки от конца к началу. https://github.com/PowerShell/PowerShell/pull/8960

Для разработчиков теперь работает dotnet tool install —global PowerShell — вы получите версию 6.2.2 как глобальный инструмент. https://devblogs.microsoft.com/powershell/introducing-powershell-as-net-global-tool/

Теперь не нужно спецально замерять время выполнения команды в консоли: Get-History покажет вам поле Duration!

Get-History

  Id     Duration CommandLine
  --     -------- -----------
   1        6.153 [io.Directory]::GetFileSystemEntries
   2        0.416 [io.Directory]::GetFileSystemEntries("./")

Командлет Set-Service имеет параметер SecurityDescriptorSddl для установки прав.

Теперь можно использовать зарезервированные имена для имен методов, функций и ресурсов.

Если вы часто использете COM на Windows, то оцените возможность увидеть сигнатуру метода. Ранее это работало только для обычных методов

$shell = New-Object -ComObject "Shell.Application"
$shell.AddToRecent

OverloadDefinitions
-------------------
void AddToRecent (Variant varFile, string bstrCategory)

В основной код вошли TempDrive: и UseAbbreviationExpansion. Первое интуитивно понятно. Второе позволяет вещи вроде:

gcm -UseAbbreviationExpansion i-psdf

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Import-PowerShellDataFile                          6.1.0.0    Microsoft.PowerShell.Utility

Остальное можно найти на сайте GitHub https://github.com/PowerShell/PowerShell/releases/tag/v7.0.0-preview.2