admin / 27.02.2018

Длина очереди диска

.

11.4.9. Счетчики для анализа производительности дисковой подсистемы

Анализ загрузки диска средствами Системного монитора, Процент загрузки диска (% Disk Time), Текущая длина очереди диска (Current Disk Queue Length), % Активности диска при чтении (% Disk Read Time) и % Активности диска при записи (% Disk Write Time)

Третья подсистема, мониторинг которой имеет смысл производить для сервера SQLServer 2005, — это дисковая подсистема. Она считается главной с точки зрения производительности для задач DataWarehousing, т. е. для хранилищ данных. Объяснение достаточно простое — по сравнению с обычными системами OLTP, наиболее распространенная операция в системах DataWarehouse — это полное сканирование всей таблицы. Операции изменения данных в системах DataWarehouse также очень редки. Поэтому роль кэша в них, в отличие от систем OLTP, невелика, а вот требования к дискам предъявляются намного серьезнее.

По опыту практической работы можно отметить, что и для систем OLTP именно увеличение скорости работы дисковой подсистемы дает наибольший эффект.

Главный счетчик для дисковой подсистемы — Процент загрузки диска (% Disk Time) для объекта Логический диск (Logical Disk) или Физический диск (Physical Disk). Объект Логический диск удобнее, поскольку информация показывается по разделам, но он почему-то не всегда доступен. Пороговое значение для этого счетчика формулируется так: в течение продолжительного промежутка времени значение не должно приближаться к 100%. Если дисковая подсистема постоянно загружена почти на 100%, то очевидно, что она является узким местом системы и ее надо заменить. Если вы не уверены, что за активность дисковой подсистемы ответственен именно SQLServer, имеет смысл проверить значение счетчика Обмен данными, байт в секунду (I/O bytes/sec) для объекта Процесс (сравнить это значение для экземпляра SQLServer и объекта _Total).

Отметим лишь одну особенность счетчиков Процент загрузки диска для объектов Логический диск и Физический диск: они не всегда показывают точные значения при использовании RAID-массивов.

Форум Тринити

Так, в практической работе иногда можно увидеть значение этого параметра более 100%. Однако больших проблем это не создает: при нормальной нагрузке на дисковую подсистему среднее значение этого счетчика должно быть существенно ниже 50%.

Еще один счетчик, который можно использовать для проверки, — Текущая длина очереди диска (Current Disk Queue Length) для тех же объектов Физический диск и Логический диск.

Этот параметр показывает, сколько запросов стоит в очереди на обработку дисковой подсистемы. Его значение на протяжении длительного промежутка времени не должно превышать 2 для одного диска (если, например, в RAID-массиве находится 10 дисков, то среднее значение этого счетчика не должно быть больше 20).

Если вы не уверены, чем именно вызвана загрузка диска — операциями чтения или записи, то определить это помогут счетчики % Активности диска при чтении (% Disk Read Time) и % Активности диска при записи (% Disk Write Time) для объектов Физический диск и Логический диск.

Если узким местом системы является диск (а это случается очень часто), то вариантов решения может быть несколько. Самое простое и очевидное из них — обновить дисковую подсистему, например, купив новый RAID-массив. Однако большой выигрыш могут дать и другие, более дешевые варианты решения.

Очень часто лишние операции с диском возникают из-за проблем с индексами. Про оптимизацию системы индексов будет рассказываться далее в разд. 11.5.5.

Большое влияние на производительность и отказоустойчивость работы SQLServer оказывает распределение файлов по дискам сервера.

 

Какое нормальное значение счетчика «Средняя длина очереди диска»?

Всем доброго времени суток !

Уже описывал свою конфигурацию: сервер Win2K8 подключен к СХД Xyratex c 12-мя дисками SATA через FC-адаптеры 4Gb\s. На данной полке создано два RAID-5 массива по 5 дисков в каждом, 2 — в глобальном спейре.

Сервер (через ЛУН-маппинг) видит один из этих рейдов, на котором нарезаны LUNы для файлопомойки, итого в Windows видно 3 логических диска, физически расположенных на данной полке.
По рекомендации Microsoft параметр системного монитора "Текущая длина очереди диска" при нормальной производительности не должен превышать число шпинделей + 2, т.е. в моем случае этот парамет для логических дисков сервера на данной полке не должен превышеть: 5+2 = 7.
Когда начал мониторить — заметил, что примерно раз в 2-3 минуты, а то и чаще данный параметр подскакивает до 10, а то и выше, правда держится там не долго — меньше 1 секунды.
Правильно ли MS советует оценивать текущую длину очереди диска в случае вот таких LUNов на SAN ?
И в течении какого времени должно быть превышение данного параметра, чтобы это сигнализировало о том что дисковая система не справляется с нагрузкой ?

Добавление счетчиков

Для примера попробуем добавить счетчики производительности. Для начала удалите все используемые в данный момент счетчики. Для этого нужно выделить счетчик в области счетчиков и нажать клавишу Delete. После этого вызовите контекстное меню в любой из областей системного монитора и выберите команду Добавить счетчики. Это приведет к отображению диалогового окна, приведенного на рис. 11.2.

Рис. 11.2. Окно добавления счетчиков

С помощью данного окна можно определить, счетчики какого компьютера будут подключаться к консоли (локального или любого другого, подключенного к сети), определить устройство (список Объект), за работой которого вы будете следить, а также определить сами счетчики (переключатель Выбрать счетчики из списка) параметров работы устройства, которые будут отслеживаться. После выбора счетчика в правом окне можно выбрать экземпляр устройства, работа которого будет отслеживаться. На рис. 11.2 отображено только два экземпляра устройства — _Total и 0. Экземпляр 0 определяет первый процессор, установленный в системе, а экземпляр _Total определяет слежение за всеми процессорами, установленными на компьютере (при этом будет выводиться среднее арифметическое данных по работе процессоров). Если на компьютере установлен только один процессор, то экземпляр _Total эквивалентен экземпляру 0, но если бы компьютер содержал большее количество установленных процессоров, то присутствовали бы и другие экземпляры устройств: 1 — для второго процессора, 2 — для третьего процессора и т.д.

ПРИМЕЧАНИЕ

Если значение DWORD-параметра Disable Performance Counters, расположенного в ветви системного реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib, будет равно 1, то будет запрещено добавление счетчиков, а также работа с ActiveX-объектом Системный монитор. Если значение данного параметра будет равно 1, то список счетчиков просто-напросто будет пуст. Аналогичного результата можно добиться, если присвоить DWORD-параметру Updating той же ветви реестра значение, равное 0.

ВНИМАНИЕ

Название экземпляра Total можно изменить на любое другое. Для этого применяется параметр строкового типа TotalInstanceName, расположенный в ветви реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Perflib. При этом следует учитывать, что все счетчики, загруженные до изменения значения параметра TotalInstanceName, работать не будут.

 Если просмотреть список объектов, за которыми можно следить, а также количество различных счетчиков, реализованных для них, можно ужаснуться. Что же из этого многообразия выбрать? Частично решить этот вопрос вам поможет кнопка Объяснение, после выбора счетчика и нажатия которой перед вами отобразится диалоговое окно с описанием того, за чем же следит данный счетчик. Вам также могут помочь советы профессионалов, которые предлагают следить за следующими компонентами (если необходимо определить общий уровень производительности компьютера или устройства, которые пора улучшить) компьютера: Процессор, Память, Система и Физический диск. Вкратце рассмотрим наиболее интересные счетчики данных устройств.

ПРИМЕЧАНИЕ

В любом случае, здесь не будут рассмотрены все объекты, счетчики которых можно использовать, так как количество объектов на различных компьютерах может быть разное. Это связано с тем, что любая служба может добавить свои собственные счетчики. Для этого достаточно в параметре строкового типа Library указать библиотеку, содержащую функции работы с новыми счетчиками. Параметр расположен в разделе Performance ветви реестра, хранящей сведения о данной службе (на страницах книги уже несколько раз упоминалось, что настройки служб находятся в отдельных разделах ветви реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services).

Повышенная нагрузка на диски сервера баз данных SQL Server

Можно также удалить возможность работы со счетчиками данного объекта, просто удалив раздел Performance (или переименовав его). Но можно поступить и намного проще — просто запретить работу счетчиков данного объекта. Для этого необходимо в разделе Performance данной службы создать DWORD-параметр Disable Performance Counters и присвоить ему значение 1.

Основные параметры раздела Performance неинтересны и содержат названия функций библиотеки для работы со счетчиками.

Для процессора это следующие счетчики.

 % загруженности процессора — в зависимости от экземпляра устройства определяет процент загруженности конкретного процессора или всех процессоров, установленных на компьютере. Аналогичную информацию можно просмотреть и в Диспетчере задач Windows (на вкладке Быстродействие). Если процессор постоянно загружен на 70-90%, значит, пора покупать более мощный процессор.

 % времени прерываний — в зависимости от экземпляра устройства определяет процент времени загруженности конкретного процессора или всех процессоров, установленных на компьютере, в течение которого процессор обрабатывает различные аппаратные прерывания. Если показания данного счетчика колеблются в пределах 25-35%, стоит также подумать о более мощном процессоре.

Для памяти это следующие счетчики.

 Обмен страниц в секунду — определяет количество страниц, считываемых или записываемых на диск в течение одной секунды. Как правило, страницы записываются на диск в том случае, если оперативная память компьютера исчерпана и системе приходится использовать файл подкачки. Иными словами, чем меньше показания данного счетчика, тем лучше. В случае большого объема обмена страниц (имеется в виду обмен страницами в течение всего сеанса работы пользователя, а не временный обмен, который может быть ассоциирован записью информации на диск (а следовательно, не отображает реальную картину загруженности памяти)) рекомендуется купить дополнительную планку оперативной памяти.

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

Доступно байт — определяет количество свободной в данный момент виртуальной памяти. Если показания этого счетчика постоянно колеблются в пределах 10-20 Мбайт, рекомендуется купить дополнительные планки оперативной памяти.

Для физического диска это следующие счетчики.

 % активности диска — определяет процент времени, которое жесткий диск тратит на удовлетворение запросов на чтение/запись данных. Если показания данного счетчика долгое время колеблются в районе 80-100%, то необходимо подумать над покупкой более быстрого жесткого диска или дополнительного объема оперативной памяти.

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

Для системы это следующий счетчик.

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

ПРИМЕЧАНИЕ

Названия счетчиков, а также описания их работы на разных компьютерах могут отличаться. Это связано с тем, что сведения о названиях счетчиков и их описания хранятся не в файле библиотеки, а непосредственно в реестре. Для их хранения применяются два параметра REG_MULTI_SZ-типа ветви реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\019 (для англоязычной версии операционной системы используется конечный подраздел 009). Данная ветвь реестра содержит два параметра — Counter и Help. Первый из них определяет названия счетчиков, а второй — их описание.

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

Форум: «Прочее»;
Поиск по всему сайту: www.delphimaster.net;
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];

Вниз

Счетчик ошибок страницы в Диспетчере задач. 

DVM ©   (2007-05-01 13:42) [0]

Что это такое? Как понимать его показания? В справке не описано.
Это нормально, когда у программы он растет со скоростью 2-3 тыс единиц в секунду?


homm ©   (2007-05-01 14:42) [1]

> Что это такое? Как понимать его показания?

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


> Это нормально, когда у программы он растет со скоростью
> 2-3 тыс единиц в секунду?

Нет 🙂 Пора идти в магазин за оперативой 🙂


Eraser ©   (2007-05-01 14:42) [2]

> [0] DVM ©   (01.05.07 13:42)


> Что это такое?

это ошибка доступа к странице памяти, при её возникновении системы выгружает нужную страницу из файла подкачки в ОЗУ.

> Это нормально, когда у программы он растет со скоростью
> 2-3 тыс единиц в секунду?

не очень (хотя тут нужно смотреть конкретную ситуацию), нужно побольше ОЗУ.


homm ©   (2007-05-01 15:05) [3]

> Это нормально, когда у программы он растет со скоростью
> 2-3 тыс единиц в секунду?

Я счас подергал окошко оперы за края, погонял апатчь, до 5 тышь в секунду доходило. Вот же уродский оптимайзер памяти у винды 🙁 Так что пара тысячь в секунду — вполне нормально.


DVM ©   (2007-05-01 15:35) [4]

Я вот попытался локализовать в своей программе место, которое более всего увеличивает счетчик — оказалось это место в FastDIB. А именно:

Вот такие преобразования моя программа делает до 200 в секунду.
Если я комментирую преобразование, то счетчик не растет практически.

Памяти 100% достаточно. Ее количество не влияет на этот счетчик. 2Гб ее.


Eraser ©   (2007-05-01 16:40) [5]

ну если это не дает лишней нагрузки на CPU — можно смело забить, если нагрузку дает — исключить вызов FastDIB2Bitmap.


antonn ©   (2007-05-01 16:43) [6]

щас может тупой вопрос задам:)
А так — procedure FastDIB2Bitmap(Src:TFastDIB; var Dst:TBitmap);
?


DVM ©   (2007-05-01 17:13) [7]


> ну если это не дает лишней нагрузки на CPU

Не нагрузки не дает абсолютно. Память не растет, никакие ресурсы не уменьшаются.


> щас может тупой вопрос задам:)
> А так — procedure FastDIB2Bitmap(Src:TFastDIB; var Dst:TBitmap);
>
> ?

Все то же самое.


Eraser ©   (2007-05-01 17:28) [8]

> [6] antonn ©   (01.05.07 16:43)

в Делфи идентификатор объекта является указателем на объект )


antonn ©   (2007-05-01 18:09) [9]


> в Делфи идентификатор объекта является указателем на объект
> )


Sapersky   (2007-05-01 20:51) [10]

Я вот попытался локализовать в своей программе место, которое более всего увеличивает счетчик — оказалось это место в FastDIB.

По логике, нужно сначала всё освободить, потом присваивать Handle.

Возможно, и освобождать необязательно, во всяком случае в примере Bumpmap сделано так:

procedure TBumpForm.SetThumbnail(Image:TImage; Bmp:TFastDIB);
var
 Tmp: TFastDIB;
begin
 Tmp:=TFastDIB.Create;
 Tmp.SetSize(105,105,Bmp.Bpp);
 if Tmp.Bpp=8 then
 begin
   Tmp.Colors^:=Bmp.Colors^;
   Tmp.UpdateColors;
 end;

 Bilinear(Bmp,Tmp);
 Tmp.FreeHandle:=False;
 Image.Picture.Bitmap.Handle:=Tmp.Handle;
 Tmp.Free;
 Image.Refresh;
end;

А вообще, откуда надобность выполнять подобное преобразование 200 раз/c? Может лучше выкинуть TBitmap и выполнять все операции с TFastDIB? А то мне сейчас лень смотреть, но подозреваю, что в TBitmap.SetHandle куда больше действий, чем просто присвоение переменной.

Ещё, имейте в виду, что FastGate — это не оригинальный FastLIB.

Длина очереди диска на SQL сервере.

Автор этого модуля уже допускал ляпы при "улучшении" библиотеки, так что аккуратнее с ним (хотя, строго говоря, и "оригинал" не безгрешен).


DVM ©   (2007-05-01 22:03) [11]


> А вообще, откуда надобность выполнять подобное преобразование
> 200 раз/c?

Да есть вот задачи. Видеонаблюдение.


> Может лучше выкинуть TBitmap и выполнять все операции с
> TFastDIB?

Так и планирую сделать, но есть свои грабли и очень много вносить изменений. В принципе FastDIB тут прикручен из-за фантастически быстрой SetSize.


> TBitmap.SetHandle куда больше действий, чем просто присвоение
> переменной.

Да, там намного больше действий.


> Sapersky

Не подскажите, как правильно скопировать один TFastDIB в другой. Не Assign(), а именно копирование? У меня вот какая штука:

Во вторичном потоке происходит декодирование JPEG в TFastDIB. Далее этот FastDIB с сообщением высылается в основной поток и там преобразуется в TBitmap, который и отрисовывается при необходимости в основном потоке по WM_PAINT. Так сделано сейчас. Так вот получается, что и основной поток и вторичный на деле же работают с одним и тем же хэндлом одного и того же битмапа по сути. Ведь FastDIB2Bitmap просто присваивает хэндл. И пока первичный поток отрисовывает его на окне вторичный ведь может и поменять его содержимое. Или я неправ? Так можно делать или надо полностью копироваить битмап в основной поток и там работать с ним?


homm ©   (2007-05-01 22:06) [12]

Хм, а я кажеться понял почему так много ошибок доступа в этом месте. Потому что по Dst фактически заново создаеться, под новый битмап выделяеться память. А менеджер памяти в виндовсе имеет такое замечательное свойство, не выделять память физически, а лишь помечать страницы как зарезервированые. А вот когда уже на новый хэндл уже копируеться изображение со старого, идет непосредственное обращение к страницам, и они выделяются физически (в ОП), а счетчик ошибок доступа мотает. Так что эта строчка имхо — большая дыра в производительности. Попробуй как минимум создавать TBitmap как DIB, как максимум, здесь вобще нужно логику программы переделывать.


homm ©   (2007-05-01 22:11) [13]

> Так вот получается, что и основной поток и вторичный на
> деле же работают с одним и тем же хэндлом одного и того
> же битмапа по сути.

Скорее всего нет. Как я понимаю невозможно преобразовать DDB в DIB не выделив под него второй хэндл.


DVM ©   (2007-05-01 22:21) [14]


> Потому что по Dst.Handle:=Src.Handle; Dst фактически заново
> создаеться, под новый битмап выделяеться память

Да, получается, что так.


> Так что эта строчка имхо — большая дыра в производительности.

Может быть, но это далеко не самая тяжелая операция. Декодирование из JPEG во вторичных потоках занимает в тысячи раз больше времени.


> как максимум, здесь вобще нужно логику программы переделывать.

Я вот попробовал переделать на TFastDIB в основном потоке — проблема с ошибками страницы исчезла.


DVM ©   (2007-05-01 22:25) [15]

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

Просто присваиванием очевидно нельзя — возникают сразу утечки GDI ресурсов (вот здесь отличие от TBITMAP).


Sapersky   (2007-05-02 00:38) [16]

Не подскажите, как правильно скопировать один TFastDIB в другой. Не Assign(), а именно копирование?

Dst.MakeCopy(Src, True); // делается SetSize и Move
Или можно (при UseGDI = True) установить размер Dst = Src, потом
Src.Draw(Dst.hDC, 0, 0); // фактически BitBlt
удобно тем, что конвертирует битмапы разных форматов, хотя, как правило, не очень качественно. Впрочем, для этого есть FConvert.pas.

И пока первичный поток отрисовывает его на окне вторичный ведь может и поменять его содержимое. Так можно делать или надо полностью копироваить битмап в основной поток и там работать с ним?

Если вторичный поток не изменяет размер битмапа, т.е. не портит указатель/Handle, то, наверное, можно его спокойно рисовать, в крайнем случае нарисуется половина старого, половина нового. Хотя сам не пробовал, не знаю, как функции GDI отнесутся к тому, что кто-то будет писать в используемую ими область памяти. Можно на всякий случай прицепить к битмапу крит. секцию.
Если изменяет — тогда однозначно нужна или синхронизация, или копирование, или и то, и другое.

Просто присваиванием очевидно нельзя — возникают сразу утечки GDI ресурсов (вот здесь отличие от TBITMAP).
Что такое "присваивание"?
Если Assign — возможно, "аффтар" FastGate с ним напортачил в новой версии, пытаясь добиться того же поведения, что и у TBitmap. В оригинале это поведение довольно специфическое — битмап-источник уничтожается.
В общем, лучше "присваивание" делать как Dst := Src с соответствующей синхронизацией или MakeCopy.


Игорь Шевченко ©   (2007-05-02 10:29) [17]


> Вот же уродский оптимайзер памяти у винды

Слону, сам понимаешь, пофиг.


DVM ©   (2007-05-02 13:00) [18]


> Sapersky   (02.05.07 00:38) [16]

Большое спасибо. Метод TFastDib.MakeCopy() действительно то что нужно.

Счетчики ошибок страницы не растут. Утечек тоже нет. Как обстоят дела с производительностью такого решения выясняю.


Форум: «Прочее»;
Поиск по всему сайту: www.delphimaster.net;
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];

Наверх

Память: 0.78 MB
Время: 0.078 c

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*