Показаны сообщения с ярлыком Производительность. Показать все сообщения
Показаны сообщения с ярлыком Производительность. Показать все сообщения

воскресенье, 9 октября 2011 г.

WSRM и память с точки зрения админа

Всем доброе время суток. Недавно столкнулся с windows system resource manager. Не то чтобы я раньше с ним не сталкивался. Просто как-то не задумывался над этим. Это средство позволяет, кроме всего прочего, задать некий набор ограничений процессам в операционной системе. В частности, возможно ограничение рабочего набора (working set), определенного процесса. В рамках этой заметки я хотел бы разобраться с тем, как это происходит. Не скрою, что в самый первый момент, когда я увидел, как срабатывает этот механизм – я удивился. Меня сразу затерзали сомнения.
Но все же, начнем. С небольшого теста. Используем программу testlimit, которую почему-то не распространяют с sysinternals suite. Это, кстати, тоже удивило меня, когда я попытался ее найти. Сначала настроим WSRM для нашего теста. Для этого нужно создать фильтр для приложения, в нашем случае это testlimit. А за тем – resource allocation policy, в которой мы и определим ограничения для процесса. Делаем вот таким образом:
1. Создаем новый фильтр
mem1mem2
2. Задаем новую политику выделения ресурсов, в которой задаем размер рабочего набора в 300МБ
mem3mem4
3. Активируем новую политику
mem5

Теперь запускаем приложение
mem6

Прежде всего следующая командная строка: Testlimit.exe -d 10 -c 100, выделяет 1 Гб памяти, и коснется ее, заставив систему предоставить реальную оперативную память приложению. Подробности об этом процессе смотрите вот тут. Как видно из скриншота – это и происходит. Размер рабочего набора – 1Гб. Но это длится всего несколько секунд. Затем происходит “странное”:
mem7

Бабах! Размер рабочего набора уменьшился до 300 МБ, заданных в настройках WSRM. Возникает вопрос – куда делать память? А что если в ней были данные? И как приложения отреагируют на такое поведение? Не станут ли они вдруг падать?
Для того, чтобы ответить на эти вопросы я написал вот такой вот код. Не плюйтесь, я не разработчик а админ, посему код может быть и не красивый:
// memtest1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <Windows.h>


int _tmain(int argc, _TCHAR* argv[])
{
    char *a = (char*) malloc(1024*1024*1024);
    for (int k = 0; k<=100; ++k)    {
        for (int i = 0; i<=1024*1024*1024-1; ++i){
            a[i] = 'a';}
        
        std::cout << "allocated" << k << std::endl;
        Sleep (1000);
    }
    int g;
    std::cin >> g;
    return 0;
}

Данный код просто выделяет память, и активно ее использует – попросту пишет в нее. Теперь создаем новый фильтр,новую политику и запускаем приложение. После урезания рабочего набора приложение продолжает работать, как, собственно и ожидалось. Куда же оно пишет?

Для выяснения этого эпизода воспользуемся приложением RAMMap. Запускаем его и, сразу после запуска приложения testlimit видим следующую картинку:

до урезания
mem8

после урезания
mem9

Видим список активных страниц, и его размер в 3.5 ГБ. И, собственно Private Bytes  - 2.2 ГБ. Через некоторое время, когда сработает WSRM видим совсем другую картину. Размер памяти в списке активных страниц уменьшился на примерно 700МБ, а объем памяти обнуленных страниц вырос на эту цифру.  Итого, память не провалилась и никуда не исчезла, система переместила страницы из списка в список, предоставив при этом возможность другим приложениям употребить эту память. Однако есть один интересный момент. Testlimit не использует память а просто выделяет ее. Что будет, если эта память будет активно использоваться? Вернемся к моему тестовому коду для этого, и посмотрим, что покажет RAMMap. А показывает он вот что:

до урезания
mem10

после урезания
mem11

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

mem13mem14

Сразу после урезания начинается подкачка. Таким образом, использование этого функционала, это не только возможность ограничить различные приложения размером рабочего набора, что может быть полезно, к примеру на терминальных серверах. Это еще и своего рода размен памяти на дисковые операции. Посему – есть смысл тщательно подумать над применением этого инструмента.

четверг, 12 августа 2010 г.

Базовый мониторинг производительности Windows

Эти счетчики можно использовать для базового мониторинга всех рабочих станций и серверов в Windows окружении.

\Processor\% Processor Time
Основной показатель активности. Однако если наблюдать за ним, то делать это надо часто, допустим раз в секунду. Сам по себе ничего не показывает, однако если параллельно изменяются % Privileged Time или Processor Queue Length, есть смысл задуматься и понаблюдать более пристально при помощи специальных утилит.

\Processor\% Privileged Time
Показывает процентное время работы процессора в режиме ядра. В нормальном режиме это значение не должно быть высоким.
Постоянное значение более 75% говорит о проблеме

\Processor(_Total)\% User Time
Показывает процентное время работы процессора в пользовательском режиме. Это основной режим работы.

\Processor\% DPC Time
Показывает процентное время, затраченное процессором на обработку отложенных вызовов. Большие значения указывают на аппаратные проблемы, или проблемы с драйверами. Обычно этот показатель не превышает 5%. Если это значение, или выше, сохраняется длительное время - это индикатор проблемы.

\Processor(*)\% Interrupt Time
    Этот счетчик показывает процентное время, которое процессор затрачивает на обработку аппаратных прерываний. Большие значения счетчика говорят о проблеме в драйвере или аппаратных проблемах. Обычно не превышает нескольких процентов в очень короткое время.



\System\System Up Time 
Тут все ясно. Время с последней перезагрузки. Короткое время может показывать на частые перезагрузки.


\System\Processor Queue Length
Основным объектом исполнения кода являются потоки. Они же являются основным потребителем ресурсов процессора. Очередь процессора это потоки, ожидающие, пока процессор освободится. После выполнения очередного потока система передает процессор следующему из очереди. Таким образом очередь постоянной длиной в два и более потоков сигнализирует о повышеной нагрузке на процессор. Однако при анализе нужно учитывать и счетчик Processor\% Processor Time. Если его значения не высоки при наличии очередей, то это означает проблему в логике самих потоков. Это справедливо так же и для многопроцессорных систем.


\System\Context Switches/sec
    Переключение контекста происходит, когда ядро переключает процессор с одного потока на другой. В частности, это происходит если поток с более высоким приоритетом переходит в состояние готовности или рабочий поток переходит в режим ожидания операций ввода/вывода. Обычно, большие значения могут говорить о том, что в системе существует слишком много потоков.


\Memory\Pages/sec
Достаточно хитрый счетчик. Он показывает, сколько страниц в сек было прочитано или записано в рамках обработки страничного прерывания. Это прерывание возникает тогда, когда искомая страница памяти оказывается выгруженой на диск в данный момент. Однако в этот счетчик попадают так же и рабочие ситуации связанные с кэшем и memory-mapped файлами. По этому по нему нельзя однозначно сказать о недостатке памяти.


\Memory\Page Reads /sec
Счетчик, который можно использовать в дополнение к предыдущему. Он показывает сколько операций чтения в единицу времени, безотносительно к страницам, было сделано при обработке страничных прерываний.


Memory\Pages Input/sec
Количество страниц, прочитанных с диска, в рамках обработки страничных прерываний.


Memory\Page Reads/sec
Количество страниц, записанных на диск, в рамках обработки страничных прерываний.


\Memory\ Cache Faults
Счетчик учитывает промахи системного кэша.
Таким образом, если \Memory\Pages/sec, \Memory\Page Reads /sec,  Memory\Pages Input/sec, Memory\Page Reads/sec постоянно находятся на высоком уровне, а \Memory\Cache Faults на низком, то можно предположить, что операционная система активно работает с файлом подкачки, что, в свою очередь, сигнализирует о недостатке памяти. Однако, если \Memory\Cache Faults тоже высок, то скорее всего ситуация вызвана активной работой с большими файлами, отображаемыми в память. Такое поведение не должно длиться долго.


\Memory\Available MBytes
Количество доступной процессам физической памяти. Уменьшение счетчика, сопровождаемое ростом \Memory\Pages/sec и \Memory\Page Reads /sec может сигнализировать о недостатке памяти. Постоянное и равномерное уменьшение счетчика указывает на утечку памяти в одном из приложений.


Memory\Transition Faults/sec
Значение это счетчика показывает скорость, с которой обрабатываются так называемые soft faults - ошибки страниц, для разрешения которых не нужны обращения к диску. Количество Transition Faults равно количеству таких страниц.


\LogicalDisk(*)\% Free Space
Счетчик, показывающий процент свободного места на логических дисках.


LogicalDisk|PhysicalDisk\Avg. Disk Queue Length
Счетчик следит за количеством запросов, стоящих в очереди к диску. Считается, что, если очередь к диску длительное время более двух - это может быть индикатором проблемы.