В день объявления тестирования утилиты CheckBootSpeed я отправил ссылку на нее каждому, кто прислал запрос. Получив 150 заявок, я прекратил набор желающих. В итоге у меня набралось 53 отчета, и я очень благодарен всем, кто их предоставил.
С учетом того, что некоторые читатели прислали по несколько отчетов с разных ПК, получается, что как минимум 2/3 участников не поделились результатами. Зачем эти люди просили утилиту, осталось неясным… Но тем ценнее каждый присланный отчет!
[+] Сегодня в программе
- Итоги тестирования
- PowerShell в действии
- Подробности задания ScheduledDefrag в планировщике
- Сопоставление буквы диска типу накопителя
- Извлечение данных об активности ReadyBoot и Prefetch
- Даты создания отчета и установки системы
- Отчеты дефрагментации и оптимизации диска
- Обработка собранных статистических данных
- Дискуссия
Итоги тестирования
В рамках тестирования нашелся только один незначительный дефект при создании отчета, но он уже исправлен. Я также внес в пакет и другие изменения:
- улучшена логика определения скорости накопителя: если winsat не отрабатывает, делается попытка извлечь скорость диска из недавней формальной оценки
- добавлены сведения о дате установки ОС (я забыл это включить в бету, хотя по косвенным признакам отчета можно было определить, что система «свежая»)
- добавлено исправление одного из параметров ReadyBoot в реестре, предложенное двумя читателями в комментариях
- ускорено выполнение некоторых команд за счет оптимизации кода (спасибо за советы Вадимсу Подансу, MVP PowerShell)
PowerShell в действии
В прошлый раз все были настолько сфокусированы на работе утилиты CheckBootSpeed и ее отчетах, что за кадром обсуждения остались командлеты, выражения и переменные Powershell. Между тем, я показывал в деле:
В конце я обещал рассказать, как утилита CheckBootSpeed собирает сведения о системе. Ниже вы увидите практические приемы использования PowerShell, которые я задействовал для решения этой задачи.
- Export-ScheduledTask
- Get-Partition
- ForEach
- Get-ChildItem
- Measure-Object
- Get-Date
- Get-WmiObject
- Select-String
Подробности задания ScheduledDefrag в планировщике
Наличие командлета Export-ScheduledTask максимально упрощает задачу, сводя ее к обработке XML. Поскольку команда всегда defrag.exe, я смотрю только на аргументы командной строки.
[[xml]]$DefragTask = Export-ScheduledTask -TaskName "ScheduledDefrag" -TaskPath "\Microsoft\Windows\Defrag\" $Defragtask.task.actions.exec.arguments
В принципе, раньше для получения статуса задания в планировщике я с тем же успехом использовал утилиту командной строки schtasks, умеющую делать экспорт в XML.
Результат этой и других команд вы легко найдете в комментариях к предыдущей записи, где опубликовано множество отчетов.
Сопоставление буквы диска типу накопителя
Прогон теста winsat по всем разделам сильно затянул бы диагностику, поэтому я обошелся новым командлетом Get-Partition. Начиная с Windows 8, он входит в модуль Storage, вобравший в себя функции diskpart, chkdsk и т.д.
Можно быстро посмотреть, какие сведения о разделах доступны:
get-partition | fl *
Меня интересовали буквы разделов, а также ИД дисков (как в диспетчере устройств). Впрочем, в итоге вместо буквы диска я решил извлекать путь доступа. Он заодно содержит GUID раздела, перекликающийся с параметрами defrag.exe в запланированном задании.
Я решил задачу с помощью выражения ForEach, занимающегося перебором всех найденных разделов с извлечением пути доступа и ИД.
$PartitionInfo = foreach ($p in Get-Partition) {$p.AccessPaths, $p.DiskId, ""} $PartitionInfo
Конечно, эти данные собираются только в Windows 8. Для тех, у кого нет PowerShell 3.0, я покажу фрагмент отчета для одного раздела:
C:\ \\?\Volume{7cf9cd13-0f82-11e2-be66-806e6f6e6963}\ SCSI\DISK&VEN_&PROD_KINGSTON_SH103S3\4&1A6BCA51&0&000000
Безусловно, просто глядя на модель диска, не всегда можно определить его тип. Но поисковики никто не отменял :)
Извлечение данных об активности ReadyBoot и Prefetch
Функция ReadyBoot сохраняет отчеты о каждом запуске Windows в системной папке. С помощью скрипта PowerShell можно легко получить информацию об этих файлах.
Первые две переменные задают путь к папке и текст, который выводится перед результатом.
$ReadyBootFolder = "$env:systemdrive\windows\prefetch\readyboot" $ReadyBootFolderString = "Последние действия ReadyBoot:"
Дальше в дело вступают командлеты Get-ChildItem, извлекающий сведения о файлах в папке, и Measure-Object, в данном случае подсчитывающий их количество. Если файлов нет, выводится текст «Нет».
if ($(Get-ChildItem $ReadyBootFolder | Measure-Object).count -eq "0") {$ReadyBootFolderResult = "Нет"}
В противном случае на сцену выходит страшная команда, за которой следует вывод результатов
else {$ReadyBootFolderResult = Get-ChildItem -Path $ReadyBootFolder -filter "*.fx*" | sort LastWriteTime -desc | select -first 3 | ft lastwritetime,extension} $ReadyBootFolderString $ReadyBootFolderResult
Если перевести большую команду на человеческий язык, получится так:
- Взять все объекты в папке
- Отфильтровать файлы, в имени которых содержится .fx
- Отсортировать по дате создания
- Выбрать верхние три элемента
- Вывести в таблицу дату создания и расширение
Это называется конвейером, и данный пример хорошо иллюстрирует их мощь в PowerShell. Точно так же собираются данные об активности логического префетчера.
Более того, аналогичный прием применяется при поиске последнего отчета оценки диска, созданного системой. В папке Windows\Performance\WinSat\DataStore можно с помощью фильтра по имени и сортировки выбрать самый свежий файл, содержащий в имени Disk.Assessment. После чего остается лишь извлечь его содержимое командлетом Get-Content и обработать XML.
Даты создания отчета и установки системы
Я добавлю эту информацию в отчет окончательного варианта версии 2.0 утилиты, а сейчас воспользуюсь хорошим примером, чтобы показать работу с датами.
Дата создания отчета
Текущую дату можно получить командлетом Get-Date – получится что-то вроде «21 марта 2013 г. 13:22:29». В принципе, этого достаточно, но можно преобразовать дату в короткий формат.
Get-Date -format g
В данном случае параметр g обозначает общий (general) формат даты в .NET Framework, а на практике — это короткая дата и короткое время, «21.03.2013 13:22».
Дата установки системы и подсчет числа дней с момента установки
Для извлечения даты установки системы нужно немного потрудиться, зато в итоге все будет красиво!
Дата установки системы: 2012-10-06 (прошло дней: 165)
Командлет Get-WmiObject и класс Win32_OperatingSystem вам уже должны быть знакомы. Одним из объектов здесь является InstallDate, т.е. дата установки системы.
(Get-WmiObject -class Win32_OperatingSystem).installdate
Полученная дата включает в себя время с точностью до секунды и даже географическую зону (240).
20121006000841.000000+240
Эту дату можно преобразовать в формат, понятный командлету Get-Date. Тайным знанием методов .NET Framework с вами делится Вадимс Поданс.
$InstallDate = [Management.ManagementDateTimeconverter]::ToDateTime((Get-WmiObject Win32_OperatingSystem).installdate)
Дальше простая математическая операция вычитает из текущей даты (Get-Date) дату установки системы, получая ответ в днях.
$DaysSinceInstall = ((Get-Date) - $Installdate).days
Завершающий штрих – конвертация даты установки в желаемый формат и построение фразы для отчета.
$ShortInstallDate = "{0:yyyy-MM-dd}" -f ($InstallDate) $InstallDateString = "Дата установки системы: $ShortInstallDate (прошло дней: $DaysSinceInstall)"
Отчеты дефрагментации и оптимизации диска
Здесь просто извлекаются из журнала последние 300 событий 258 от defrag. Из каждого события берется его дата и текст сообщения, а результаты сортируются по дате, от новых к старым. Конкретную команду я оставляю вам в качестве домашнего задания.
Обработка собранных статистических данных
Поскольку одной из главных новинок в утилите было внутреннее определение скорости диска, логично было проанализировать полученные отчеты именно в этом контексте.
Система, вероятно, установлена на SSD (скорость случайного чтения - 210.92000 MB/s)
Из-за бага бета-версии, упомянутого в начале записи, у нескольких людей скорость не определилась, но это не суть важно.
Задача
Я изначально складывал отчеты по четырем папкам, в зависимости от ОС и типа накопителя. Поэтому проблема формулировалась так:
- Обработать все файлы в папках
- Найти в каждом файле строку с измеренной скоростью
- Извлечь значение скорости
- Вывести все значения
PowerShell эта задача вполне по плечу, причем дальше вы увидите два варианта решения.
Извлечение фрагмента строки из набора файлов с помощью PowerShell
Я слабо владею PowerShell, поэтому применил подход, который сработает, наверное, в любом языке. Сначала я создал переменную и объявил новый массив.
$Path = "$env:userprofile\Documents\Scripts\CBS-Results\" $myArray = @()
Затем с помощью командлета Get-ChildItem я организовал рекурсивную обработку папки. Полученные данные передаются по конвейеру командлету Select-String, который выбирает строки, совпадающие с заданным шаблоном. Каждая найденная строка добавляется в массив оператором “+=”.
$myArray += get-childitem $Path -recurse | select-string -pattern "чтения -"
Дальше совершается обход всех элементов массива. В каждом элементе ищется тире, идущее перед скоростью чтения, и от него отсчитывается 6 символов. Нужные совпадения выводится на экран.
foreach ($element in $myArray){ $element.line -match "- (.{6})" | out-null $matches[1]}
В результате получается аккуратный столбик данных.
Дело было сделано, но я решил показать решение эксперту. Вадимс сразу сказал, что мой код коричневый и дурно пахнет :) Он также отметил, что сам бы сделал «ванлайнер» (решение в одну строку), но это будет выглядеть сложно.
После таких заявлений от «ванлайнера» ему уже было не отвертеться, и вот что я получил в Skype через несколько минут:
dir -rec | select-string -pattern "чтения -" | %{$_ -replace ".+я" -replace "[^\d+.\d+]"}
Здесь dir — это просто алиас командлета Get-ChildItem. Становится ясно, что можно обойтись и без массива. Но в любом случае мне не по зубам регулярные выражения, которыми Вадимс решил задачу. Однако мораль в том, что даже новичок в PowerShell может решить задачу, пользуясь подсказками гуглояндекса при необходимости.
Диаграммы в Excel
Дальше данные в наглядном виде представляет уже Excel. Запись была запланирована заранее, поэтому не все отчеты покрыты, но картина будет ясна и так. Напомню, что это оценка winsat:
winsat disk -ran -read -drive %SystemDrive:~0,1%
При этом выполняется случайное чтение блоков 16KB.
Как видите, лишь один жесткий диск перевалил через 3MB/s. Таким образом, можно считать корректным барьер в 8MB/s, который использует утилита для определения типа накопителя.
Для SSD это семечки, и даже самые посредственные SSD здесь в разы быстрее жестких дисков.
Ваши отчеты очень помогли мне собрать еще кое-какие данные, но они будут фигурировать в одной из будущих записей блога, примерно через пару недель. Не пропустите сие тайное знание :)
Дискуссия
В платформу диагностики, на которой построена утилита CheckBootSpeed, уже включены необходимые функции для определения и устранения проблем. Например, диагностический скрипт с помощью специального командлета передает платформе идентификатор проблемы и результат проверки. Поэтому я изначально избрал именно этот формат для устранения неполадок, замедляющих загрузку.
Что же касается сбора данных, то их можно извлечь и другими скриптовыми языками. Если вы увлекаетесь скриптами, покажите в комментариях, как бы вы решили описанные выше задачи. Будет интересно сравнить! Если вы предпочитаете PowerShell, покажите решения, альтернативные моим.
Андрей Софронов
CheckBootSpeed теперь только для Win 8, 7-ку забросил совсем?
Vadim Sterkin
Андрей, почему только для 8? У вас в 7 не работает что-ли?
гыук
Утилита проверяет только стандартные встроенные средства ОС ?
Было бы здорово, если бы она анализировала автозагрузку, активность приложений во время загрузки ОС. Т.к. на скорость очень влияют установленные приложения со своими плагинами и хелперами. И с приложениями можно больше «поиграть» чем с оптимизацией встроенных средств, которые и по умолчанию нормально настроены. имхо.
Vadim Sterkin
Возможно, вы пропустили эти материалы:
Дело об автозагрузке Windows
Изучение автозагрузки Windows 8 с помощью Windows Performance Analyzer
Играйте с приложениями на здоровье :)
Алексей Г
В Windows 8 это делает сама система. Посмотрите диспетчер задач. К сожалению, на бета-тест не успел, но наверное было бы не лишним
напомнить пользователю что за состоянием автозапуска он может следить в диспетчере задач (только Win8)
гыук
у меня Вин7. автостарт у меня всегда пуст, тот, что в msconfig — по минимуму. Но кроме этих двух приложения всё равно загружают свои плагины, библиотеки. После установки на чистую ОС нужны приложений (ничего специфического) — системе нужно 2-3 минуты после входа простоять. В это время заметна нагрузка на диск. Да и сама загрузка увеличилась на 1 минуту. не критично, но со временем приложения растут и загрузка до полной работоспособности тоже…
Alanter
Вадим добрый вечер. При выпуске финальной версии она ведь будет доступна всем длительное время? Просто сертификат подписи у вас истекает в апреле.. PS если мне не изменяет память будет ругатся на отсутствие (или некорректную) подпись.
Vadim Sterkin
Верно, я уже продлил серт :) Но 2с фактически стала 2.0, я обновил запись. Ругаться все равно не будет — главное, что серт валиден на момент подписи.
Олег
Извините, Вадим, я как раз из той 2/3, которые не поделились результатами… Скрины сделал еще 19.03, а отправить не получилось. У меня Win7 и после запуска утилиты отработала один раз и все… больше ни в какую.. после запуска окошко «Модуль устранения неполадок не выявил проблему» с предложением посмотреть дополнительные параметры, по скорости загрузки ничего (хотя в первый раз все было нормально). А вот первая версия отлично работает. Если надо могу выслать подготовленные скрины.
Владимир
Проблема в Windows 7 64bit, не исправляет проблемы, хотя txt файл CheckBootSpeed формирует нормально
В конце выводит
Vadim Sterkin
Владимир, какие проблемы не исправлены? Написано, что одна проблема исправлена, а остальные — не обнаружены.
К сожалению, я ничего не могу поделать с тем, что вместо «Проблема не обнаружена» пишут «Элемент отсутствует», это заложено в платформу…
Владимир
Владимир,
сам отчет
Владимир
Vadim Sterkin,
Не подумал, что это логика такая. Просто изначально я настраивал под SSD твики, потом почитал Вашу хорошую статью про мифы, понял, что проблема долгой загрузки из за этих твиков. Только ваша диагностика это не исправляла, пришлось все в ручную возвращать.
После нескольких перезагрузок скорость загрузки увеличилась минимум в 2раза.
Еще смутило
Почему пишет Задание дефрагментации отключено в планировщике и Служба «Планировщик заданий» не запускается автоматически, если реально они включены?
Vadim Sterkin
Владимир, где вы это видите? Я смотрю в опубликованный вами отчет и вижу совсем другое…
Владимир
Vadim Sterkin,
В отчете все нормально, в конце диагностики, когда выводит окно Диагностика завершена с кнопкой Закрыть, внизу есть ссылка Просмотреть дополнительные сведения, вот там это пишет.
Vadim Sterkin
Владимир,
1. Запустите утилиту, снимите флажок автоматического исправления, нажмите Далее, сделайте скриншот.
2. Исправьте найденные проблемы и сделайте скриншот окна по ссылке «Посмотреть дополнительные сведения» так, чтобы было видно то, о чем вы говорите.
Андрей
При запуске планировщика — «выбранная задача 0 больше не существует», прошу прощения ,что не в тему но может быть хотя бы здесь кто-нибудь поможет, поиск в интернете не помог, перепробовал кучу разных рекомендаций бесполезно.
с уважением Андрей.
Vadim Sterkin
Угу, вам сюда, но прежде чем написать там, прочтите это.
Андрей
Vadim Sterkin,
Благодарю за ответ, и по Вашим ссылкам я уже был, и перенос файлов и сканирование делал, ошибок нет. Я думаю, что сколько времени я убил на решение проблемы, дешевле переустановить систему, так наверное и сделаю.
В общем спасибо Вам, я регулярно читаю Ваш блог и много полезного приобрёл.
С уважением Андрей.
Алексей
Здравствуйте, Вадим! Как запустить файл CheckBootSpeed.diagcab от имени администратора? При ПКМ на файле в контекстном меню нет запуска от имени Администратора.
Vadim Sterkin
Алексей, нужно войти с правами администратора, этого достаточно.
Айдар
Здравствуйте, Вадим! При первом запуске checkbootspeed, программа исправил какие-то проблемы и вывела отчет, но к сожалению при последующих попытках получить отчет, пишет, что модуль не выявил неполадок, и отчет не формирует. С чем это может быть связанно?
Vadim Sterkin
Айдар, удалите chekbootspeed.tmp из временной папки (%temp%).
Корен Норен
Здравствуйте,не могу открыть файл от имени администратора, появляется строка с файлами через которые можно открыть.Но это программа не через какие программы не открывается.
У меня стоит Windows Xp что мне делать?Скажите пожалуйста.
Зарание благодарен!
Vadim Sterkin
http://forum.oszone.net/forum-6.html