Новая версия моего диагностического пакета почти готова к свободному плаванию. Сегодня я расскажу об изменениях и покажу скрипты 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, Вадим оценка диска осталась неизменной
http://lostpic.net/?photo=1327327
http://lostpic.net/?photo=1327328
Но, по крайней мере, результат winsat в случайном чтении теперь больше похожa на правду. Откуда она берет 7.5, я не знаю. В Windows 7 более сложный алгоритм вывода, чем в Windows 8.
обычный wd1002faex :)
причем раньше оценка была 5.9 стабильно, потом 7.3 и последние месяца четыре она стабильно держится на 7.5
Вот мои пять копеек. :) Никаких «тонких настроек» системы, связанных с SSD не делал, видимо, поэтому и никаких проблем и не обнаружено.
Спасибо, Максим! Вся эта информация мне очень пригодится :)
На домашнем ПК:
Спасибо!
Не совсем уверен, что правильно сделал, но вот два отчета:
Вин 7х64 Про HDD Seagate 500Gb 7200 rpm
Вин 8 х64 SSD Crucial M4-CT064
Сергей, это отчет с Windows 7. А где с Windows 8?
Вин 8 х64 SSD Crucial M4-CT064
Vadim Sterkin,
Нет. » Модуль устранения неполадок не выявил проблему»
«посмотреть дополнительные сведения»
вот они http://yadi.sk/d/zzUmYdeI3MKvC
А, значит, у вас даже и отчет не хочет собирать… Удалите из временной папки %temp% файл checkbootspeed.txt. Пакет сам его должен удалять по окончании работы, но почему-то этого не произошло.
Windows 8, OCZ AGILITY3
Естественно никаких волшебных твиков для SSD (и не только) не применялось :)
Паша, ты что, ОС только что установил? У тебя не выполнялась оценка производительности и оптимизатор еще не сработал ни разу.
Думаю, что если ты сделаешь оценку, параметр EnableSuperfetch: 3 уйдет (м.б. нужна перезагрузка).
Vadim Sterkin,
пост ниже
https://www.outsidethebox.ms/14817/#comment-13278
Вадим, как и обещал результат на Windows 8:
Андрей, что-то она у вас долго грузится очень. Может служба висит какая или сетевые диски… Надо уже ETL смотреть.
Вадим, добавил бы еще кое-что:
Может стоять старт=0 и не указан файл — тогда он не содается вообще.
Алексей, да, мне уже выше писали в комментариях. Я добавлю в след. версию.
в конце написал: проверка скорости загрузки не проводилась — fixed
Валерий, у вас тоже такой же косяк, как у Влада. Я отправил вам в почту 2.0с, попробуйте еще раз.
Что то не то. Снова нет подсчёта скорости. Эти системы объединяет модель и марка SSD, Windows 8 Pro NFR и мои руки. Эта система точно не клонирована. Переопределения Temp нет.
Спасибо, Дмитрий. Судя по всему, у вас тоже недавно ОС установлена. Я уже добавил в след. версию определение даты установки, чтобы не задавать лишних вопросов :)
О какой скорости идет речь?
Intel 335, 240 Gb
Предполагаю, что долгое время загрузки из-за ожидания ввода пароля? Или там установки обновлений. Обычно я просто компьютер завожу в сон, а потом он в hibernate уходит.
Игорь, и то и другое возможно. Я, как правило, перезагружаюсь, когда припрет с обновлениями :) И это занимает время.
Я полагаю о этой: Система, вероятно, установлена на (скорость случайного чтения — MB/s)
еще в строчке опечатка:
почему-то в конце единица. в версии 2b не было.
Валерий, я вообще не трогал это :) Не могу воспроизвести. Пришлите мне свой последний отчет в почту, плиз.
У меня вот такой мусор…
Компом пользуются 3 человека, у двоих родной иврит. Ну и для не-юникодовских программ стоит иврит…
——————————————————————————
Леонид, это известное ограничение, о котором я писал в сводной таблице. Я не буду это править, т.к. целевая аудитория работает с русским языком для неюникодных программ.
Последний отчет удалил и воспроизвести не смог. Возможно, глюк или случайно нажал, что скорее всего.
Простите за беспокойство.
Валерий, так теперь скорость определяется в основном отчете?
Vadim Sterkin,
Из прочитанного я понял что оценка не шибко декватна и по сути ничего не отражает выше 5 баллов.
Ну как сказать… Любая оценка условна, но логика явно просматривается. Я посмотрел системы с Windows 8. Ни один HDD не превысил 6.0 (по факту — у всех 5.9). Зато практически все SSD превышают 7.0 (лишь два дохлых опустились ниже), а некоторые — даже 8.0.
Другими словами, понятно, где проходит граница, и я мог бы полагаться на оценку WinSat, а не на свои измерения. Однако не у всех сделана формальная оценка, поэтому я прогоняю тест сам.
Система установлена с неделю как, просто не было времени привести в порядок. Перезагружалась всего раза три-четыре после установки обновлений.
Провел оценку, параметр EnableSuperFetch: 3 не ушел.
Нашёл его http://yadi.sk/d/ytmhCLBB3N0E7 ,удалил.
«Диагностика завершена»
Обнаруженные проблемы
Проверка скорости загрузки не проводилась Исправлено
И выдала новый отчёт http://yadi.sk/d/c_OuiE_Y3N0jO .
Спасибо. Думаю, это еще один случай недавней установки системы.
На работе: SSD
Провел еще несколько перезагрузок + повторную оценку производительности — EnableSuperFetch теперь не определен и индекс вырос с 6.9 до 7.15
Vadim Sterkin,
Да. В версии 2с скорость определяет.
Прошу сильно не ругать если что-то сделал не так .
Алексей, все так. Почему-то не отработал сбор сведений о дисках и разделах. Попробуйте в PowerShell с поными правами вставить:
Vadim Sterkin,
На выходе получил это —
попробую пергрузиться и выполнить заново.
Теперь так
Ничего не изменилось. Попробуйте просто вывести команду
Спасибо, Максим, у вас все четко.
Vadim Sterkin,
получилось так —
power shell, от имени администратора
Интересно. А если так:
В полученном списке есть Get-Partition?
Ценю людей за професионализм!. Я начинаюший , только осваиваю…Спасибо!
Статья отличная, всё понятно расписано про работу 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:\>
Спасибо за приглашение. А где собственно прога?
Владимир, вы долго запрягали. Прием заявок уже завершен.
Вадим, а когда простые смертные смогут получить сей продукт?..
Дмитрий, предыдущая версия доступна и так, а новая будет на следующей неделе примерно.