Новая версия моего диагностического пакета почти готова к свободному плаванию. Сегодня я расскажу об изменениях и покажу скрипты 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 человек прислали запросы, и каждому я ответил ссылкой. Далеко не все прислали отчеты, но полученной информации более чем достаточно. Прием заявок прекращен.
Как и что тестировать
Прежде чем приступать к проверке, создайте точку восстановления системы.
- Запустите утилиту.
- Снимите на первом экране флажок автоматического исправления и нажмите «Далее».
Если вы не изменяли системные параметры, которые анализирует утилита, она предложит лишь сбор данных. Все остальные обнаруженные проблемы нужно изучить.
Пакет работает по принципу «найти проблему –> исправить ее –> проверить исправление», причем в большинстве случаев обнаружение и проверку выполняет один и тот же скрипт.
Поэтому нужно обращать внимание на такие моменты:
- Соответствует ли обнаруженная проблема алгоритму в таблице выше.
- Исправлена ли обнаруженная проблема на практике.
- Соответствует ли статус «Исправлено» или «Не исправлено» в результатах работы пакета реальному положению дел в итоге.
Если вы решили исправить проблему, повторите запуск утилиты и посмотрите, обнаружит ли она ее в этот раз.
Что делать с результатами
Здесь все просто! Вставьте отчет в комментарий и поделитесь впечатлениями от работы утилиты. Я буду рад услышать ваши наблюдения и замечания! Если вы не хотите публиковать отчет в комментариях, пришлите мне его на почту ответным письмом.
Дима
Здравствуйте Вадим.
К сожалению «завалил свой участок» не обессудьте .
Первый раз отчёт был и что то исправила.
Отчёт «упустил» Окатил на вчера , больше , ни отчёта ни исправлений добиться не удалось.
С уважением Дима.
Vadim Sterkin
Дима, какая-то ошибка появляется?
freeman440
Vadim Sterkin, Вадим оценка диска осталась неизменной
http://lostpic.net/?photo=1327327
http://lostpic.net/?photo=1327328
Vadim Sterkin
Но, по крайней мере, результат winsat в случайном чтении теперь больше похожa на правду. Откуда она берет 7.5, я не знаю. В Windows 7 более сложный алгоритм вывода, чем в Windows 8.
freeman440
обычный wd1002faex :)
причем раньше оценка была 5.9 стабильно, потом 7.3 и последние месяца четыре она стабильно держится на 7.5
Максим Перехрест
Вот мои пять копеек. :) Никаких «тонких настроек» системы, связанных с SSD не делал, видимо, поэтому и никаких проблем и не обнаружено.
Vadim Sterkin
Спасибо, Максим! Вся эта информация мне очень пригодится :)
cvlad
На домашнем ПК:
Vadim Sterkin
Спасибо!
Сергей
Не совсем уверен, что правильно сделал, но вот два отчета:
Вин 7х64 Про HDD Seagate 500Gb 7200 rpm
Вин 8 х64 SSD Crucial M4-CT064
Vadim Sterkin
Сергей, это отчет с Windows 7. А где с Windows 8?
Сергей
Вин 8 х64 SSD Crucial M4-CT064
Дима
Vadim Sterkin,
Нет. » Модуль устранения неполадок не выявил проблему»
«посмотреть дополнительные сведения»
вот они http://yadi.sk/d/zzUmYdeI3MKvC
Vadim Sterkin
А, значит, у вас даже и отчет не хочет собирать… Удалите из временной папки %temp% файл checkbootspeed.txt. Пакет сам его должен удалять по окончании работы, но почему-то этого не произошло.
Pavel Kravchenko
Windows 8, OCZ AGILITY3
Естественно никаких волшебных твиков для SSD (и не только) не применялось :)
Vadim Sterkin
Паша, ты что, ОС только что установил? У тебя не выполнялась оценка производительности и оптимизатор еще не сработал ни разу.
Думаю, что если ты сделаешь оценку, параметр EnableSuperfetch: 3 уйдет (м.б. нужна перезагрузка).
Сергей
Vadim Sterkin,
пост ниже
https://www.outsidethebox.ms/14817/#comment-13278
Andrey Kusnetsov
Вадим, как и обещал результат на Windows 8:
Vadim Sterkin
Андрей, что-то она у вас долго грузится очень. Может служба висит какая или сетевые диски… Надо уже ETL смотреть.
Алексей
Вадим, добавил бы еще кое-что:
Может стоять старт=0 и не указан файл — тогда он не содается вообще.
Vadim Sterkin
Алексей, да, мне уже выше писали в комментариях. Я добавлю в след. версию.
Andrey
в конце написал: проверка скорости загрузки не проводилась — fixed
Валерий
Vadim Sterkin
Валерий, у вас тоже такой же косяк, как у Влада. Я отправил вам в почту 2.0с, попробуйте еще раз.
Vlad62
Что то не то. Снова нет подсчёта скорости. Эти системы объединяет модель и марка SSD, Windows 8 Pro NFR и мои руки. Эта система точно не клонирована. Переопределения Temp нет.
Дмитрий
Vadim Sterkin
Спасибо, Дмитрий. Судя по всему, у вас тоже недавно ОС установлена. Я уже добавил в след. версию определение даты установки, чтобы не задавать лишних вопросов :)
Валерий
О какой скорости идет речь?
Игорь Сакович
Intel 335, 240 Gb
Предполагаю, что долгое время загрузки из-за ожидания ввода пароля? Или там установки обновлений. Обычно я просто компьютер завожу в сон, а потом он в hibernate уходит.
Vadim Sterkin
Игорь, и то и другое возможно. Я, как правило, перезагружаюсь, когда припрет с обновлениями :) И это занимает время.
Олег
Vlad62
Я полагаю о этой: Система, вероятно, установлена на (скорость случайного чтения — MB/s)
Валерий
еще в строчке опечатка:
почему-то в конце единица. в версии 2b не было.
Vadim Sterkin
Валерий, я вообще не трогал это :) Не могу воспроизвести. Пришлите мне свой последний отчет в почту, плиз.
Leonid
У меня вот такой мусор…
Компом пользуются 3 человека, у двоих родной иврит. Ну и для не-юникодовских программ стоит иврит…
——————————————————————————
Vadim Sterkin
Леонид, это известное ограничение, о котором я писал в сводной таблице. Я не буду это править, т.к. целевая аудитория работает с русским языком для неюникодных программ.
Валерий
Последний отчет удалил и воспроизвести не смог. Возможно, глюк или случайно нажал, что скорее всего.
Простите за беспокойство.
Vadim Sterkin
Валерий, так теперь скорость определяется в основном отчете?
Денис Борисыч
Vadim Sterkin,
Из прочитанного я понял что оценка не шибко декватна и по сути ничего не отражает выше 5 баллов.
Vadim Sterkin
Ну как сказать… Любая оценка условна, но логика явно просматривается. Я посмотрел системы с Windows 8. Ни один HDD не превысил 6.0 (по факту — у всех 5.9). Зато практически все SSD превышают 7.0 (лишь два дохлых опустились ниже), а некоторые — даже 8.0.
Другими словами, понятно, где проходит граница, и я мог бы полагаться на оценку WinSat, а не на свои измерения. Однако не у всех сделана формальная оценка, поэтому я прогоняю тест сам.
Pavel Kravchenko
Система установлена с неделю как, просто не было времени привести в порядок. Перезагружалась всего раза три-четыре после установки обновлений.
Провел оценку, параметр EnableSuperFetch: 3 не ушел.
Дима
Нашёл его http://yadi.sk/d/ytmhCLBB3N0E7 ,удалил.
«Диагностика завершена»
Обнаруженные проблемы
Проверка скорости загрузки не проводилась Исправлено
И выдала новый отчёт http://yadi.sk/d/c_OuiE_Y3N0jO .
Vadim Sterkin
Спасибо. Думаю, это еще один случай недавней установки системы.
Илья
На работе: SSD
Pavel Kravchenko
Провел еще несколько перезагрузок + повторную оценку производительности — EnableSuperFetch теперь не определен и индекс вырос с 6.9 до 7.15
Валерий
Vadim Sterkin,
Да. В версии 2с скорость определяет.
Алексей Берлезов
Прошу сильно не ругать если что-то сделал не так .
Vadim Sterkin
Алексей, все так. Почему-то не отработал сбор сведений о дисках и разделах. Попробуйте в PowerShell с поными правами вставить:
Алексей Берлезов
Vadim Sterkin,
На выходе получил это —
попробую пергрузиться и выполнить заново.
Алексей Берлезов
Теперь так
Vadim Sterkin
Ничего не изменилось. Попробуйте просто вывести команду
Максим
Vadim Sterkin
Спасибо, Максим, у вас все четко.
Алексей Берлезов
Vadim Sterkin,
получилось так —
power shell, от имени администратора
Vadim Sterkin
Интересно. А если так:
В полученном списке есть Get-Partition?
анатолий
Ценю людей за професионализм!. Я начинаюший , только осваиваю…Спасибо!
Pavel Bely
Статья отличная, всё понятно расписано про работу SuperFetch, ReadyBoot и Prefetch на SSD!
(Win8 х64 SSD OCZ Vertex 4 + HDD WD Caviar Green)
не удержался сделал ресет системе
Алексей Берлезов
Vadim Sterkin,
да, есть
Алексей Берлезов
Vadim Sterkin,
попробовал просто get-partition
получилось это —
PS C:\> get-partition
Disk Number: 0
PartitionNumber DriveLetter Offset Size Type
————— ———— —— —- —-
1 1048576 350 MB IFS
2 C 368050176 55.56 GB IFS
Disk Number: 1
PartitionNumber DriveLetter Offset Size Type
————— ———— —— —- —-
1 D 1050624 1.82 TB IFS
PS C:\>
Владимир
Спасибо за приглашение. А где собственно прога?
Vadim Sterkin
Владимир, вы долго запрягали. Прием заявок уже завершен.
Дмитрий
Вадим, а когда простые смертные смогут получить сей продукт?..
Vadim Sterkin
Дмитрий, предыдущая версия доступна и так, а новая будет на следующей неделе примерно.