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

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


Определение ресурсов, ограничивающих производительность

Для оценки показателей использования ресурсов в многопользовательской системе рекомендуется воспользоваться командой vmstat. Команда vmstat предоставляет информацию о загруженности процессора, интенсивности операций дискового ввода-вывода и использовании оперативной памяти. Ниже приведен пример команды vmstat, которая каждые пять секунд выводит на экран строку отчета:

# vmstat 5

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

Приведенный ниже отчет создан командой vmstat в системе, в которой запущены AIXwindows и несколько смешанных приложений (из отчета удалено несколько интервалов с относительно низкой нагрузкой):

нити     память             страница          ошибки   cpu
----- ----------- ------------------------ ------------ -----------
 r  b   avm   fre  re  pi  po  fr   sr  cy  in   sy  cs us sy id wa
 0  0  8793    81   0   0   0   1    7   0 125   42  30  1  2 95  2
 0  0  8793    80   0   0   0   0    0   0 155  113  79 14  8 78  0
 0  0  8793    57   0   3   0   0    0   0 178   28  69  1 12 81  6
 0  0  9192    66   0   0  16  81  167   0 151   32  34  1  6 77 16
 0  0  9193    65   0   0   0   0    0   0 117   29  26  1  3 96  0
 0  0  9193    65   0   0   0   0    0   0 120   30  31  1  3 95  0
 0  0  9693    69   0   0  53 100  216   0 168   27  57  1  4 63 33
 0  0  9693    69   0   0   0   0    0   0 134   96  60 12  4 84  0
 0  0 10193    57   0   0   0   0    0   0 124   29  32  1  3 94  2
 0  0 11194    64   0   0  38 201 1080   0 168   29  57  2  8 62 29
 0  0 11194    63   0   0   0   0    0   0 141  111  65 12  7 81  0
 0  0  5480   755   3   1   0   0    0   0 154  107  71 13  8 78  2
 0  0  5467  5747   0   3   0   0    0   0 167   39  68  1 16 79  5
 0  1  4797  5821   0  21   0   0    0   0 191  192 125 20  5 42 33
 0  1  3778  6119   0  24   0   0    0   0 188  170  98  5  8 41 46
 0  0  3751  6139   0   0   0   0    0   0 145   24  54  1 10 89  0

На начальном этапе обратите внимание на колонки pi и po в разделе Страница и четыре колонки в разделе CPU.

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

Если в отчете команды vmstat указано значительное время ожидания ввода-вывода, то рекомендуется вызвать команду iostat для получения более подробной информации. Ниже приведен пример команды iostat, которая каждые пять секунд выводит на экран отчет об операциях ввода-вывода и ресурсах процессора:

# iostat 5 3

Поскольку после периодичности создания отчета в команде указано значение 3, команда создаст три отчета.

Приведенный ниже отчет создан утилитой iostat в той же системе, что и примеры отчетов команды vmstat, но в другое время. Первый отчет содержит информацию, собранную с момента загрузки системы, а последующие отчеты - информацию, собранную за прошедший 5-минутный интервал:

tty:      tin         tout   avg-cpu:  % user    % sys     % idle    %iowait
          0.0       4.3            0.2       0.6       98.8      0.4
 
Диски:        % tm_act     Kbps      tps    Kb_read   Kb_wrtn
hdisk0           0.0       0.2       0.0              7993      4408
hdisk1           0.0       0.0       0.0              2179      1692
hdisk2           0.4       1.5       0.3             67548     59151
cd0              0.0       0.0       0.0          0         0
 
tty:      tin         tout   avg-cpu:  % user    % sys     % idle    %iowait
          0.0      30.3               8.8      7.2       83.9     0.2
 
Диски:        % tm_act     Kbps      tps    Kb_read   Kb_wrtn
hdisk0           0.2       0.8       0.2                 4         0
hdisk1           0.0       0.0       0.0          0         0
hdisk2           0.0       0.0       0.0          0         0
cd0              0.0       0.0       0.0          0         0
 
tty:      tin         tout   avg-cpu:  % user    % sys     % idle    %iowait
          0.0       8.4               0.2      5.8        0.0      93.8
 
Диски:        % tm_act     Kbps      tps    Kb_read   Kb_wrtn
hdisk0           0.0       0.0       0.0                 0         0
hdisk1           0.0       0.0       0.0          0         0
hdisk2          98.4     575.6      61.9               396      2488
cd0              0.0       0.0       0.0          0         0

Из первого отчета, относящегося ко времени, прошедшему с момента последней загрузки, видна несбалансированность ввода-вывода в системе. Большая часть операций ввода-вывода (86,9% считанных данных и 90.7% записанных данных) относится к диску hdisk2, на котором расположена операционная система и пространство подкачки. Статистика использования процессора, собранная с момента загрузки системы, обычно не несет в себе полезной информации, за исключением случаев, когда система используется круглосуточно.

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

Третий отчет относится к периоду, когда системная нагрузка была искусственно повышена путем запуска программы, которая захватила большой объем памяти (в этом примере 26 Мб) и записала в него данные. Поэтому создавшаяся ситуация близка к перегрузке памяти. В данном примере диск hdisk2 активен 98.4 процента времени, что привело к тому, что в 93.8 процентах случаев приложение вынуждено ждать освобождения диска.

Если в выводе команды vmstat указано, что процессор значительную часть времени простаивает, тогда как с точки зрения пользователей производительность системы очень низкая, то, возможно, задержки вызваны конфликтами при захвате ресурсов ядра. В AIX версии 4 это можно проверить с помощью команды lockstat.

Определение ресурса, ограничивающего производительность отдельной программы

Если вы - единственный пользователь системы, то с помощью команды time вы можете выяснить, ограничена ли производительность программы ресурсами CPU или ввода-вывода. Ниже приведен пример этой команды:

# time cp foo.in foo.out
 
фактическое    0m0.13s
пользов.       0m0.01s
сист.          0m0.02s

Примечание: Здесь и далее в настоящем руководстве примеры применения команды time относятся к ее версии, встроенной в оболочку Korn (ksh). Стандартная команда time (/usr/bin/time) отличается меньшей точностью.

В нашем примере тот факт, что фактическое (real) время выполнения программы cp (0,13 с) значительно превышает сумму времени для пользователя и CPU (0,3 с), означает, что производительность программы ограничена скоростью ввода-вывода. Как правило, это вызвано тем, что файл foo.in не находится в оперативной памяти.

В системах SMP вывод команды интерпретируется по-другому. См. раздел Рекомендации по работе с командами time и timex.

Запустив ту же команду через несколько секунд, вы получите следующий вывод:

фактическое    0m0.06s
пользов.      0m0.01s
сист.         0m0.03s

Большая часть страниц файла foo.in все еще находится в памяти, поскольку нет другого процесса, который мог бы захватить память, и поскольку объем файла невелик по сравнению с общим объемом оперативной памяти в системе. Если бы файл foo.out применялся другой программой в качестве файла ввода, эта программа почти не зависела бы от ресурсов диска, так как файл хранился бы в буфере памяти.

Для того чтобы выяснить зависимость производительности программы от ресурсов диска, необходимо обеспечить чистоту эксперимента. Это означает, что если проверяемая программа в обычных условиях обрабатывает файл, с которым давно никто не работал, то необходимо убедиться, что файл, служащий тестовым примером, не находится в памяти. Если же программа обычно выполняется в рамках конвейера, и ее вводом служит вывод предыдущей программы из того же пакета, то необходимо, напротив, поместить файл ввода в память. Например, следующая команда загрузит страницы файла foo.in в память:

# cp foo.in /dev/null

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

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

Анализ зависимости неполадки от дисковой или оперативной памяти

В то время как большой фрагмент оперативной памяти используется для буферизации файлов, часть данных программы может принудительно выгружаться из памяти на диск. Для временного хранения таких данных служит системное пространство подкачки. Предположим, что программа считывает очень мало данных или не считывает их вообще, и тем не менее оказывается зависимой от ресурсов ввода-вывода. Кроме того, соотношение между фактическим временем выполнения и суммой времени пользователя и системы не улучшается при предварительном помещении ввода в память. В этом случае производительность программы и эффективность выполнения ее операций ввода-вывода могут быть ограничены ресурсами памяти, и, в частности, ресурсами пространства подкачки. Проверить это предположение можно с помощью следующего сценария оболочки vmstatit (в AIX 5.1 для этого достаточно вызвать команду vmstat с опцией -I):

vmstat -s >temp.file   # данные за все время до запуска команды
time $1                # тестируемая команда
vmstat -s >>temp.file  # данные за все время до конца выполнения
grep "pagi.*ins" temp.file >>results   # выбираются только те данные,
grep "pagi.*outs" temp.file >>results  # которые необходимы

Сценарий vmstatit в сжатом виде выдает основную информацию из отчета команды vmstat -s, содержащего сведения, накопленные с момента запуска системы.

Если этот сценарий оболочки запущен следующей командой:

# vmstatit "cp file1 file2"  2>results

То эта команда создаст следующий вывод:

фактическое    0m0.03s
пользов.    0m0.01s
сист.       0m0.02s
     2323 страниц загружено из пространства подкачки
     2323 страниц загружено из пространства подкачки
     4850 страниц выгружено в пространство подкачки
     4850 страниц выгружено в пространство подкачки

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

vmstat -s >temp.file
time $1
vmstat -s >>temp.file
echo "Обычный ввод:"               >>results
grep "^[ 0-9]*page ins"    temp.file >>results
echo "Обычный вывод:"              >>results
grep "^[ 0-9]*page outs"   temp.file >>results
echo "Вывод в пространство подкачки:"  >>results
grep "pagi.*outs"          temp.file >>results
echo "Ввод из пространства подкачки:"  >>results
grep "pagi.*ins"           temp.file >>results

Поскольку всеми обычными операциями ввода-вывода в операционной системе управляет VMM, в выводе команды vmstat -s обычные операции ввода-вывода интерпретируются как операции загрузки и выгрузки страниц. Запуск приведенной выше версии сценария оболочки vmstatit для команды cp, обрабатывающей большой файл, который до этого не был загружен в память, дал следующие результаты:

фактическое    0m2.09s
пользов.    0m0.03s
сист.       0m0.74s
Обычный ввод:
    46416 страниц загружено
    47132 страниц загружено
Обычный вывод:
   146483 страниц выгружено
   147012 страниц выгружено
Вывод в пространство подкачки:
     4854 страниц выгружено в пространство подкачки
     4854 страниц выгружено в пространство подкачки
Ввод из пространства подкачки:
     2527 страниц загружено из пространства подкачки
     2527 страниц загружено из пространства подкачки

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

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

Для того чтобы показать, как будут выглядеть результаты выполнения этого сценария в случае, когда производительность программы ограничена объемом памяти, рассмотрим следующую ситуацию. Сначала проанализируем работу программы при достаточно большом объеме памяти (32 Мб), а затем с помощью команды rmss (см. раздел Оценка необходимого объема памяти с помощью команды rmss) искусственно уменьшим объем памяти. Последовательность команд

# cc -c ed.c
# vmstatit "cc -c ed.c" 2>results

сначала загружает в память исходный файл длиной 7944 строки и исполняемый файл компилятора C, а затем повторно измеряет количество операций ввода-вывода:

фактическое    0m7.76s
польз.      0m7.44s
сист.       0m0.15s
Обычный ввод:
    57192 страниц загружено
    57192 страниц загружено
Обычный вывод:
   165516 страниц выгружено
   165553 страниц выгружено
Вывод в пространство подкачки:
    10846 страниц выгружено в пространство подкачки
    10846 страниц выгружено в пространство подкачки
Ввод из пространства подкачки:
     6409 страниц загружено из пространства подкачки
     6409 страниц загружено из пространства подкачки

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

# rmss -c 8

уменьшить рабочий объем памяти компьютера до 8 Мб, а затем повторно ввести ту же последовательность команд, то результат будет следующим:

фактическое    0m9.87s
пользов.     0m7.70s
сист.        0m0.18s
Обычный ввод:
    57625 страниц загружено
    57809 страниц загружено
Обычный вывод:
   165811 страниц выгружено
   165882 страниц выгружено
Вывод в пространство подкачки:
    11010 страниц выгружено в пространство подкачки
    11061 страниц выгружено в пространство подкачки
Ввод из пространства подкачки:
     6623 страниц загружено из пространства подкачки
     6701 страниц загружено из пространства подкачки

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

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

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

Для снятия ограничений на доступный объем памяти введите команду:

# rmss -r

Эта команда разрешает операционной системе использовать память, заблокированную командой rmss, то есть восстанавливает обычный объем оперативной памяти в системе.


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