Для оценки показателей использования ресурсов в многопользовательской системе рекомендуется воспользоваться командой 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, то есть восстанавливает обычный объем оперативной памяти в системе.