Новая версия моего диагностического пакета почти готова к свободному плаванию. Сегодня я расскажу об изменениях и покажу скрипты PowerShell, лежащие в основе утилиты.
Утилита CheckBootSpeed изначально была рассчитана на исправление проблем, замедляющих загрузку Windows с жесткого диска. Когда утилита создавалась, владельцев SSD было очень мало, к тому же они и без нее довольны скоростью запуска системы. Однако я вижу ценность пакета не только в исправлении проблем, но и сборе данных для дальнейшей диагностики или статистики.
Поэтому я решил не бросать утилиту, а обновить ее в духе времени. Предлагаю вашему вниманию обзор изменений и практические примеры сбора сведений о системе с помощью PowerShell.
[+] Сегодня в программе
Более подробные описания диагностируемых проблем
Букв стало больше, но для меня это еще один способ донести до владельцев SSD назначение функций Windows.
Определение типа диска (SSD или HDD)
В отличие от Windows 7, Windows 8 определяет тип диска еще до проведения оценки производительности, которая теперь выведена за рамки программы установки. Это можно проверить, открыв оптимизатор дисков сразу после первого входа в систему.
Windows определяет тип накопителя на основе спецификаций ACS-2. Система опрашивает диск и интерпретирует полученный результат в соответствии с таблицей, опубликованной на MSDN. Накопитель считается твердотельным, если диск определяется как «не вращающийся» (non-rotational). Однако скриптом извлечь эту информацию невозможно.
Из блога разработчиков Windows 7 я почерпнул, что они отключают дефраг для дисков, на которых скорость случайного чтения выше 8MB/s.
Из 182 протестированных жестких дисков лишь шесть кое-как перевалили через 2MB/s. Я решил использовать этот же прием.
В принципе, оценку производительности диска можно извлечь командлетом Get-WmiObject из объекта Win32_WinSat:
(Get-WmiObject WIN32_WINSAT).DiskScore
Поскольку она учитывает также и другие скорости, было трудно сопоставить ее с порогом в 8MB/s. Поэтому я решил измерить скорость случайного чтения самостоятельно с помощью утилиты winsat. Любые выражения, в том числе командной строки, можно выполнять с помощью командлета Invoke-Expression.
Invoke-Expression 'winsat disk -ran -read -drive $env:systemdrive -xml "$env:temp\ReadSpeed.xml"'
Старожилы блога помнят дело об оценке производительности, раскрытое Холмсом, откуда и взята команда. Суть в том, что утилита winsat не запускается, если не может переключиться на самый производительный план электропитания. Кстати, попутно обнаружилось, что winsat отказывается работать на виртуальной машине Hyper-V.
По иронии судьбы, диагностический пакет это дело не решает автоматически, но по крайней мере учитывает проблему и отражает ее в отчете. В PowerShell есть удобная переменная $LastExitCode, принимающая значение 0 в случае успешного завершения команды. В противном случае скорости диска присваивается значение 8, что ведет к более консервативной оценке требуемых исправлений (как для SSD).
if ($LastExitCode -ne "0") {$ReadSpeed = "8"}
Если же измерение завершилось успешно, из временной папки считывается XML-файл с полученным отчетом WinSat. Здесь содержимое файла считывается с помощью командлета Get-Content.
else { [[xml]]$ReadSpeedXML = Get-Content $WinSatPath $ReadSpeed = [int]$ReadSpeedXML.WinSAT.Metrics.DiskMetrics.AvgThroughput."#text" } $ReadSpeed MB/s
Экспорт результатов в XML позволяет задействовать их в прочих скриптах пакета. А в PowerShell работать с XML – одно удовольствие. Пункты команды просто соответствуют узлам XML-файла, которые надо последовательно раскрыть, чтобы добраться до значения элемента.
Остается лишь сравнить его с порогом. Если скорость не меньше 8, диск считается твердотельным.
if ($ReadSpeed -ge "8") {$SystemDiskType = "SSD"} else {$SystemDiskType = "HDD"} $SystemDiskType
Я не интересовался, может ли скорость превышать этот порог на RAID из жестких дисков, но это не имеет значения для пакета, как вы увидите ниже.
Диагностика SuperFetch, ReadyBoot и Prefetch с учетом типа диска
Определившись с типом диска, пакет дифференцированно подходит к диагностике параметров кэширования запуска Windows и программ. Давайте немного остановимся на этих параметрах, потому что здесь все очень запутано.
SuperFetch
Вкратце, смысл технологии SuperFetch в том, чтобы анализировать ваши сценарии работы и вовремя подгружать в память наиболее востребованные вами программы. Кроме того, SuperFetch оптимизирует сон, гибернацию и быстрое переключение между пользователями.
Представьте, что после нескольких часов напряженной работы в системе вы пошли пообедать. ПК вошел в режим бездействия, что повлекло за собой выполнение задач обслуживания (например, антивирусную проверку). Диспетчер памяти освободил для них место, выкинув ваши приложения (то же самое происходит при работе с любыми приложениями, потребляющими много памяти).
Однако SuperFetch сохранила их в кэш на диске. Когда задачи обслуживания отработали, диспетчер памяти вернул в память ваши программы из кэша SuperFetch. Подкрепившись, вы приступили к работе с приложениями без задержки.
Проверить тип запуска службы можно одной командой PowerShell. В данном случае уже знакомый вам командлет Get-WmiObject извлекает информацию из класса Win32_Service.
(Get-WmiObject -Query "Select StartMode From Win32_Service Where Name='sysmain'").StartMode
Когда технология SuperFetch отключена, данные и код потребуется подгружать с диска без всякого кэша, что выражается в более медленном отклике приложений. Однако на быстрых дисках (например, SSD) технология не дает преимуществ, поэтому Windows отключает ее, но не службу, как вы увидите ниже.
ReadyBoot
Функция ReadyBoot формально возложена на службу ReadyBoost, имеющую свой драйвер rdyboost.sys, который ядро загружает на раннем этапе запуска Windows. Однако по сути ReadyBoost является частью службы SuperFetch (sysmain), как видно на рисунке ниже.
Служба ReadyBoost отслеживает, какие файлы и в каком порядке запускаются при загрузке Windows, сохраняя пять последних отчетов в папке %WinDir%\Prefetch\ReadyBoot. На основе этой информации формируется план следующей загрузки, хранящийся в реестре.
Так или иначе, ReadyBoot призвана ускорять запуск Windows и автозагрузку программ в первую очередь с жесткого диска.
Если по оценке производительности система установлена на достаточно быстрый диск (например, хороший SSD), из реестра удаляется параметр EnableSuperFetch, отвечающий за ее работу.
На моем планшете сразу после установки параметр присутствовал, но после измерения оценки производительности он исчез. Я точно не знаю, на какой параметр опирается Windows, принимая решение, но он должен быть как-то связан с последовательным или случайным чтением. Ведь только эти скорости измеряются во время формальной оценки WinSat.
Prefetch
Но даже когда система установлена на быстром SSD, служба SuperFetch не отключается, вопреки распространенному мнению. Она остается работать для логического префетчинга, появившегося еще в Windows XP. По той же причине в реестре остается параметр EnablePrefetcher.
Вряд ли префетчинг способен улучшить скорость запуска Windows с SSD, но, видимо, в Microsoft сочли, что наряду с твердотельными накопителями в системе могут быть и жесткие диски. Если с них запускаются программы, кэширование может улучшить отлкик.
Алгоритм работы CheckBootSpeed
На жестких дисках утилита проверяет тип запуска службы SuperFetch (см. выше), а также значение параметров реестра EnablePrefetcher и EnableSuperFetch. Сначала раздел реестра закладываются в переменную, а затем отдельные параметры и значения извлекаются с помощью командлета Get-ItemProperty.
$PrefetchPath = "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters" $PrefetchParams = Get-ItemProperty -path $PrefetchPath write-host EnablePrefetcher: $($PrefetchParams).EnablePrefetcher write-host EnableSuperfetch: $($PrefetchParams).EnableSuperFetch
Затем используется условие Switch с регулярным выражением, определяющим, равен ли каждый параметр 2 или 3, либо чему-то другому. Иначе говоря, утилита проверяет, оптимизируется ли запуск системы и/или приложений. .
$EnablePrefetcher = switch -regex ($PrefetchParams.EnablePrefetcher) { "[2-3]" {"on"} default {"off"} } $EnableSuperfetch = switch -regex ($PrefetchParams.EnableSuperfetch) { "[2-3]" {"on"} default {"off"} } write-host Prefetcher is [$EnablePrefetcher] write-host SuperFetch is [$EnableSuperfetch]
Если на жестком диске служба не стартует автоматически или в реестре указаны неверные значения, утилита восстанавливает стандартные параметры.
С твердотельными дисками я не стал городить огород. Когда пакет определяет, что система установлена на SSD, он даже не проверяет параметры SuperFetch, ReadyBoot и Prefetch. В конце концов, если владельцы SSD сами отключают их, «они лучше знают».
Пакет также не проверяет на SSD параметры реестра в разделе BootOptimizeFunction, поскольку дефрагментация загрузочных файлов не выполняется, когда ОС установлена на твердотельный накопитель.
Сбор дополнительной диагностической информации
Утилита построена на платформе диагностики Windows, а с помощью PowerShell можно извлечь самые разнообразные сведения. Это одна из основных причин, по которой я не бросаю развитие пакета.
В частности, в бета-версии осуществляется сбор информации о:
- моделях дисков и раскладе по разделам
- оценке диска на основе формальной оценки WinSat, хранящейся в системе
- последних действиях функций Prefetch и ReadyBoot
- параметрах задания дефрагментации
- событиях дефрагментации и оптимизации дисков в журнале
В следующей записи я подробнее расскажу о том, как PowerShell помогает собирать эти сведения
Сводная таблица диагностики CheckBootSpeed
В таблицу я собрал информацию о том, что конкретно проверяется и исправляется во время работы пакета.
Бета-тестирование CheckBootSpeed
Upd. Ровно 150 человек прислали запросы, и каждому я ответил ссылкой. Далеко не все прислали отчеты, но полученной информации более чем достаточно. Прием заявок прекращен.
Как и что тестировать
Прежде чем приступать к проверке, создайте точку восстановления системы.
- Запустите утилиту.
- Снимите на первом экране флажок автоматического исправления и нажмите «Далее».
Если вы не изменяли системные параметры, которые анализирует утилита, она предложит лишь сбор данных. Все остальные обнаруженные проблемы нужно изучить.
Пакет работает по принципу «найти проблему –> исправить ее –> проверить исправление», причем в большинстве случаев обнаружение и проверку выполняет один и тот же скрипт.
Поэтому нужно обращать внимание на такие моменты:
- Соответствует ли обнаруженная проблема алгоритму в таблице выше.
- Исправлена ли обнаруженная проблема на практике.
- Соответствует ли статус «Исправлено» или «Не исправлено» в результатах работы пакета реальному положению дел в итоге.
Если вы решили исправить проблему, повторите запуск утилиты и посмотрите, обнаружит ли она ее в этот раз.
Что делать с результатами
Здесь все просто! Вставьте отчет в комментарий и поделитесь впечатлениями от работы утилиты. Я буду рад услышать ваши наблюдения и замечания! Если вы не хотите публиковать отчет в комментариях, пришлите мне его на почту ответным письмом.
Vlad62
У меня есть возможность тестировать на нескольких компьютерах(ОС 7,8 х64&x32 HDD, SSD).
Pavel Bely
…присоединяюсь
Vadim Sterkin
Спасибо. Достаточно одной заявки, конечно.
Vlad62
При повторном запуске, утилита исправила проблемы. Контрольный запуск наличия проблем не показал.
REM: На данной машине был клонирован HDD на SSD буквально несколько дней назад. То есть, в журнале событий записи о HDD.
Vlad62
Pavel Bely
freeman440
Вадим, понимаю что ошибка Waiting for prefetcher не имеет отношение к утилите, но может сделать ее определение основываясь на решении, которое было найдено
А еще у меня уже продолжительное система выдает оценку производительности для моего HDD 7.5
Vadim Sterkin
Я не помню, какое решение было найдено и где.
Не понял. Утилита долго осуществляет сбор данных? Если так, то это нормально в первый раз — измерения на HDD не быстрые.
Vadim Sterkin
Уже поступило свыше 50 заявок О_о Спасибо всем, кто отклинкулся! В связи с этим я ограничил тестирование только для владельцев Windows 8 на SSD.
Andrey Kusnetsov
Это рабочий компьютер — вечером выложу отчет с домашнего, на котором Windows 8.
Vadim Sterkin
Спасибо, Андрей. Отчет отработал ОК. ОС долго грузится, но там видимо сетевые всякие сервисы и корпоративное ПО влияет.
Максим
Евгений
Vadim Sterkin
Спасибо, Евгений. С отчетом нет проблем. Диск у вас небыстрый, наверное 5400 ноутбучный?
freeman440
Плохо нельзя редактировать свои комментарии. В спешке наделал опечаток
ссылка на решение http://forum.oszone.net/post-2022510-512.html
Хотя предел для hdd насколько я знаю 5.9
Vadim Sterkin
Запустите
Потом см. также файл оценки диска в \Windows\Performance\WinSat\DataStore
Дмитрий Соколов
Хотелось уточнить, что скорость случайного чтения сильно зависит от размера блока. По моему цифры, указанные в статье, относятся к блокам 16К.
Vadim Sterkin
Дмитрий, да, блоки 16KB. Изменить можно параметром -ransize (диапазон от 16384 до 1048576 байт).
Но для целей утилиты этого достаточно. Ей же нужно определить, быстрее или медленнее 8MB/s. Вот мы и посмотрим, совпадет ли наша статистика по скоростям жестких дисков с данными Microsoft :)
Дмитрий
Протестировал на Windows 7 & Windows 8 HDD на одной машине, ошибок не выявлено. Разница загрузки Win 7 — 120Sek & Win8 — 32Sek.
Klem
Вот отчет. Так и не понял, нужно ли включить префетч и суперфетч. Пока не получается ускорить загрузку системы. Ресурсы программ в автозагрузке ограничивал по вашему методу, выставлением 120 сек.
Vadim Sterkin
У вас хоть твердотельный диск, но очень медленный. Я думю, что если вы включите Superfetch, система будет использовать ее, в т.ч. ReadyBoot.
Странно, что ни разу не выполнялась оптимизация дисков, хотя задание включено и планировщик тоже. Возможно, журналы были очищены недавно.
Игорь Ш.
Vadim Sterkin
Спасибо, Игорь!
Игорь Ш.
Буду дома — на ноутбуках протестирую еще (3 ноутбука с разными ОС).
dsegey88
Хотел заполнить форму заявки, но почему-то в форме доступны версия ОС только Win 8 и тип диска только SSD?
Vadim Sterkin
Причина написана над формой.
Vadim Sterkin
Да, можно добавить это в утилиту, я подумаю. Другое дело, что всех проблем не предусмотришь. Мало ли кто-то руками снесет что-то :)
Денис Борисыч
Диск Crucial M4-CT064M4SSD2 + Win7 x64 Prof
Vadim Sterkin
Спасибо. Примечание насчет модели диска нелишнее, т.к. в 7 не собирается эта информация :) Теоретически ID диска извлечь можно, но сопоставить с буквами разделов проблематично.
Denis
Дома на SSD:
На работе на HDD:
Vadim Sterkin
Спасибо, Денис! У вас утилита четко отработала на обеих системах.
dsegey88
Vadim Sterkin,
Все понятно.
Денис Борисыч
Ноутбук Тошиба
win 7 home basic x86 + 250 HDD
Денис Борисыч
Как-то криво отчеты впихиваются.
Vadim Sterkin
Я поправил, спасибо. У вас все ок отработало.
Денис Борисыч
Ноут Самсунг
Win 7 home prem x64 + 500GB HDD
Денис Борисыч
Windows 7 Pro x64 + SSD 128 Gb Crucial SATA 3 M4 (CT128M4SSD2)
Денис Борисыч
А можно потом статистику по отчетам посмотреть будет?
Vadim Sterkin
Денис Борисыч, статистику я обязательно опубликую :) А что вас конкретно интересует?
Vadim Sterkin
Между тем, выяснилось, как Windows 8 определяет оценку диска. Это просто среднее значение между оценками скоростей последовательного и случайного чтения.
alegz81
Windows 8 Ent x64 + Kingston HyperX 3K SSD 240gb
Vadim Sterkin
Спасибо, у вас все четко сработало.
cvlad
Vadim Sterkin
Спасибо, у вас все ок с отчетом, но очень долго грузится система, особенно после входа. Попробуйте Три простых совета по ускорению загрузки Windows
Игорь Ш.
Vadim Sterkin,
Всегда пожалуйста :)
Денис Борисыч
Возник вопрос об оценке
на моем ПК win 7 оценка 7,9
На вин 8
собственно
1) Раз вин уже не 7 а 8 то максимальная оценка 8,0 а не 7,9 я правильно понял?
2) А не слишком-ли большие цифры получились в моем тесте?
3) Какую оценку он берет за минимальную при отчете? Ну или как она дифференцируется?
Vadim Sterkin
Денис Борисыч, я думаю, что алгоритмы вывода оценки разные в Windows 7 и Windows 8. В 8 потолок увеличили до 9.9 вроде, но я сомневаюсь, что полностью сохраняется преемственность оценок. Другими словами, нельзя сравнивать оценки 7 и 8, и подобранные вами примеры это подтверждают.
Что касается оценки дисков, то в 7 вообще был потолок 1.9 — 3.0 для некоторых дисков. Вот тут неплохая таблица в посте, а в конце ссылка на блог разработчиков, откуда она и выведена.
Александр
Шкала оценки не меняется с Висты, она просто увеличивается. В Восьмерке максимальная планка увеличена до 9,9, поэтому оценка не меняется при смене системы на более молодую. В Вашем случае скорей всего имеет место быть то, что в семерке оценка вышла за пределы шкалы оценки потому и была дана просто максимально возможная. В восьмерке-же уже появилась возможность дать адекватную оценку. как-то так…
Vadim Sterkin
Спасибо за комментарий, Александр.
Александр
На ССД для компьютера все никак не разорюсь, но это не настолько критично? На ноутбуке по крайней мере соблюдены все условия :)
Компьютер :
Ноутбук:
Vadim Sterkin
Спасибо, Александр, у вас все ок отработало. А на ноутбуке ОС недавно стоит? Не вижу отчетов оптимизатора дисков.
Александр
Буквально 2 недели, как приобрел — не успел на дешевое обновление — ноутбук в ремонте был, пришлось копить.
Vadim Sterkin,
Vadim Sterkin
Ок, я так и подумал. Я забыл прикрутить в пакет определение даты установки ОС, добавлю в след. версии.
Иван
SSD был куплен неделю назад, особого прироста не наблюдаю. Делал твики ссд-твикером.
На HDD в лучшие времена винда грузилась 38 секунд, последнее время сеунд 60.
Подумываю вернуть SSD назад в магазин. Чего так все хвалят эти SSD?
Не стоит оно того. Платить такие деньги за чуть повышенную скорость загрузки и отзывчивость системы.
Vadim Sterkin
Иван, спасибо за отчет. А вот когда вы вернетесь на HDD, тогда и лучше ощутите разницу :)
Александр
Иван,
Позволю себе не согласится. На ноутбуке с магазина шел терабайтовый HDD, После установки SSD (128 Гб) прирост огромен. Хотя скорей всего потому, что изначально не применял никаких твиков. Последние года два вообще отказался от настройки системы всякими твикерами, что дало великолепный результат — система стала намного быстрей и стабильней.
Александр
Результат работы утилиты на ноутбуке после 3-х контрольных перезагрузок (Компьютер перезагрузить пока не могу, если интересно, то завтра дам с него отчет)
Vadim Sterkin
Да нет, спасибо, результатов хватает.
Геннадий
freeman440
Извиняюсь за задержку, но семерка стоит только на домашнем ПК
Vadim Sterkin
Гм… При запуске пакета winsat показала скорость случайного чтения — 3.31000 MB/s, а в сохраненной оценке совсем другие цифры (причем случайное чтение нереальное):
Что у вас за диск? :)