D3 Reference Manual

Index | Help

Поиск по страницам

Разделы / Общие сведения / Performance Monitoring

Performance Monitoring

Мониторинг работы системы

Описание команд и методик слежения за производительностью системы, которые позволяют выявить узкие места в конфигурации.

Введение

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

Предполагается, что читатель достаточно хорошо знаком с средой D3 и обладает некоторыми знаниями по ОС Unix.

Общий обзор

Проблемы производительности, связанные со средой Unix, обычно "точны", т.е. на заданный момент времени производительность ухудшается, но общая производительность системы остается удовлетворительной. Как правило, отследить и ликвидировать эти проблемы достаточно легко.

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

Для слежения за работой системы используется команда "buffers". Для вывода содержимого журнального файла используется команда "buffers.g".

Узкие места, связанные со средой Unix

Для выявления и устранения проблем, вызванных неожиданными операциями в ОС Unix одновременно с работой D3, следует, прежде всего, проанализировать результаты, предоставляемые программой SAR OC Unix. Проблемы, связанные с устройствами, также могут заметно ухудшать общую производительность системы.

Использование CPU (результаты программы SAR)

В хорошо сбалансированной системе процент использования CPU пользователями ('user cpu usage') должен быть достаточно высоким (более 80-90%). Высокий процент использования системных мод ('system mode usage') означает слишком большое количество переключателей процессов или слишком большое количество системных вызовов. Показатель использования CPU в связи с ожиданием ввода/вывода ('waiting for IO cpu usage'), не равный нулю, означает, что узким местом является диск. Если показатель системного использования CPU ('system cpu usage') становится слишком высоким без интенсивного ввода/вывода, это может свидетельствовать о наличии проблемы (см. следующий раздел).

Свопинг

Абсолютное золотое правило состоит в том, что во время обычных операций следует избегать свопинга. Избежать свопинга можно путем увеличения объема физической памяти или уменьшения объема памяти, выделенного системе D3. Удивительно, но если система осуществляет свопинг, производительность D3 может улучшиться путем уменьшения количества памяти, выделенной системе D3, в файле конфигурации. Конечно, существуют какие-то нижние пределы, которые должны соблюдаться. Данные по слежению за работой D3 позволяют, как правило, определить, насколько далеко можно йдти по этому пути.

По возможности в часы интенсивной работы следует избегать команд ОС Unix, расходующих большое количество ресурсов (болезненна компиляция, "X-window" требует большого количества памяти и т.д.).

Если имеет место довольно интенсивный свопинг, необходимо следить за тем, чтобы объем памяти, выделенной системе D3 (см. глагол "what"), не превышал общего объема физической памяти за вычетом емкости памяти, занимаемой ядром ОС Unix (от 2 мегабайтов для SCO Unix до 6 мегабайтов для AIX в зависимости от реализации).

Для получения того, какие процессы выполняются, достаточно сделать следующее (в качестве пользователя 'root'):

ps -edalf | grep R
S UID   PID   PPID            STIME    TTY  TIME CMD
R root  4719     1   ...   07:08:53   24/0  0:05 ap - 24 tty24 
R root  8999 10534   ...   07:58:33   89/0  0:00 ps -edalf 
S root 10534  4133   ...   08:58:33   89/0  0:00 grep R 
R demo 26242 25467   ...   07:10:03   75/0  0:16 demo

Это фрагмент результата. Он показывает, что процесс 4719 выполняет D3 на PIB 24. Процесс 26242 не является процессом D3 и использовал в три раза больше времени CPU, чем процесс D3. Если выполнить команду несколько раз и некоторые процессы покажут разное время, можно сделать вывод о том, какие процессы не следует запускать в часы пик.

Проблемы с устройствами

Чаще всего проблемы с TTY возникают из-за неправильного подключения кабелей. Когда ОС Unix пытается сгенерировать процесс (D3 или Unix), связанный с терминалом, устройство должно быть готово. Если нет, то Unix "ждет" в течение непродолжительного времени, а затем делает еще одну попытку. Еще хуже то, что порт с сигналом DCD в неустойчивом состоянии может создать большое количество прерываний, которые, в свою очередь, генерируют сигналы 'hang up', что значительно увеличивает нагрузку на систему. Для выявления таких проблем можно сделать следующее (в качестве пользователя 'root'):

ps -edalf | grep '?'
S    root  4184  9047   ... 09:06:26   89/0  0:00 grep ?
S    root 25185     1   ... 07:08:52      ?  0:00 ap - 9 tty9 
R    root 30571     1   ... 07:08:52      ? 23:45 ap - 19 tty19 printer 

Эта команда показывает процессы, связанные с терминалами, которые система не смогла открыть. На второй строке показан процесс D3 (pid=25185) в состоянии ожидания или "сна" (S): этот процесс не расходует время CPU. Система не могла открыть устройство /dev/tty9 и прекратила попытки сделать это. Третья строка показывает процесс D3 (pid=30571) в стадии выполнения (R): этот терминал использует CPU, т.к. согласно предоставленной информации время использования CPU составляет '23:45'. Система пыталась открыть устройство /dev/tty19, потерпела неудачу (как и в предыдущем случае), но может быть кабель неисправен или не подключен на другом конце и постоянно генерирует сигналы.

В этой ситуации следует правильно подключить терминал или изменить соответствующую запись в /etc/inittab turned на 'off' вместо перегенерации. К сожалению, вышеуказанная команда не всегда явно указывает устройство, с которым возникла проблема, и в этом случае выявить его очень трудно. Единственный способ - это тщательно проверить кабели в поисках порта, не стартовавшего, как предполагалось, т.е. поиск неисправного порта методом исключения.

Выявление проблем конфигурации. Статистические данные

Команда "buffers" отслеживает следующие элементы данных:

Имя Описание
Activ Количество приведений процесса в действие. Каждое чтение диска, нажатие на клавишу и "пробуждение" процесса после "сна" увеличивают этот счетчик. Если вычесть из этого счетчика количество ошибок "frame faults" (отсутствия нужного фрейма в памяти), это даст представление об объеме ввода данных.
Idle Время бездействия. В реализациях Unix не поддерживается.
Fflt Отсутствие нужного фрейма в памяти. Здесь подсчитывается количество операций чтения с диска.
Writes Операции записи на диск. Как правило, все операции записи выполняются в фоновом режиме процессом сброса на диск ('flush'), который обновляет диск в соответствии с модифицированными ("грязными") фреймами памяти. Большое количество операций записи свидетельствует либо о большом количестве обновлений, либо о недостаточно большом объеме памяти, выделенном виртуальной машине D3.
Bfail Неудачный поиск буфера. Это счетчик количества неудачных попыток найти буфер в памяти для нового фрейма. Если этот счетчик не равен нулю, это означает недостаточно большой объем памяти. Этот счетчик никогда не должен иметь ненулевое значение.
RqFull В очереди на чтение диска нет свободного места. В реализациях Unix не поддерживается.
WqFull В очереди на запись на диск нет свободного места. Этот счетчик считает количество случаев, когда программа сброса на диск ('flusher') не успевает за модификацией фреймов в памяти. Это означает, что либо очередь на запись слишком мала для данной конфигурацией (см. далее а этом приложении раздел "Настройка программы 'Flusher'"), либо слишком мала память.
DskErr Ошибки диска
Elapsd Истекшее время. Это время в секундах между двумя выборками. Только для внутреннего использования.
DblSrc Двойной поиск. Это счетчик количества конфликтов между двумя или более процессами, которым одновременно понадобился один и тот же фрейм, этого фрейма не оказалось в памяти, и эти процессы одновременно получили "ошибку фрейма" (frame fault). Ненулевое значение этого счетчика означает исключительную ситуацию.
Breuse Повторное использование буфера. Этот счетчик считает количество случаев, когда один и тот же буфер был выделен одним процессом для чтения одного фрейма (FID) и другим процессом для хранения другого фрейма (FID). Ненулевое значение этого счетчика должно означать исключительную ситуацию.
Bcolls Конфликты между пакетными и интерактивными процессами. Этот счетчик считает количество конфликтов между "пакетным" процессом (т.е. процессом с интенсивным обращением к диску) и "интерактивным" процессом (т.е. процессом с большим количеством ввода с клавиатуры). По умолчанию D3 обеспечивает такой режим, при котором интерактивные процессы имеют преимущество над пакетными процессами с точки зрения доступа к определенным ресурсам. Более подробную информацию см. . ниже в разделе "Пакетные процессы".
Sem Конфликты на семафоре. Этот счетчик считает количество конфликтов между двумя процессами, пытающимися обратиться к одной и той же общесистемной внутренней таблице.
Vlocks Неудачные попытки установления виртуальной блокировки. Этот счетчик считает количество случаев, когда процесс D3 пытался установить виртуальную блокировку, но ему было отказано, т.к. она уже была у другого процесса.
Blocks Неудачные попытки установления блокировки. Этот счетчик считает количество случаев, когда процесс D3 пытался установить блокировку FlashBASIC и получил отказ, т.к. блокировка уже была у другого процесса.
B0reg Буферы без приданных виртуальных регистров. Это буферы, не присоединенные в данный момент для немедленного обращения. В действительности, в каждый момент времени подсоединено только очень малое количество буферов. Поэтому ситуация, когда значение этого счетчика почти равно общему количеству буферов в памяти, нормальна.
B1reg Буферы, используемые более, чем одним процессом, но уже не используемые владельцем. Их должно быть очень небольшое количество.
B2reg Буферы, используемые исключительно их владельцем. В реализациях RISC эта ситуацию позволяет увеличить производительность ввиду отсутствия конфликтов по поводу этих буферов. Как правило, эти буферы содержат собственное рабочее пространство, данные, которыми больше никто не пользуется, и т.д.
B>3reg Буферы, используемые как их владельцем, так и другими процессами. Это количество страниц, которыми действительно коллективно пользуются процессы (файлы данных) в каждый конкретный момент времени.
ww Буферы, требующие записи на диск. Это счетчик буферов, которые на данный момент модифицированы, но еще не перезаписаны на диск.
IObusy Буферы, считываемые с диска. Это счетчик операций чтения диска, ожидающих в очереди. Как правило, этот счетчик равен нулю, т.к. запросы на чтение удовлетворяются слишком быстро для образования очереди.
Mlock Количество буферов, блокированных в памяти (т.е. буферов, которые не выводятся из памяти в процессе свопинга). Если в памяти блокирована секция ABS, это число равно, по крайней мере, размеру ABS. Если подключено ленточное устройство, счетчик включает также ленточные буферы.
Ref Буферы, к которым производилось обращение. Это количество недавно использовавшихся буферов.
WQ Количество буферов в очереди на запись. Это количество буферов в очереди не запись на данный момент.
Tophsh Верх хэша. Это число показывает качество алгоритма хеширования, используемого для поиска фрейма в памяти. Оно должно быть большим (более 60% общего количества буферов).
avail Свободные буферы. Количество буферов, являющихся кандидатами на замещение. Это буферы, которыми в последнее время никто не пользовался. Если это число опускается ниже 10% от общего количества буферов, производительность существенно падает.
batch Пакетные буферы. Это количество буферов, используемых пакетными процессами. Большое значение этого счетчика (приближающееся к 50% дисковых буферов) означает, что пакетные процессы осуществляют интенсивные операции с диском.
Журнал операций

Журнал операций хранится в файле "buffers.log" с отдельным файлом данных на каждый день недели (buffer.log.Monday, buffer.log.Tuesday и т.д.). Файл создается автоматически, когда впервые используется команда "buffers" с опцией (Н). При смене дня недели каждый файл на уровне данных автоматически чистится таким образом, что в файл автоматически записываются данные за всю неделю. Идентификатором записи (itemid) является внутреннее время из пяти цифр.

Команда "buffers" автоматически создает также словарные атрибуты, соответствующие вышеуказанным счетчикам. Атрибут TIME выводит время выборки.

Атрибут DESCRIPTION в "D"-указателях "Monday", "Tuesday" и т.д. содержит дату.

Файл создается с атрибутом DX.

Слежение за операциями

Подключиться к счету "dm". Ввести следующее:

buffers {(options}

Опции:

C Если используется с опцией (H), чистит файл данных за сегодняшний день. Эта опция должна использоваться в самый первый раз. Использовать опцию (C) для возобновления слежения после его приостановки на некоторое время не нужно.
H{n} Запись статистических данных в журнальный файл. Если указывается число "n", процесс ожидает "n" секунд перед каждой следующей выборкой. По умолчанию "n" равно 5 сек. Если выборка осуществляется в течение продолжительного периода времени, время ожидания 5 мин. (300 сек.) будет хорошим компромиссом между точностью и объемом данных.
L{n} Циклическая выборка и вывод статистических данных. Если задано число "n", процесс ожидает "n" секунд перед каждой следующей выборкой. По умолчанию "n" равно 5 сек.
S Вывод системных счетчиков. Без этой опции выводится упрощенный набор счетчиков. Записываются же все счетчики независимо от наличия этой опции.

Примеры:

buffers 

Эта команда производит одну выборку несистемных статистических данных.

buffers (sh300c 

Цикл, при выполнении которого выводится содержимое всех счетчиков, записывается история операций и производится выборка каждые 300 сек. (5 мин). Сегодняшний файл данных чистится, в результате чего начинается новый сеанс.

В ходе выполнения цикла команда "buffers" опрашивает клавиатуру в поиске нажатия на клавишу "x" для прекращения выполнения команды или клавиши "r" для перерисовки экрана, если, например, он был искажен в результате прибытия сообщения. Нажатие на любую другую клавишу заставляет команду "buffers" произвести следующую выборку.

Вывод файла истории без обработки

Файл истории можно вывести с помощью любого предложения AQL. Например:

sort buffers.log,friday with time >= "11:14:00"
Гистограммы

Команды "buffers.g" выводит содержимое журнального файла в виде набора гистограмм. Используется следующий синтаксис:

buffers.g cntr [day{-{day}}|*] {step {strt.time-{end.time}}} {(option} 
cntr Имя статистического счетчика (например, "fflt" для третьего счетчика). Это должно быть имя из вышеуказанного списка. Если заданные счетчики показывают проценты, связанные с буферами, их содержимое выдается не как "сырые" необработанные цифры, а как проценты от общего количества буферов.
day День (или дни) для вывода. Один день может быть задан явно (понедельник, вторник и т.д.) или его порядковым номером от 1 (воскресенье) до 7 (суббота). Диапазон дней можно задать путем указания двух дней через тире (-). Если второй день не указан, предполагается суббота. Данные за неделю можно получить путем указания звездочки (*).
step Задает временной шаг вывода в формате ЧЧ:MM{:СС}. Все выборки, сделанные в пределах шага, накапливаются и усредняются. Если шаг не задан или равен 0 или если он меньше периода выборки в журнальном файле, выдаются результаты всех выборок.
strt.time Время начала. Если оно не задано, предполагается 00:00:00.
end.time Время окончания. Если оно не задано, предполагается 23:59:59.

Опции:

P - посылка выходных данных на принтер.

Примеры:

buffers.g fflt * 01:00:00 

Вывод количество ошибок "frame fault" (чтений диска) за всю неделю с шагом 1 час. В следующем примере до среды никакие данные не записывались.

No log for Sunday
No log for Monday
No log for Tuesday
20Feb1991; Wednesday; Ctr=fflt, Step=01:00:00, Range=00:00:00-23:59:59

         0      8848   17696  26544  35392  44240  53088  61936  
         +------+------+------+------+------+------+------+------+----
10:59:28 *************************
11:59:54 ***********************************************************
13:00:25 **********************************************************
14:00:52 ************************************
15:01:18 ***************************
16:01:49 ********************************************************
17:02:22 ***************************************
18:02:55 ******
19:03:32 ***********************************************
20:04:08 *************************************************
21:04:43 
22:05:21 ***************************************************
23:05:55 *************
Number of samples : 155
Total : 622070
Average per period : 7.1999 / sec.
Max value : 88481
Peak time : 13:00:25
buffers.g ww monday-friday 00:30 08:00-17:30 (p

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

Интерпретация результатов

После выборки достаточного количества данных можно вывести результаты с помощью команды "buffers.g". Наиболее полезно слежение за следующими параметрами:

Fflt Количество ошибок "frame fault" (отсутствие нужного фрейма в памяти). Если это количество приближается к пропускной способности диска (bandwidth), указанной изготовителем, система начинает зависеть от диска. Возможные решения варьируются от увеличения памяти, выеляемой под D3, до смены дисков или организации базы данных D3 на отдельных дисках для увеличения параллелизма.
Writes Это количество должно оставаться на уровне одной трети 1/3 - 1/2 количества ошибок "frame fault". При обычной работе системы является ненормальным такое положение, когда система выполняет больше операций записи, чем операций чтения. Если такая ситуация возникает, следует обратиться к разделу "Настройка программы 'Flusher'".
Bfail Это число всегда должно быть равно нулю. Если это не так, это определенно означает, что память, выделенная под D3, слишком мала.
WqFull Это число не должно быть не нулем "слишком часто". Но если это все-таки происходит и при этом количество выполненных операций записи тоже велико, это означает ненормально интенсивную запись на диск. См. ниже раздел "Настройка программы ''Flusher'.
Bcolls Если это число становится слишком большим, это означает, что выполняется большое количество пакетных заданий (например, отбор записей из больших файлов) в то время, как другие процессы заняты вводом данных. Это также показатель того, что интерактивные задания получают, конечно, более высокий приоритет, чем пакетные. См. ниже раздел "Интерактивные - пакетные процессы".
ww Это количество никогда не должно превышать 50 % общего пула буферов. Если превышение имеет место, это может означать, что программа 'Flusher' работает недостаточно часто. См. ниже раздел "Настройка программа 'Flusher'".
avail Это число никогда не должно опускаться ниже 10% от всего пула буферов, но если это происходит, необходимо увеличить память или изменить параметры программы "Flusher".
Настройка программы "Flusher"

"Flusher" - это фоновой процесс, запускающийся автоматически во время начальной загрузки. Он просматривает память D3 и перезаписывает на диск фреймы, которые были модифицированы. Это важная задача не только с точки зрения попадания данных назад на диск, но и для освобождения места под новые данные. Как правило, процесс считывает данные, модифицирует их, но эти данные не всегда нужны ему "надолго". Программа "Flusher" следит за тем, чтобы записи вовремя перезаписывались назад на диск, освобожая место для считывания других данных.

Эта 'очистка' памяти выполняется в следующих случаях:

  • Периодически, если диск бездействует. Если диск неактивен в течение "некоторого времени", программа "Flusher" приходит в действие и просматривает память, записывая всю ее назад на диск, за исключением случая, когда другой процесс требует доступа к диску. Этот период задается оператором "flush" в файле конфигурации.
  • По требованию. Если память "переполняется", т.е. в ней находится большое количество страниц, требующих записи на диск, программа "Flusher" приходит в действие немедленно.

Чем чаще программа "Flusher" приходит в действие, тем больше памяти перезаписывается назад на диск. Но это увеличивает количество операций с диском, уменьшая пропускную способность диска для "полезной" работы, и расходует ресурсы CPU. Еще одной отрицательной стороной частой перезаписи на диск является то, что модифицируемые данные (рабочее пространство, списки отобранных записей и т.д.) могут перезаписываться на диск несколько раз в то время, когда хватило бы одного последнего раза.

Глагол "set-flush" позволяет изменить период сброса на диск (см. ниже раздел "Команды TCL"). Увеличивайте этот период, проверяя с помощью команды "buffers", что количество переполнений очереди на запись (событий 'write queue full') остается низким и что количество свободных буферов не слишком мало. Как правило, система саморегулируется, увеличивая частоту перезаписи на диск, в случае интенсивного использования памяти, поэтому никакой необходимости задавать малый период сброса нет. Период 30 сек. должен быть верхним пределом.

Файл конфигурации содержит также оператор "dwqnum", который определяет длина внутренней очереди на запись. Увеличение этой очереди уменьшает вероятность возникновения ситуации, когда программа "Flusher" в критический момент приводится в действие по требованию, что уменьшает общее количество сбросов на диск. Отрицательной стороной увеличения размера очереди на запись является то, что программа "Flusher" работает в "взрывном" режиме (короткими интенсивными сеансами), что может привести к перегрузке канала диска, когда это происходит. Этот параметр динамически не изменяется, поэтому следить за ним немного труднее.

Интерактивные - пакетные процессы

Пользовательские процессы D3 делятся на два класса в зависимости от того, каким видом деятельности они занимаются. Это интерактивные процессы, т.е. процессы, которые, как правило, выполняют "много" ввода с клавиатуры, и пакетные процессы, которые мало связаны с вводом с клавиатуры, но требуют большого количества дискового ввода/вывода и/или интенсивного использования CPU. Система автоматически определяет, процесс какого типа выполняется, на основе внутренних статистических данных.

Администратор системы может изменять в нужную сторону и/или отменять параметры, используемые по умолчанию механизмом присвоения приоритетов. Хотя это и не рекомендуется, можно даже заставить систему считать процесс, например, интерактивным независимо от того, какого рода деятельностью он занимается. Это можно делать динамически отдельно для каждого процесса с помощью команды "set-batch". Кроме того, команда "set-batchdly" TCL позволяет выводить и устанавливать глобальные значения, используемые для постановки в очередь некоторых видов деятельности процессов.