[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Руководство по настройке производительности


Средства настройки производительности SMP

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

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

Команда bindprocessor

Команда bindprocessor позволяет связать нити процесса с определенным процессором и удалить такую связь. Эту команду может вызывать только владелец процесса или пользователь с правами доступа root.

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

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

# bindprocessor -q
Доступны следующие процессоры:  0 1 2 3

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

Для того чтобы связать процесс с идентификатором 14596 с процессором 1, вызовите следующую команду:

# bindprocessor 14596 1

В случае успешного выполнения команда не выдает никакого сообщения. Для того чтобы убедиться в том, что процессор был связан с процессором, либо такая связь была удалена, вызовите команду ps -mo THREAD, как описано в разделе Применение команды ps:

# ps -mo THREAD
Польз. PID  PPID    TID ST  CP PRI SC    WCHAN        F     TT
BND  Команда
root  3292  7130      - A    1  60  1        -   240001  pts/0   - -ksh
   -     -     -  14309 S    1  60  1        -      400      -   - -
root 14596  3292      - A   73 100  1        -   200001  pts/0   1 /tmp/cpubound
   -     -     -  15629 R   73 100  1        -        0      -   1 -
root 15606  3292      - A   74 101  1        -   200001  pts/0   - /tmp/cpubound
   -     -     -  16895 R   74 101  1        -        0      -   - -
root 16634  3292      - A   73 100  1        -   200001  pts/0   - /tmp/cpubound
   -     -     -  15107 R   73 100  1        -        0      -   - -
root 18048  3292      - A   14  67  1        -   200001  pts/0   - ps -mo THREAD
   -     -     -  17801 R   14  67  1        -        0      -   - -

В столбце BND указывается номер процессора, с которым связан процесс. Отсутствие значения (-) означает, что процесс не связан ни с одним процессором.

Для того чтобы удалить связь процесса 14596 с процессором, вызовите следующую команду:

# bindprocessor -u 14596
# ps -mo THREAD
Польз. PID  PPID    TID ST  CP PRI SC    WCHAN        F     TT
BND  Команда
root  3292  7130      - A    2  61  1        -   240001  pts/0   - -ksh
   -     -     -  14309 S    2  61  1        -      400      -   - -
root 14596  3292      - A  120 124  1        -   200001  pts/0   - /tmp/cpubound
   -     -     -  15629 R  120 124  1        -        0      -   - -
root 15606  3292      - A  120 124  1        -   200001  pts/0   - /tmp/cpubound
   -     -     -  16895 R  120 124  1        -        0      -   - -
root 16634  3292      - A  120 124  0        -   200001  pts/0   - /tmp/cpubound
   -     -     -  15107 R  120 124  0        -        0      -   - -
root 18052  3292      - A   12  66  1        -   200001  pts/0   - ps -mo THREAD
   -     -     -  17805 R   12  66  1        -        0      -   - -

Если команда bindprocessor выполняется для процесса, то все нити этого процесса связываются с указанным процессором, при этом их связь с предыдущим процессором удаляется (если она была). При удалении связи процесса с процессором удаляется связь для всех его нитей. Команду bindprocessor нельзя выполнить для отдельных нитей.

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

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

# bindprocessor 7359 1
1730-002: Процесс 7359 не существует

Если же не существует указанный процессор, то появится следующее сообщение об ошибке:

# bindprocessor 7358 4
1730-001: Процессор 4 недоступен

Примечание: Не выполняйте команду bindprocessor для ожидающих процессов kproc.

Замечания

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

Связывание не гарантирует, что на указанном процессоре не будут выполняться другие процессы. В этом смысле связывание отличается от создания разделов. Выделить часть процессоров для выполнения определенной задачи можно только с помощью функции Управление рабочей схемой (WLM), которая предусмотрена в операционной системе AIX версии 4.3.3 и выше. Следовательно, процесс с более высоким приоритетом может занять процессор, с которым вы связали исходный процесс. В этом случае этот процесс не сможет занять другой процессор, если он свободен. Именно поэтому связывание процесса не всегда приводит к повышению производительности. Более высокой производительности можно добиться путем увеличения приоритета связанного процесса.

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

Если в процессе есть несколько нитей, то все его нити будут связаны с одним процессором. Следовательно, этот процесс не сможет воспользоваться возможностями многопроцессорной обработки, и его производительность не увеличится.

Примечание: Будьте внимательны, связывая процессы с процессорами, так как эта операция нарушает естественное распределение нагрузки, которое поддерживается в AIX версии 4, и может привести к резкому снижению производительности системы. Если после выполнения операции связывания рабочая схема системы изменилась, то производительность системы может понизится. После выполнения команды bindprocessor периодически отслеживайте работу системы, так как связывание процесса может в любой момент отрицательно сказаться на ее производительности, например, при изменении среды выполнения.

Команда lockstat

Команда lockstat доступна только в AIX версии 4.

Как уже отмечалось ранее, одной из наиболее сложных задач при работе в системе MP является использование блокировок и выбор оптимального уровня блокировок. Для решения этой задачи необходимо средство, позволяющее убедиться, что блокировки не сказываются отрицательно на работе системы (в частности, что не возникает конфликтов при захвате блокировки). Команда lockstat позволяет просмотреть статистическую информацию о блокировках операционной системы, работающей в системе SMP.

Для того чтобы узнать, установлена ли команда lockstat, вызовите следующую команду:

# lslpp -lI perfagent.tools

Перед вызовом команды lockstat включите функции работы с блокировками, вызвав команду bosboot с опцией -L (для выполнения этой команды необходимы права доступа root). Предположим, что загрузочный диск - это hdisk0. В этом случае нужно вызвать следующую команду:

# bosboot -a -d /dev/hdisk0 -L

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

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

Команда lockstat создает значительную нагрузку на CPU, связанную с запуском функций работы с блокировками. Именно по этой причине эти функции не запускаются по умолчанию. При включении функций работы с блокировками нагрузка обычно возрастает на 3-5 процентов. Кроме того, при использовании этих функций намного быстрее заполняются буферы трассировки, поскольку в системе одновременно используется большое число блокировок.

В операционной системе AIX версии 4 определены подсистемы, состоящие из классов блокировок. Они описаны в файле /usr/include/sys/lockname.h. Когда разработчику приложения требуется установить блокировку, подсистемы предоставляют ему соответствующий класс блокировок.

Команда lockstat создает отчет с информацией обо всех блокировках ядра, соответствующих заданным условиям. Если условия не заданы, то применяются критерии по умолчанию. Для выбора необходимой информации предназначены следующие параметры:

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

-c число-обращений-к-блокировке
Выводит блокировки, которые запрашивались указанное число раз в течение периода сбора информации. Запрос на блокировку - это блокирующая операция, выполнение которой в некоторых случаях откладывается. Указанное значение учитывает все запросы на блокировку. Значение по умолчанию равно 200.

-b доля-заблокированных-запросов
Задает долю заблокированных запросов. Если запрос на блокировку нельзя выполнить немедленно, он блокируется. В списке будут показаны блокировки с долей заблокированных запросов больше указанного значения. Доля заблокированных запросов по умолчанию равна 5 процентам.

-n число-блокировок
Задает число блокировок, которые должны быть проверены по заданным критериям. Команда lockstat сортирует все блокировки в порядке убывания их активности. Этот параметр указывает, сколько наиболее активных блокировок должно быть проверено по заданным критериям. Ограничение числа блокировок позволяет сэкономить ресурсы системы, особенно в том случае, если команда lockstat вызывается через определенные интервалы времени. Значение по умолчанию равно 40.

-p активность-блокировки
Задает долю в процентах от показателя активности наиболее часто запрашиваемой блокировки ядра. В списке будут показаны только те блокировки, активность которых выше указанного значения. Значение по умолчанию равно 2. Это означает, что по умолчанию выводятся те блокировки, показатель активности которых составляет минимум 2 процента от аналогичного показателя наиболее активной блокировки.

-t максимальное-число-блокировок
Задает максимальное число блокировок, которое может быть показано в списке. Значение по умолчанию равно 10.

Ниже приведен пример вывода команды lockstat, запущенной без параметров:

# lockstat
Subsys  Name                     Ocn   Ref/s   %Ref   %Block  %Sleep
____________________________________________________________________
 
PFS     IRDWR_LOCK_CLASS        259   75356   37.49    9.44    0.21
PROC    PROC_INT_CLASS            1   12842    6.39   17.75    0.00

В первом столбце вывода (Subsys) указывается подсистема, к которой относится блокировка. К стандартным подсистемам относятся:

PROC
Планировщик, диспетчер и обработчики прерываний

VMM
Страницы, сегменты и список свободных страниц

TCP
Сокеты, NFS

PFS
I-узлы, i-кэш

После этого указано имя класса блокировки. К стандартным классам относятся:

TOD_LOCK_CLASS
Все прерывания, для которых требуется таймер TOD

PROC_INT_CLASS
Прерывания процессов

U_TIMER_CLASS
Блокировка по таймеру отдельных процессов

VMM_LOCK_VMKER
Список свободных страниц

VMM_LOCK_PDT
Таблица устройств подкачки

VMM_LOCK_LV
Блокировка отдельных пространств подкачки

ICACHE_LOCK_CLASS
Кэш i-узлов

В других столбцах указываются следующие значения:

Рекомендуется обращать внимание на блокировки с числом обращений больше 10000 ( Ref/s). В приведенном примере для обоих классов блокировок указано очень большое число обращений. В таком случае для дальнейшего анализа ситуации можно вызвать команду vmstat. За дополнительной информацией обратитесь к разделу Команда vmstat. Если в выводе команды vmstat указано, что время простоя процессоров велико, тогда как с вашей точки зрения система работает медленно, то, скорее всего, задержки связаны с конкуренцией за блокировки ядра, в результате которой некоторые процессы приостанавливаются. Конкуренция за блокировку часто приводит к тому, что процессор работает впустую. Это происходит тогда, когда нить периодически пытается захватить занятую блокировку или переходит в состояние ожидания до освобождения блокировки. Непродуманная схема работы программы может привести к возникновению тупиков. Все это отрицательно сказывается на производительности системы.

Команда lockstat не указывает, с каким из приложений связано снижение производительности системы. Проблема конкуренции за блокировку может быть решена только на уровне кода программы. Например, если приложение состоит из большого числа процессов, которые читают и записывают данные в одну и ту же очередь сообщений, то может возникнуть конкуренция за блокировку подсистемы межпроцессного взаимодействия (IPC). В этом случае для уменьшения числа конкурирующих процессов можно создать несколько очередей сообщений.

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

Команда lockstat без параметров выводит только те блокировки, у которых значение %Block больше 5 процентов. Вы можете указать другое значение числа блокированных запросов с помощью опции -b, как показано ниже:

# lockstat -b 1
Subsys  Name                     Ocn   Ref/s   %Ref   %Block  %Sleep
____________________________________________________________________
 
PFS     IRDWR_LOCK_CLASS        258   95660   60.22   69.15    0.16
PROC    PROC_INT_CLASS            1    5798    3.65    4.73    0.00
PROC    PROC_INT_CLASS            2    2359    1.48    1.02    0.00

В этом случае будут показаны все запросы на блокировку со значением %Block больше 1 процента.

Если ни у одной блокировки число блокированных запросов не попадет в заданный интервал, то команда выдаст следующее сообщение:

# lockstat
Конфликтов нет

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

Опция -a дополнительно выводит 10 наиболее часто запрашиваемых (или активных) блокировок, как показано ниже:

# lockstat -a
Subsys  Name                     Ocn   Ref/s   %Ref   %Block  %Sleep
____________________________________________________________________
 
PFS     IRDWR_LOCK_CLASS        259   75356   37.49    9.44    0.21
PROC    PROC_INT_CLASS            1   12842    6.39   17.75    0.00
 
10 блокировок с максимальным числом обращений:
 
Subsys  Name                     Ocn   Ref/s   %Ref   %Block  %Sleep
____________________________________________________________________
 
PFS     IRDWR_LOCK_CLASS        259   75356   37.49    9.44    0.21
PROC    PROC_INT_CLASS            1   12842    6.39   17.75    0.00
PROC    TOD_LOCK_CLASS           --    5949    2.96    1.68    0.00
PROC    PROC_INT_CLASS            2    5288    2.63    3.97    0.00
XPSE    PSE_OPEN_LOCK            --    4498    2.24    0.87    0.00
IOS     SELPOLL_LOCK_CLASS       --    4276    2.13    3.20    0.00
XPSE    PSE_SQH_LOCK             95    4223    2.10    0.62    0.00
XPSE    PSE_SQH_LOCK            105    4213    2.10    0.50    0.00
XPSE    PSE_SQH_LOCK             75    3585    1.78    0.31    0.00
XPTY    PTY_LOCK_CLASS            6    3336    1.66    0.00    0.00

В полях этого списка указываются те же значения, что и в предыдущем примере. Первая таблица содержит список блокировок, у которых значение %Block больше 5 процентов. После этого приведен список из десяти блокировок с максимальным числом обращений, отсортированных в порядке убывания числа обращений. Размер этого списка можно изменить с помощью опции -t, как показано ниже:

# lockstat -a -t 3
Subsys  Name                     Ocn   Ref/s   %Ref   %Block  %Sleep
____________________________________________________________________
 
PFS     IRDWR_LOCK_CLASS        259   75356   37.49    9.44    0.21
PROC    PROC_INT_CLASS            1   12842    6.39   17.75    0.00
 
3 блокировки с максимальным числом обращений:
 
Subsys  Name                     Ocn   Ref/s   %Ref   %Block  %Sleep
____________________________________________________________________
 
PFS     IRDWR_LOCK_CLASS        259   75356   37.49    9.44    0.21
PROC    PROC_INT_CLASS            1   12842    6.39   17.75    0.00
PROC    TOD_LOCK_CLASS           --    5949    2.96    1.68    0.00

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

В некоторых случаях вывод команды lockstat -a может выглядеть следующим образом:

Конфликтов нет
 
10 блокировок с максимальным числом обращений:
 
Subsys  Name                     Ocn   Ref/s   %Ref   %Block  %Sleep
____________________________________________________________________

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

Команда lockstat может выполняться через определенные интервалы времени, как показано ниже:

# lockstat 10 100

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

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

Команда schedtune -s

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

Раньше значение MAXSPIN по умолчанию равнялось 0xFFFFFFFF (очень большое значение в шестнадцатеричном формате) в многопроцессорных системах и 1 в однопроцессорных системах. В AIX версии 4.3.1 значение MAXSPIN по умолчанию равняется 0x4000 (16384) в многопроцессорных системах и 1 в однопроцессорных системах. Если в системе увеличилось время простоя процессора или время ожидания ввода-вывода, то это может быть вызвано тем, что нити стали чаще останавливаться на время ожидания блокировки. Если это привело к снижению производительности системы, то увеличьте значение параметра MAXSPIN или присвойте ему значение -1, эквивалентное 0xFFFFFFFF.

Число попыток захвата, при достижении которого нить будет остановлена до освобождения блокировки, можно задать с помощью опции -s команды schedtune. Для того чтобы сократить нагрузку на CPU, связанную с большим количеством попыток захвата, уменьшите значение MAXSPIN, как показано ниже:

# /usr/samples/kernel/schedtune -s 8192

При этом может возрасти количество переключений контекста. Если это приведет к снижению скорости работы приложений, увеличьте значение MAXSPIN.

Для того чтобы узнать, установлена ли команда schedtune, вызовите следующую команду:

# lslpp -lI bos.adt.samples

Для изменения значения параметра необходимы права доступа root.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]