Почему мой 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

Вышел PowerShell 7.0 Preview1


Страница загрузки https://github.com/PowerShell/PowerShell/releases/tag/v7.0.0-preview.1

Там же вы найдете список последних изменений. Некоторые очень полезные. Например, сделана оптимизация работы с объектами в движке, что делает его быстрее, в некоторых сценариях это очень заметно. Ожидаем еще несколько важных улучшений производительности. О других изменениях я уже писал ранее, смотрите предыдущие посты.

Почему 7.0, а не 6.3? Читаем в блоге команды https://devblogs.microsoft.com/powershell/the-next-release-of-powershell-powershell-7/. По сути происходит очередной этап миграции платформы: после .Net Core 3.0 следующая версия будет 5.0, и она окончательно заменит .Net Framework (последняя версия будет 4.8), PowerShell 7.0 это шаг в том же направлении — заменить Windows PowerShell 5. Последующие выпуски PowerShell будут привязаны к выпускам .Net, в том числе LTS (Long Term Servicing).

Главное изменение внутри — теперь движок работает на .Net Core 3.0 Preview. Релиз .Net Core 3.0 намечен на сентябрь, значит релиз PowerShell 7.0 будет не позднее ноября.

Сейчас работа над PowerShell 7.0 будет заключаться в адаптации к .Net Core 3.0. С одной стороны можно убрать некоторый код и использовать стандарное API, которое стало доступным. С другой стороны можно использовать новые возможности, которые появились в 3.0. Например, теперь доступно WinForms, и мы вернем обратно Out-GridView (только на Windows конечно).

Если у вас есть идеи, предложения, то добро пожаловать на https://github.com/PowerShell/PowerShell/. Любой вклад идёт всем на пользу. Не думайте, что это сложно: идея, обсуждение, реализация — всё просто, и вы делаете только ту часть, которая вам важна и интересна, сообщество может подхватить и сделать остальное. Хлтя может не быстро. И это повод начать по-раньше.

Напомню также, что есть https://github.com/MicrosoftDocs/PowerShell-Docs , где вы можете запросить изменения в документацию или сделать их сами. Нашли ошибку — пишите сразу, не откладывайте.

Опыт перехода на Windows 10


Этот 2019 год последний в жизненном цикле Windows 7. Это ставит задачу перехода на более новую версию Windows 10 (1809/Ent 2019).

Самый главный опыт — систему надо ставить с нуля. Почему?

  1. Официально обновление поверх (in-place upgrade) не поддерживается.
  2. Существует недокументированный способ, как это обойти.
  3. Этим способом лучше не мигрировать, так как будут проблемы на каждом шагу:
    • Часто нужны новые версии драйверов для сетевых и видео карт.
    • Нужно предварительно снести антивирус. Манипуляции с KES 10 и 11 не дали надежного результата. Учтите, что KES 11 Device Control может работать на Windows 10 немного не так как раньше: у нас отвалились некоторые USB принтеры — заработали после правки настроек Device Control.
    • Нужно обязательно удалить App-V и TMG клиент до обновления.
    • Не все приложения будут нормально работать — их надо выявить и также удалить до обновления системы. Скорее всего само приложение надо обновить до версии, которое работает на Windows 10. Например, Crypto Pro 3 -> 4.
    • В Windows 7 версия профиля 3. На Windows 10 1809 — уже 6. Не факт, что профили пользователей смигрируется правильно и без потерь.
    • Windows 7 очень надежная система и скорее всего работает на конкретных компьютерах много лет. Это означает, что на диске скопилось много мусора. Установка поверх не удалит его полностью. Например, давно ненужные установленные программы и их рабочие файлы. Древние архивы и прочие «запасы» в профилях пользователей.

Установка новой системы также хороший повод протестировать и обновить версии других приложений. Например, перейти на Office 2016 или 2019 — про это будет отдельный пост.

Если у вас типовая конфигурация, то вы можете отладить обновление поверх. Но если у вас зоопарк оборудования и приложений, то вы съэкономите массу времени, если будете ставить новые системы с нуля.

.Net Core 3.0 и PowerShell Core


Если кратко, то в .Net Core 3.0 мы получим PowerShell Core как global tool.

Достаточно будет сделать:
dotnet tool install

Это будет работать в Docker контейнерах тоже.

Кстати (это уже совсем другая история) возможно уже в следующей предварительной версии 7.0.0 Preview1 PowerShell Core будет работать на .Net Core 3.0. Всё должно будет работать шустрее, да и набор API для разработчиков ощутимо расширяется.

Следующая версия PowerShell Core — PowerShell 7.0


Команда Microsoft официально объявила, что следующая версия PowerShell Core выйдет как PowerShell 7.0.

Основной посыл в том, что с переходом на .Net Core 3.0 пользователи получат версию почти на 90% совместимую с Windows PowerShell.

Имя PowerShell 7.0 без Core также призвано демонстрировать этот факт.

Ещё один важный момент: теперь выпуски основных версий будут следовать выпускам .Net Core. Это означает, что появятся LTS версии с увеличенным временем поддержки. Это будет стимулировать использование PowerShell Core в других продуктах. По-прежнему каждый месяц будут выходить предварительные версии для тестирования исправлений и новых функций.

Кроме этого PowerShell 7.0 в скором времени будет добавлено в Windows 10 как дополнительный компонент.

Настройка Start Layout в Windows 10


Теперь мы можем централизованно настраивать Start Layout для корпоративных пользователей.

Описано в блоге https://blogs.technet.microsoft.com/deploymentguys/2016/03/07/windows-10-start-layout-customization/

Документация https://docs.microsoft.com/en-us/windows/configuration/customize-and-export-start-layout

По поводу DesktopApplicationLinkPath — это работает, но сам файл lnk должен быть в папке меню, например, %ALLUSERPROFILE%\Microsoft\Windows\Start Menu\Programs