Модернизация приложений. Часть 3

Алексей Федоров (сотрудник российского представительства компании Microsoft (alexeif@microsoft.com))

Утилита WinSAT и индекс WinEI

Процессор

Память

Диск

Графическая подсистема

Программные интерфейсы WinSAT

Доступ к данным WinSAT через WMI

 

В предыдущих статьях данного цикла мы начали обсуждение средств, входящих в состав операционной системы Windows, которые позволяют определять состояние памяти, задач, процессов, следить за производительностью, событиями, вычислять индекс производительности и получать данные из различных подсистем. В настоящей статье мы завершим обсуждение данной категории инструментов.

Утилита WinSAT и индекс WinEI

Для измерения общей производительности ключевых компонентов системы можно также использовать утилиту командной строки WinSAT (Windows System Assessment Tool). Данные, собираемые этой утилитой, лежат в основе Windows Experience Index (WinEI) — индекса производительности системы, отображаемого в панели управления в разделе Performance Information and Tools (рис. 1).

 

Рис. 1. Windows Experience Index

Рис. 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. Выполнение теста общей оценки системы

Рис. 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.0­2.9

Можно выполнять отдельные задачи: чтение почты, просмотр web, редактирование документов. Для такого класса процессоров даже базовые задачи могут вызывать его повышенную утилизацию. Многозадачная работа может приводить к заметным задержкам

3.0­3.9

Можно выполнять основные задачи в многозадачном режиме

4.0­4­9

Подходит для выполнения большинства задач

5.0­5.9

Подходит для выполнения большинства задач, позволяет использовать многоядерные системы для работы с Excel, обработки изображений, компилирования кода. Подходит для большинства компьютерных игр

6.0­6.9/7.0­7.9

Компьютерные системы с такими индексами могут применяться для многозадачного выполнения любых задач: обработки электронных таблиц большого объема, рендеринга графики, научных расчетов и т.п.

Рис. 3. Выполнение теста процессора

Рис. 3. Выполнение теста процессора

В начало В начало

Память

Производительность памяти является одним из ключевых факторов, определяющих производительность всей системы и оптимальное выполнение компьютерных игр, программ редактирования и обработки фото- и видеоматериалов, а также выполнения других вычислительных задач. Тест памяти вычисляет ее пропускную способность, выполняя последовательность операций копирования из буфера в буфер (рис. 4).

 

Рис. 4. Выполнение теста памяти

Рис. 4. Выполнение теста памяти

В Windows Vista использовались правила назначения индексов производительности памяти в зависимости от объема установленной в системе памяти. В Windows 7 набор правил расширен — правила для Windows Vista и Windows 7 приведены в табл. 2.

 

Таблица 2. Индексы производительности памяти для Windows Vista и Windows 7

Индекс

Описание

До 1.0

Общий объем памяти <= 256 Мбайт

До 2.0

Общий объем памяти <= 500 Мбайт (512­10 Мбайт)

До 2.9

Общий объем памяти <= 512 Мбайт

До 3.5

Общий объем памяти < 704 Мбайт (768­64 Мбайт)

До 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.9­3.9

Системы с низкой скоростью записи буферов на диск независимо от результатов выполнения других тестов

5.0­5.9

Диски с хорошим последовательным чтением и хорошей скоростью записи буферов на диск

6.0­6.5

Диски с высокой скоростью или SSD­диски

7.0­7.5

Только для SSD­дисков

7.6­7.9

Зарезервировано

 

Рис. 5. Выполнение теста диска

Рис. 5. Выполнение теста диска

В начало В начало

Графическая подсистема

Тестирование графической подсистемы осуществляется проверкой функциональных возможностей видеокарты для поддержки Desktop Window Manager (DWM). В наше время многие графические карты оптимизированы для игровых сценариев, при том что бизнес-приложения не имеют столь высоких требований, как компьютерные игры. Кроме того, большинство индустриальных тестов неприменимо для тестирования бизнес-сценариев.

Таким образом, включение в состав измерения системы теста выполнения бизнес-сценариев (рис. 6) позволяет получить индекс графической подсистемы относительно DWM и, в частности, ответить на такой популярный вопрос: «Почему я не могу включить подсистему Aero?»

 

Рис. 6. Тестирование графической подсистемы

Рис. 6. Тестирование графической подсистемы

В Windows 7 DWM использует функции DirectX10, поэтому тестирование графической подсистемы теперь поддерживает тесты для DirectX10. Результаты этих тестов показывают, насколько система поддерживает композитный рабочий стол (desktop composition) и используется DWM для принятия решения о включении или отключении подсистемы Aero. Результаты могут быть распределены по группам, представленным в табл. 4.

 

Таблица 4. Индексы производительности графической подсистемы в Windows 7

Индекс

Описание

<2.0

Система не поддерживает композитный рабочий стол

2.0­2.9

Базовая поддержка композитного рабочего стола
на одном мониторе. Не рекомендуется использовать
такие функции,
как Flip­3D, thumbnails и Win­Tab

3.0­3.9

Поддержка композитного рабочего стола с разрешением
до 1900­1200 на одном мониторе

4.0­4.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. Тестирование игровой графики

Рис. 7. Тестирование игровой графики

Результаты тестирования графических возможностей разделяются на несколько групп — для адаптеров с поддержкой DirectX 9 индекс ограничивается числом 5.9, DirectX 10 требует более высокого индекса. Результаты могут быть распределены по группам согласно табл. 5.

 

Таблица 5. Индексы, характеризующие мультимедийные возможности

Индекс

Описание

<2.0

Система не поддерживает DirectX 9/DirectX 10

2.0­5.9

Присваивается в тех случаях, когда тесты для DirectX 10 показали более низкую, по сравнению с тестами для DirectX 9, производительность

4.0­4.9

Поддержка DirectX 10 с FPS 20­30 в режиме Windows при включенной композиции рабочего стола. В эту категорию попадают адаптеры, которые не поддерживают режим 1280х1024 с нормальным FPS, но нормально работают в режимах 800х600 и 1024х768

5.0­5.9

Основная производительность для DirectX 10, FPS 20­40 при разрешении 1280х1024

6.0­6.9

Отличная производительность для DirectX 10, FPS 40­50 при разрешении 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

Рис. 8. Отображение данных с помощью команды Get-WmiObject Win32_WinSAT

***

В этой и двух предыдущих статьях мы ознакомились с рядом утилит, входящих в состав операционной системы и позволяющих получить основные характеристики системы, включая ее настройки, данные о производительности и т.п. Мы также получили представление о базовых возможностях скриптовой программы PowerShell и рассмотрели, как работает утилита WinSAT, вычисляющая производительность системы.

В следующей публикации мы поговорим об обеспечении стабильной работы приложений, приведем ряд рекомендаций и обсудим различные механизмы, предоставляемые операционной системой.

В начало В начало

КомпьютерПресс 03'2011