Модернизация приложений. Часть 3
Доступ к данным WinSAT через WMI
В предыдущих статьях данного цикла мы начали обсуждение средств, входящих в состав операционной системы Windows, которые позволяют определять состояние памяти, задач, процессов, следить за производительностью, событиями, вычислять индекс производительности и получать данные из различных подсистем. В настоящей статье мы завершим обсуждение данной категории инструментов.
Утилита WinSAT и индекс WinEI
Для измерения общей производительности ключевых компонентов системы можно также использовать утилиту командной строки WinSAT (Windows System Assessment Tool). Данные, собираемые этой утилитой, лежат в основе Windows Experience Index (WinEI) — индекса производительности системы, отображаемого в панели управления в разделе Performance Information and Tools (рис. 1).
Рис. 1. Windows Experience Index
Для каждого компьютера рассчитывается базовый индекс, который может варьироваться в диапазоне от 1.0 до 7 (в Windows Vista индекс мог быть не более 5.9). Измерения проводятся в пяти группах: скорость процессора (CPU Assessment), памяти (Memory Assessment), графической подсистемы (DWM Assessment), игровой графики и мультимедиа (D3D Graphics Assessment, Media Assessment) и диска (Disk Assessment) — самый меньший индекс присваивается всей системе.
Полученные в результате измерения данные (а измерение в обязательном порядке проводится после установки операционной системы) применяются для определения того, какие компоненты системы, например Aero, будут активированы и, при необходимости, могут считываться приложениями для более точной настройки — интерфейса, графических возможностей и т.п. Утилита запускается командой WinSAT.exe (%windir%\System32\WinSAT.exe) и использует библиотеку WinSATAPI.dll.
Отдельные тесты могут быть запущены указанием соответствующего параметра командной строки. Например, команда
C:\>winsat disk –seq –read –n 0
выполнит измерение производительности диска 0 в тесте на последовательное чтение.
Помимо индивидуальных тестов WinSAT может выполнить описанную ранее общую оценку системы с предопределенными параметрами и сохранить результат в XML-файле. Результаты всех базовых тестов располагаются в каталоге %WinDir%\Performance\WinSAT, а файлы результатов выполнения отдельных тестов — в каталоге %WinDir%\Performance\WinSAT\DataStore. Изначальный результат измерения системы находится в файле YYYY-MM-DD HH.MM.SS.MSS Formal Assessment (Initial).WinSAT.XML, а результат самого последнего измерения системы — в файле YYYY-MM-DD HH.MM.SS.MSS Formal Assessment (Recent).WinSAT.XML, где и в том, и в другом случае первая группа в имени файла указывает дату и время создания отчета.
Для выполнения общей оценки системы следует выполнить команду, приведенную на рис. 2.
Рис. 2. Выполнение теста общей оценки системы
C:\>winsat formal
Давайте рассмотрим каждый групповой тест и узнаем, что и как в нем измеряется и как можно использовать полученные данные.
Процессор
Тест процессора включает несколько операций, и результат каждой из них отображается отдельно. Применяются два типа нагрузочных тестов — шифрование и сжатие.
В случае шифрования выделяются два буфера — источник и приемник указанного размера, и при этом источник заполняется случайными данными. Далее с помощью стандартных функций Win32 Cryptographic APIs — CryptEncrypt() и CryptDecrypt() — данные шифруются и расшифровываются. При тестировании с помощью Read Time Stamp Counter (RDTSC) измеряется время обеих операций.
В случае сжатия также выделяется два буфера — источник и приемник указанного размера, но источник заполняется определенными данными. Далее используются функции RtlCompressBuffer() и RtlDecompressBuffer(), применяющие алгоритм сжатия LZNT1 — тот же, что используется файловой системой NTFS. Содержимое источника сжимается в приемник, а затем содержимое приемника распаковывается в источник. При тестировании с помощью Read Time Stamp Counter (RDTSC) измеряется время обеих операций.
Для выполнения теста процессора используйте команду
C:\>winsat cpuformal
В Windows Vista результаты тестирования процессора делятся на три категории:
- 2.0-4.7 — одноядерный процессор с частотой порядка 850 МГц типа K7 или P4;
- 4.8 и выше — стандартный двухъядерный процессор;
- до 5.8 — высокопроизводительный двухъядерный процессор.
- В Windows 7 диапазон индексов процессора расширен для поддержки 8- и 16-ядерных процессоров. Добавлены следующие категории:
- до 5.9 — системы с одним или двумя физическими ядрами;
- 6.0-6.5 — высокопроизводительный двухъядерный процессор;
- 6.5-6.9 — новые процессоры AMD Phenom X3 с тремя ядрами;
- выше 7 — четырехъядерные процессоры;
- 7.9 — новые процессоры AMD Opteron с шестью ядрами (рис. 3).
Как и в случае с графикой (табл. 1), диапазоны индексов процессора указывают на его применимость для решения тех или иных задач.
Таблица 1. Индексы процессора
Индекс |
Описание |
< 2.0 |
Очень медленный процессор, не подходящий для нормальной работы Windows 7 |
2.02.9 |
Можно выполнять отдельные задачи: чтение почты, просмотр web, редактирование документов. Для такого класса процессоров даже базовые задачи могут вызывать его повышенную утилизацию. Многозадачная работа может приводить к заметным задержкам |
3.03.9 |
Можно выполнять основные задачи в многозадачном режиме |
4.049 |
Подходит для выполнения большинства задач |
5.05.9 |
Подходит для выполнения большинства задач, позволяет использовать многоядерные системы для работы с Excel, обработки изображений, компилирования кода. Подходит для большинства компьютерных игр |
6.06.9/7.07.9 |
Компьютерные системы с такими индексами могут применяться для многозадачного выполнения любых задач: обработки электронных таблиц большого объема, рендеринга графики, научных расчетов и т.п. |
Рис. 3. Выполнение теста процессора
Память
Производительность памяти является одним из ключевых факторов, определяющих производительность всей системы и оптимальное выполнение компьютерных игр, программ редактирования и обработки фото- и видеоматериалов, а также выполнения других вычислительных задач. Тест памяти вычисляет ее пропускную способность, выполняя последовательность операций копирования из буфера в буфер (рис. 4).
Рис. 4. Выполнение теста памяти
В Windows Vista использовались правила назначения индексов производительности памяти в зависимости от объема установленной в системе памяти. В Windows 7 набор правил расширен — правила для Windows Vista и Windows 7 приведены в табл. 2.
Таблица 2. Индексы производительности памяти для Windows Vista и Windows 7
Индекс |
Описание |
До 1.0 |
Общий объем памяти <= 256 Мбайт |
До 2.0 |
Общий объем памяти <= 500 Мбайт (51210 Мбайт) |
До 2.9 |
Общий объем памяти <= 512 Мбайт |
До 3.5 |
Общий объем памяти < 704 Мбайт (76864 Мбайт) |
До 3.9 |
Общий объем памяти < 944 Мбайт (1 Гбайт80 Мбайт) |
До 4.5 |
Общий объем памяти < 1,5 Гбайт |
До 5.5 |
Общий объем памяти < 3 Гбайт |
До 5.9 |
Общий объем памяти < 4 Гбайт (только для 64битных систем) |
Диск
Тестирование производительности диска в Windows Vista проводилось на основе теста последовательной записи. Этого было достаточно для базовой проверки механических дисков, но с появлением SSD-дисков потребовалось расширить набор тестов. В Windows 7 были добавлены следующие тесты:
- случайное чтение всего диска;
- проверка сброса данных на диск;
- проверка производительности гибридных устройств с NVRAM (рис. 5).
Общие правила присвоения индексов производительности в Windows 7 представлены в табл. 3.
Таблица 3. Индексы производительности жестких дисков в Windows 7
Индекс |
Описание |
2.93.9 |
Системы с низкой скоростью записи буферов на диск независимо от результатов выполнения других тестов |
5.05.9 |
Диски с хорошим последовательным чтением и хорошей скоростью записи буферов на диск |
6.06.5 |
Диски с высокой скоростью или SSDдиски |
7.07.5 |
Только для SSDдисков |
7.67.9 |
Зарезервировано |
Рис. 5. Выполнение теста диска
Графическая подсистема
Тестирование графической подсистемы осуществляется проверкой функциональных возможностей видеокарты для поддержки Desktop Window Manager (DWM). В наше время многие графические карты оптимизированы для игровых сценариев, при том что бизнес-приложения не имеют столь высоких требований, как компьютерные игры. Кроме того, большинство индустриальных тестов неприменимо для тестирования бизнес-сценариев.
Таким образом, включение в состав измерения системы теста выполнения бизнес-сценариев (рис. 6) позволяет получить индекс графической подсистемы относительно DWM и, в частности, ответить на такой популярный вопрос: «Почему я не могу включить подсистему Aero?»
Рис. 6. Тестирование графической подсистемы
В Windows 7 DWM использует функции DirectX10, поэтому тестирование графической подсистемы теперь поддерживает тесты для DirectX10. Результаты этих тестов показывают, насколько система поддерживает композитный рабочий стол (desktop composition) и используется DWM для принятия решения о включении или отключении подсистемы Aero. Результаты могут быть распределены по группам, представленным в табл. 4.
Таблица 4. Индексы производительности графической подсистемы в Windows 7
Индекс |
Описание |
<2.0 |
Система не поддерживает композитный рабочий стол |
2.02.9 |
Базовая поддержка композитного рабочего стола |
3.03.9 |
Поддержка композитного рабочего стола с разрешением |
4.04.9 |
Поддержка композитного рабочего стола с разрешением до 1600х1200 на двух мониторах |
>5.0 |
Мультимониторная поддержка |
>6.0 |
Мультимониторная поддержка и возможность воспроизведения видео с высоким разрешением |
Игровая графика
Тестирование игровой графики позволяет измерить производительность системы при выполнении сценариев трехмерных игр. Цели проверки заключаются в нагрузочном тестировании графической подсистемы и проверке корректной работы драйверов графических карт. Выполняются следующие четыре основных теста: Batch Limited — отрисовка большого количества небольших объектов с целью проверки драйвера, Fill-rate Memory Limited — проверка возможности читать и записывать данные из памяти, Fill-rate Shader Limited — текстурная отрисовка, проверка вычислительных возможностей и Fill-rate Shader Limited — проверка вычислительных возможностей.
Также для проверки игровой графики выполняются различные мультимедийные тесты, включающие проверку воспроизведения видео и использования различных декодеров (только в Windows 7 — тест MediaEx, рис. 7).
Рис. 7. Тестирование игровой графики
Результаты тестирования графических возможностей разделяются на несколько групп — для адаптеров с поддержкой DirectX 9 индекс ограничивается числом 5.9, DirectX 10 требует более высокого индекса. Результаты могут быть распределены по группам согласно табл. 5.
Таблица 5. Индексы, характеризующие мультимедийные возможности
Индекс |
Описание |
<2.0 |
Система не поддерживает DirectX 9/DirectX 10 |
2.05.9 |
Присваивается в тех случаях, когда тесты для DirectX 10 показали более низкую, по сравнению с тестами для DirectX 9, производительность |
4.04.9 |
Поддержка DirectX 10 с FPS 2030 в режиме Windows при включенной композиции рабочего стола. В эту категорию попадают адаптеры, которые не поддерживают режим 1280х1024 с нормальным FPS, но нормально работают в режимах 800х600 и 1024х768 |
5.05.9 |
Основная производительность для DirectX 10, FPS 2040 при разрешении 1280х1024 |
6.06.9 |
Отличная производительность для DirectX 10, FPS 4050 при разрешении 1280х1024 |
>7.0 |
Исключительная производительность для DirectX 10, FPS >60 при разрешении 1280х1024 |
При измерении мультимедийных возможностей учитывается поддержка воспроизведения видеоклипов разного формата: WMV, MPEG-2 и H.264 в режиме High Definition. Результаты могут быть распределены по группам согласно табл. 6.
Таблица 6. Индексы, характеризующие поддержку воспроизведения видеоклипов
Индекс |
Описание |
<5.0 |
Система не поддерживает воспроизведение HDвидео |
5.0+ |
Система поддерживает базовое воспроизведение HDвидео |
6.0+ |
Система поддерживает воспроизведение HDвидео |
Программные интерфейсы WinSAT
Начиная с операционной системы Windows Vista у разработчиков появилась возможность использовать программные интерфейсы WinSAT для запуска отдельных тестов и получения результатов уже проведенных тестов. Программные интерфейсы описаны в заголовочном файле WinSATComInterfaceI.h и реализованы в библиотеке WinSATAPI.dll (%windir%\system32\WinSATAPI.dll).
Для запуска формального измерения системы служит метод InitialFormalAssessment интерфейса IInitiateWinSATAssessment. Результаты формального измерения сохраняются в стандартной папке и могут быть затем извлечены и обработаны. Для получения уведомлений о прогрессе измерения системы или о завершении процесса применяется интерфейс IWinSATInitiateEvents.
Для получения результатов общего тестирования системы и ее отдельных компонентов используются соответствующие программные интерфейсы. Общий индекс системы может быть получен с помощью метода IQueryRecentWinSATAssessment::get_Info, возвращающего интерфейс IProvideWinSATResultsInfo. Затем вызывается метод IProvideWinSATResultsInfo::get_SystemRating, возвращающий общий индекс системы.
Для получения индекса отдельных компонентов сначала вызывается метод IQueryRecentWinSATAssessment::get_Info, возвращающий интерфейс IProvideWinSAT-ResultsInfo. Затем для каждого компонента вызывается метод IProvideWinSATAssessmentInfo::get_Score.
Для доступа к информации, сохраненной в XML-файлах (посредством опции командной строки –xml), следует применять метод IQueryRecentWinSATAssessment::get_XML, возвращающий детали общего измерения системы, и метод IQueryAllWinSATAssessments::get_AllXML для доступа к результатам для отдельных компонентов. XML-схема описана в MSDN по адресу: http://msdn.microsoft.com/en-us/library/aa969210(VS.85).aspx.
В листинге показано, как с помощью программных интерфейсов WinSAT выполнить измерение системы и получить уведомление о прогрессе выполнения тестов:
#include <windows.h>
#include <stdio.h>
#include <conio.h> // для kbhit()
#include <winsatcominterfacei.h>
#pragma comment(lib, "ole32.lib")
// Класс, реализующий IWinSATInitiateEvents. Используется
// для получения информации о прогрессе и завершении тестов
class CWinSATCallbacks : public IWinSATInitiateEvents
{
LONG m_lRefCount;
public:
CWinSATCallbacks() {m_lRefCount = 1;};
~CWinSATCallbacks() {};
HRESULT __stdcall QueryInterface(REFIID riid, LPVOID *ppvObj);
ULONG __stdcall AddRef();
ULONG __stdcall Release();
HRESULT __stdcall WinSATComplete(HRESULT hr, LPCWSTR description);
HRESULT __stdcall WinSATUpdate(UINT currentTick, UINT tickTotal,
LPCWSTR currentState);
};
HRESULT CWinSATCallbacks::QueryInterface(REFIID riid, LPVOID* ppvObj)
{
if (riid == __uuidof(Iunknown) ||
riid == __uuidof(IWinSATInitiateEvents))
{
*ppvObj = this;
}
else
{
*ppvObj = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
ULONG CWinSATCallbacks::AddRef()
{
return InterlockedIncrement(&m_lRefCount);
}
ULONG CWinSATCallbacks::Release()
{
ULONG ulCount = InterlockedDecrement(&m_lRefCount);
if(0 == ulCount)
{
delete this;
}
return ulCount;
}
// Вызывается при завершении работы WinSAT или возникновении ошибки
HRESULT CWinSATCallbacks::WinSATComplete(HRESULT hr, LPCWSTR description)
{
if (SUCCEEDED(hr))
{
wprintf(L"\n*** %s", description);
}
else
{
wprintf(L"\n*** Ошибка выполнения. Код 0x%x (%s)\n",
hr, description);
}
return S_OK;
}
// Вызывается для отображения прогресса
HRESULT CWinSATCallbacks::WinSATUpdate(UINT currentTick, UINT tickTotal, LPCWSTR currentState)
{
If (tickTotal > 0)
{
wprintf(L"\n*** Процесс выполнения: %u%%\n", 100*currentTick/tickTotal);
wprintf(L"*** Выполняемый тест: %s\n\n", currentState);
}
return S_OK;
}
void main(void)
{
HRESULT hr = S_OK;
IInitiateWinSATAssessment* pAssessment = NULL;
CWinSATCallbacks* pCallbacks = NULL;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
hr = CoCreateInstance(__uuidof(CInitiateWinSAT),
NULL,
CLSCTX_INPROC_SERVER,
__uuidof(IInitiateWinSATAssessment),
(void**)&pAssessment);
if (FAILED(hr))
{
wprintf(L"Ошибка создания экземпляра IInitiateWinSATAssessment.
Код 0x%x.\n", hr);
goto cleanup;
}
wprintf(L"Выполнение тестирования.\n");
pCallbacks = new CWinSATCallbacks();
if (NULL == pCallbacks)
{
wprintf(L" Ошибка создания экземпляра CWinSATCallbacks.\n");
goto cleanup;
}
hr = pAssessment->InitiateFormalAssessment(pCallbacks, NULL);
if (FAILED(hr))
{
wprintf(L"Ошибка InitiateFormalAssessment. Код 0x%x.\n", hr);
goto cleanup;
}
while (!_kbhit())
Sleep(10);
cleanup:
if (pAssessment)
pAssessment->Release();
if (pCallbacks)
pCallbacks->Release();
CoUninitialize();
}
В листинге показан пример использования программных интерфейсов WinSAT из управляемого кода на языке C#:
Namespace WinSATDemo
{
class Program
{
[STAThread]
static void Main()
{
CQueryWinSATClass q = new CQueryWinSATClass();
if (q.Info.AssessmentState ==
WINSAT_ASSESSMENT_STATE.WINSAT_ASSESSMENT_STATE_VALID
|| q.Info.AssessmentState ==
WINSAT_ASSESSMENT_STATE.WINSAT_ASSESSMENT_STATE_INCOHERENT_WITH_HARDWARE)
{
string format = "{0,-18} {1,-56} {2:N1}";
string seperator = String.Format(format, new string(‘-‘, 18), new
string(‘-‘, 56), new string(‘-‘, 3));
Console.WriteLine("{0} on {1}", q.Info.RatingStateDesc,
q.Info.AssessmentDateTime);
Console.WriteLine();
Console.WriteLine(format, "Категория", "Описание", "Индекс");
Console.WriteLine(seperator);
Ienumerator e =
Enum.GetValues(typeof(WINSAT_ASSESSMENT_TYPE)).GetEnumerator();
while (e.MoveNext())
{
IProvideWinSATAssessmentInfo I =
q.Info.GetAssessmentInfo((WINSAT_ASSESSMENT_TYPE)e.Current);
Console.WriteLine(format, i.Title, i.Description, i.Score);
}
Console.WriteLine(seperator);
Console.WriteLine(format, "Базовый индекс",
"Определенный как низший в наборе", q.Info.SystemRating);
}
}
}
}
Доступ к данным WinSAT через WMI
Для доступа к основным данным WinSAT через Windows Management Instrumentation (WMI) следует использовать класс Win32_WinSAT, который описывается следующей структурой:
class Win32_WinSAT
{
string TimeTaken;
real32 WinSPRLevel;
uint32 WinSATAssessmentState;
real32 MemoryScore;
real32 CPUScore;
real32 DiskScore;
real32 D3Dscore;
real32 GraphicsScore;
};
Описание свойств класса Win32_WinSAT приведено в табл. 7.
Таблица 7. Описание свойств класса Win32_WinSAT
Свойство |
Описание |
CPUScore |
Индекс производительности центрального процессора |
D3Dscore |
Индекс для трехмерной (игровой) графики |
DiskScore |
Индекс для операций последовательного чтения с диска |
GraphicsScore |
Индекс графической подсистемы компьютера |
MemoryScore |
Индекс производительности оперативной памяти |
TimeTaken |
При обращении к характеристикам WinSAT необходимо использовать значение MostRecentAssessment |
WinSATAssessmentState |
Одно из следующих значений: 0 — StateUnknown; 1 — Valid; 2 — IncoherentWithHardware; 3 — NoAssessmentAvailable; 4 — Invalid |
WinSPRLevel |
Базовый индекс для компьютера |
В PowerShell выполнение команды
PS>Get-WmiObject Win32_WinSAT
отображает данные, показанные на рис. 8.
Рис. 8. Отображение данных с помощью команды Get-WmiObject Win32_WinSAT
***
В этой и двух предыдущих статьях мы ознакомились с рядом утилит, входящих в состав операционной системы и позволяющих получить основные характеристики системы, включая ее настройки, данные о производительности и т.п. Мы также получили представление о базовых возможностях скриптовой программы PowerShell и рассмотрели, как работает утилита WinSAT, вычисляющая производительность системы.
В следующей публикации мы поговорим об обеспечении стабильной работы приложений, приведем ряд рекомендаций и обсудим различные механизмы, предоставляемые операционной системой.