Процессор - это один из самых быстрых компонентов системы. Одна программа редко способна полностью загрузить процессор (когда процессор не совсем не простаивает и не находится в состоянии ожидания) больше чем на несколько секунд. Даже в многопользовательских системах с большой нагрузкой иногда возникают периоды длительностью 10 миллисекунд, когда все нити находятся в состоянии ожидания. Если в выводе монитора указано, что процессор загружен на 100 процентов в течение длительного времени, то, скорее всего, одна из программ зациклилась. Даже если программа не содержит ошибку, а просто потребляет много процессорного времени, необходимо изменить ее алгоритм.
В первую очередь нужно вызвать команду vmstat, которая предоставляет краткую информацию о различных ресурсах системы и связанных с ними неполадках, приводящих к снижению производительности. Отчет команды vmstat содержит статистическую информацию о нитях ядра, находящихся в очереди выполнения и ожидающих запуска, а также об оперативной памяти, подкачке, дисках, прерываниях, системных вызовах, переключении контекста и работе процессора. В информации о процессоре указывается доля времени, в течение которого процессор работал в пользовательском режиме, системном режиме, простаивал и ожидал завершения операции дискового ввода-вывода.
Примечание: Если, не считая периодичности создания отчетов и числа отчетов, в команде vmstat параметры указаны не будут (например, vmstat 2 10), то в первой строке вывода будут указаны средние значения параметров, подсчитанные за время с момента загрузки системы.
Для получения информации о работе процессора удобнее использовать команду vmstat, а не iostat, так как ее построчный вывод проще анализировать, а в случае, когда к системе подключено много дисков, ее вывод намного менее объемный. Приведенный ниже пример иллюстрирует применение vmstat для обнаружения программ, которые потребляют слишком много ресурсов CPU.
# vmstat 2 нити память страница ошибки cpu ----- ----------- ------------------------ ------------ ----------- r b avm fre re pi po fr sr cy in sy cs us sy id wa 1 0 22478 1677 0 0 0 0 0 0 188 1380 157 57 32 0 10 1 0 22506 1609 0 0 0 0 0 0 214 1476 186 48 37 0 16 0 0 22498 1582 0 0 0 0 0 0 248 1470 226 55 36 0 9 2 0 22534 1465 0 0 0 0 0 0 238 903 239 77 23 0 0 2 0 22534 1445 0 0 0 0 0 0 209 1142 205 72 28 0 0 2 0 22534 1426 0 0 0 0 0 0 189 1220 212 74 26 0 0 3 0 22534 1410 0 0 0 0 0 0 255 1704 268 70 30 0 0 2 1 22557 1365 0 0 0 0 0 0 383 977 216 72 28 0 0 2 0 22541 1356 0 0 0 0 0 0 237 1418 209 63 33 0 4 1 0 22524 1350 0 0 0 0 0 0 241 1348 179 52 32 0 16 1 0 22546 1293 0 0 0 0 0 0 217 1473 180 51 35 0 14
Этот пример показывает результаты запуска зацикленной программы в многопользовательской системе с большой нагрузкой. Первые три отчета (итоговый отчет был удален) показывают, что система была загружена на 50-55 процентов пользовательскими процессами, на 30-35 процентов - задачами системы, а 10-15 процентов пришлось на задержки ввода-вывода. После запуска зацикленной программы она забирает все свободные ресурсы CPU. Так как зацикленная программа не запрашивает операции ввода-вывода, она может получить все процессорное время, которое не используется другими программами, ожидающими завершения операций ввода-вывода. Кроме этого, такая программа всегда готова забрать ресурсы CPU, когда другой процесс их освобождает. При этом она не обязательно отдаст эти ресурсы другому процессу, так как приоритеты всех фоновых процессов одинаковы. Программа работает примерно 10 секунд (группа из пяти отчетов), после чего система возвращается в обычный режим работы (об этом говорят следующие отчеты команды vmstat).
Если в системе поступает большое число прерываний от различных устройств, то статистическая информация о CPU может быть несколько искажена. Это связано с тем, что утилита считывает значения параметров при поступлении прерывания от таймера. Таймер относится к устройствам с самым низким приоритетом, поэтому его прерывания будут обрабатываться в последнюю очередь. Для того чтобы избежать подобного искажения информации, в операционных системах AIX версии старше 4.3.3 применяется другой способ измерения значений.
Примечание: Для систем SMP в столбцах us, sy, id и wa указываются средние значения по всем процессорам (статистическую информацию об отдельных процессорах можно получить с помощью команды sar). Помните, что время ожидания завершения операции ввода-вывода не отражает фактическое время ожидания отдельного процессора. Это глобальное значение. Время ожидания завершения ввода-вывода отличается от времени простоя на то количество времени, которое было затрачено на ожидающие операции дискового ввода-вывода. Если есть ожидающая операция ввода-вывода, и процессор не занят, то это время прибавляется к времени ожидания завершения ввода-вывода. В операционной системе AIX версии 4.3.3 и выше применяется усовершенствованный способ подсчета процессорного времени, затраченного на ожидание завершения дискового ввода-вывода (время wio). Более подробная информация по этому вопросу приведена в разделе Подсчет времени ожидания завершения ввода-вывода.
Оптимальной является ситуация, когда процессор работает 100 процентов времени. Это условие всегда выполняется в однопользовательской системе, если в ней нет конкуренции за процессор. В общем случае, если суммарное время us + sy меньше 90 процентов, то считается, что производительность однопользовательской системы не ограничена ресурсами CPU. Однако если значение us + sy в многопользовательской системе превышает 80 процентов, то некоторые процессы часть времени находятся в состоянии ожидания. Это может отрицательно сказаться на времени ответа и скорости работы приложений.
Для того чтобы узнать, служат ли ресурсы процессора причиной снижения производительности системы, изучите значения, указанные в четырех столбцах cpu и двух столбцах нить (нить ядра) вывода команды vmstat. Кроме того, обратите внимание на столбец ошибки:
Распределение времени CPU в течение интервала времени. В столбцах cpu указывается следующее:
В столбце us указывается, какая доля времени CPU (в процентах) была затрачена на работу в пользовательском режиме. Процессы UNIX могут выполняться в пользовательском или системном режиме (режиме ядра). При работе в пользовательском режиме процесс выполняется в рамках приложения. Ему не требуются ресурсы ядра для выполнения вычислений, управления памятью и настройки переменных.
В столбце sy указывается, какая доля времени процессора была затрачена на выполнение процессов в системном режиме. Это значение отражает ресурсы CPU, которые были затрачены на выполнение процессов ядра (kprocs) и других процессов, использующих ресурсы ядра. Для получения доступа к ресурсам ядра процесс отправляет системный вызов, в результате чего он переключается в системный режим. Например, при выполнении операции чтения или записи данных в файл ресурсы ядра применяются для открытия файла, смещения указателя в нужную позицию и последующего чтения или записи данных (если файл еще не загружен в оперативную память).
В столбце id указывается, какую долю времени (в процентах) процессор простаивал, не ожидая завершения локальной операции дискового ввода-вывода. Если ни одна нить не готова к работе (очередь выполнения пуста), то система запускает специальный процесс wait. В системе SMP нить wait может быть запущена на каждом процессоре. В отчете команды ps (запущенной с опцией -k или -g 0) этот процесс указывается как kproc или wait. В однопроцессорной системе ИД этого процесса (PID) обычно равен 516. В системах SMP процесс kproc будет указан для каждого процессора в отдельности. Если в отчете ps указано, что на эту нить в целом затрачивается много времени, то это означает, что существуют большие промежутки времени, в течение которых ни одна нить не готова к работе и не ожидает запуска. Следовательно, система преимущественно простаивает, ожидая появления новых задач.
Если нет ожидающих операций ввода-вывода на локальный диск, то все время, указанное как время ожидания, задает время простоя. В операционной системе версии 4.3.2 и более младших версий все время доступа к удаленным дискам (дискам NFS) добавлялось к времени простоя (за исключением небольшого интервала времени sy, необходимого для выполнения запросов NFS), так как сетевые диски не относятся к локальным. В AIX версии 4.3.3 и выше все операции с NFS выполняются через кэш буферов, поэтому время ожидания выполнения этих операций прибавляется к значению wa.
В столбце wa указывается доля времени, в течение которого процессор простаивал, ожидая завершения операции ввода-вывода на локальный диск (в AIX версии 4.3.3 и выше это значение учитывает и обращения к дискам NFS). Если во время выполнения процесса wait в системе есть хотя бы один процесс, ожидающий выполнения ввода-вывода, то это время рассматривается как время ожидания завершения операции ввода-вывода. За исключением случаев, когда операции ввода-вывода выполняются асинхронно с процессом, процесс блокируется на время выполнения запросов на обмен данными с диском. После выполнения запроса на ввод-вывод процесс снова помещается в очередь выполнения. Чем быстрее выполняется обмен данными с диском, тем больше времени CPU будет тратиться на выполнение процессов.
Если значение wa больше 25 процентов, то можно сделать вывод, что дисковая подсистема плохо сбалансирована, либо в системе выполняется очень много дисковых операций ввода-вывода.
Информация о новом способе вычисления значения wa приведена в разделе Подсчет времени ожидания завершения ввода-вывода.
Указывает среднее число нитей ядра, которые каждую секунду находились в различных очередях в течение интервала сбора информации (отражает изменение состояния). В столбцах нити указывается следующее:
Среднее число нитей ядра, которые каждую секунду находятся в очереди выполнения. Это значение задает число нитей, готовых к запуску. Для всех систем, за исключением SMP, оно должно быть меньше пяти. В системах SMP это число должно быть не меньше следующего значения:
5 x (Ntotal - Nbind)
Здесь Ntotal - это общее число процессоров, а Nbind - это число процессоров, которые связаны с определенными процессами, например, с помощью команды bindprocessor.
Если это значение быстро растет, то проверьте правильность работы приложений. Некоторые системы могут нормально работать, даже если в очереди выполнения находится от 10 до 15 нитей, поскольку все зависит от назначения нитей и времени их выполнения.
Среднее число нитей ядра, которые каждую секунду находятся в очереди ожидания. В этой очереди находятся нити, ожидающие освобождения ресурса или выполнения операции ввода-вывода. Кроме того, в эту очередь помещаются нити, ожидающие загрузки одной из своих страниц в оперативную память. Обычно это значение близко к нулю. Однако если число нитей в очереди выполнения увеличивается, то, как правило, длина очереди ожидания также увеличивается. Если в течение одной секунды одновременно было активировано несколько нитей, то длина очереди выполнения может быть довольно большой. При этом показатель использования процессора может быть довольно низким, если эти нити были сразу же приостановлены.
Если процессы в системе приостанавливаются из-за перегрузки памяти, то прирост нитей отражает именно значение в столбце b отчета vmstat, а не число нитей в очереди выполнения.
В выводе команды vmstat -I это значение указывает, сколько нитей каждую секунду ожидают выполнения ввода-вывода на физический диск.
Здесь указывается информация об управлении процессами, в том числе число прерываний. В столбцах ошибки содержатся следующие значения:
Число прерываний, поступавших от устройств каждую секунду в течение интервала сбора информации. Дополнительная информация по этому вопросу приведена в разделе Получение информации о производительности дисков с помощью команды vmstat.
Число системных вызовов, отправлявшихся каждую секунду в течение интервала сбора информации. Пользовательские процессы получают доступ к ресурсам путем отправки стандартных системных вызовов. Эти вызовы отправляют ядру запрос на выполнение необходимой операции, а также служат для обмена данными между ядром и процессом. Допустимое число системных вызовов в секунду зависит от особенностей конкретной рабочей схемы и ее приложений, а также функций, выполняемых системными вызовами. Однако если значение sy достигает 10000 вызовов в однопроцессорной системе (в системе SMP - 10000 вызовов в секунду для каждого процессора), то рекомендуется провести дальнейшее исследование ситуации. Одной из причин увеличения числа системных вызовов может быть запуск опрашивающей процедуры, например, процедуры select(). Рекомендуется измерить значение sy при выполнении базовых операций в системе, и в дальнейшем применять его для сравнения.
Число переключений контекста, выполнявшихся каждую секунду в течение интервала сбора информации. Все время работы процессора разделяется на логические кванты времени по 10 миллисекунд. Любая нить выполняется до тех пор, пока не истечет квант времени, пока она не будет замещена нитью с более высоким приоритетом, либо пока она добровольно не передаст управление другой нити. Когда управление передается другой нити, контекст, или рабочая среда, предыдущей нити сохраняется, а вместо него загружается контекст текущей нити. В операционной системе предусмотрена очень эффективная процедура переключения контекста, поэтому на переключение контекста тратится лишь незначительная часть ресурсов. Однако при значительном росте числа переключений контекста, например, когда значение cs становится намного больше скорости дискового ввода-вывода и скорости передачи пакетов по сети, необходимо дополнительно проанализировать ситуацию.
Команда iostat позволяет получить приблизительное представление о расходе ресурсов системы. Она может применяться не только для обнаружения неполадок дискового ввода-вывода, приводящих к снижению производительности (см. Получение информации о производительности дисков с помощью команды iostat). С ее помощью можно получить статистическую информацию об использовании процессора.
В приведенном ниже примере показан фрагмент вывода команды iostat. В первом разделе указываются суммарные значения параметров, накопленные с момента запуска системы.
# iostat -t 2 6 tty: tin tout avg-cpu: % user % sys % idle % iowait 0.0 0.8 8.4 2.6 88.5 0.5 0.0 80.2 4.5 3.0 92.1 0.5 0.0 40.5 7.0 4.0 89.0 0.0 0.0 40.5 9.0 2.5 88.5 0.0 0.0 40.5 7.5 1.0 91.5 0.0 0.0 40.5 10.0 3.5 80.5 6.0
В столбцах с информацией о CPU (% user, % sys, % idle, and % iowait) указывается распределение времени процессора. В выводе команды vmstat эта информация выводится в столбцах us, sy, id и wa. Более подробная информация об этих значениях приведена в разделе Команда vmstat. Кроме того, ознакомьтесь с информацией о новом способе вычисления значения %iowait, приведенной в разделе Получение информации о времени ожидания завершения ввода-вывода.
Команда sar собирает статистическую информацию о работе системы. Хотя она позволяет получить полезную информацию о производительности, ее выполнение создает значительную нагрузку на систему, что может привести к дальнейшему снижению производительности. Это особенно важно учитывать, если команда sar создает отчеты через короткие промежутки времени. Тем не менее, команда sar удобнее, чем пакет программ для учета ресурсов. В системе предусмотрен ряд счетчиков для различных операций, выполняемых в системе. Команда sar создает отчеты на основе показаний этих счетчиков. Значения этих счетчиков обновляются автоматически, поэтому их обновление никак не связано с запуском команды sar. Эта команда просто считывает и сохраняет показания счетчиков, причем число измерений и их периодичность задаются при запуске команды sar.
В команде sar предусмотрено большое число опций, позволяющих получить информацию об очередях, подкачке, терминалах и других устройствах. Одной из важных особенностей команды sar является то, что она может создавать как отчеты с информацией об использовании всех процессоров системы в целом (такие отчеты содержат средние значения в процентах и суммарные значения), так и отчеты с информацией по каждому процессору в отдельности. Следовательно, эта команда будет особенно полезна в системах SMP.
Существует три способа применения команды sar:
Для того чтобы запустить команду, которая собирает статистическую информацию о работе системы и сразу же выводит ее на экран, введите:
# sar -u 2 5 AIX texmex 3 4 000691854C00 01/27/00 17:58:15 %usr %sys %wio %idle 17:58:17 43 9 1 46 17:58:19 35 17 3 45 17:58:21 36 22 20 23 17:58:23 21 17 0 63 17:58:25 85 12 3 0 Среднее 44 15 5 35
Выше приведен пример вывода команды, запущенной на однопользовательской рабочей станции для сбора информации об использовании CPU.
С помощью опций -o и -f вы можете разбить работу команды на два этапа: сначала записать собранные данные в пользовательский файл данных, а затем просмотреть данные из этого файла. Это позволяет сэкономить ресурсы, когда команда запускается в системе, искусственно переведенной в то состояние, в котором возникла неполадка. Полученные данные можно проанализировать на другом компьютере, перенеся в него двоичный файл вывода, так как он содержит всю информацию, необходимую для работы команды sar.
# sar -o /tmp/sar.out 2 5 > /dev/null
Приведенная выше команда запускает утилиту sar в фоновом режиме, собирает данные о работе системы пять раз с периодичностью в 2 секунды и сохраняет полученный неотформатированный вывод в файле /tmp/sar.out. Вывод перенаправляется в файл для того, чтобы не показывать его на экране.
Приведенная ниже команда считывает информацию об использовании CPU из созданного ранее файла и выводит отформатированный отчет на стандартное устройство вывода:
# sar -f/tmp/sar.out AIX texmex 3 4 000691854C00 01/27/00 18:10:18 %usr %sys %wio %idle 18:10:20 9 2 0 88 18:10:22 13 10 0 76 18:10:24 37 4 0 59 18:10:26 8 2 0 90 18:10:28 20 3 0 77 Среднее 18 4 0 78
Собранный двоичный файл данных содержит всю информацию, необходимую для создания отчетов. С его помощью можно получить любой отчет команды sar. За счет этого вы можете просмотреть информацию об использовании процессоров системы SMP в однопроцессорной системе.
Для доступа к системным данным команда sar вызывает процесс sadc. Демон cron запускает два сценария оболочки (/usr/lib/sa/sa1 и /usr/lib/sa/sa2), которые каждый день создают отчеты и выдают статистическую информацию. Файл crontab /var/spool/cron/crontabs/adm содержит разделы, которые изначально помещены в комментарий. В этих разделах указывается, когда демон cron должен запускать сценарии оболочки.
Ниже приведен вариант файла crontab для пользователя adm. Он отличается от исходного файла только тем, что в нем удалены символы комментария для интервалов сбора данных:
#================================================================= # Отчеты о работе системы создаются: # В рабочие дни с 8 утра до 5 вечера - каждые 20 минут; # В субботу и воскресенье - каждый час; # Каждый день с 6 вечера до 7 утра - каждый час. # Ежедневный отчет создается в 18:05. #================================================================= 0 8-17 * * 1-5 /usr/lib/sa/sa1 1200 3 & 0 * * * 0,6 /usr/lib/sa/sa1 & 0 18-7 * * 1-5 /usr/lib/sa/sa1 & 5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 3600 -ubcwyaqvm & #=================================================================
Такой способ сбора информации позволяет получить представление о том, насколько интенсивно система используется в течение определенного периода времени, и определить часы пиковой нагрузки.
Ниже перечислены некоторые полезные опции команды sar, позволяющие получить информацию об использовании CPU:
Опция -P позволяет получить статистическую информацию об указанных процессорах. Если будет указано ключевое слово ALL, то команда выдаст информацию по каждому процессору в отдельности и средние значения по всем процессорам. С флагом -P можно указывать только флаги -a, -c, -m, -u и -w.
Ниже приведен пример вывода команды, запущенной в системе, в которой процессор 0 связан с определенным процессом:
# sar -P ALL 2 3 AIX rugby 3 4 00058033A100 01/27/00 17:30:50 cpu %usr %sys %wio %idle 17:30:52 0 8 92 0 0 1 0 4 0 96 2 0 1 0 99 3 0 0 0 100 - 2 24 0 74 17:30:54 0 12 88 0 0 1 0 3 0 97 2 0 1 0 99 3 0 0 0 100 - 3 23 0 74 17:30:56 0 11 89 0 0 1 0 3 0 97 2 0 0 0 100 3 0 0 0 100 - 3 23 0 74 Среднее 0 10 90 0 0 1 0 4 0 96 2 0 1 0 99 3 0 0 0 100 - 3 24 0 74
В поле cpu последней строки каждого раздела, начинающейся с дефиса (-), указано среднее значение по всем процессорам. Строка средних значений (-) выводится только в том случае, если задана опция -P ALL. Если в команде указан конкретный процессор, то эта строка удаляется. Последний раздел, в начале которого вместо системного времени указано слово Average, содержит средние значения параметров отдельных процессоров, вычисленные исходя из значений этих параметров во всех предыдущих разделах.
Ниже приведен пример вывода команды vmstat, полученного за тот же период времени:
# vmstat 2 5 нити память страница ошибки cpu ----- ----------- ------------------------ ------------ ------------ r b avm fre re pi po fr sr cy in sy cs us sy id wa 0 0 5636 16054 0 0 0 0 0 0 116 266 5 0 1 99 0 1 1 5733 15931 0 0 0 0 0 0 476 50781 35 2 27 70 0 1 1 5733 15930 0 0 0 0 0 0 476 49437 27 2 24 74 0 1 1 5733 15930 0 0 0 0 0 0 473 48923 31 3 23 74 0 1 1 5733 15930 0 0 0 0 0 0 466 49383 27 3 23 74 0
В первой строке указаны суммарные значения, накопленные с момента запуска системы. Вторая строка отражает запуск команды sar, а все последующие строки сравнимы с отчетом команды sar. Команда vmstat выводит только средние значения использования всех процессоров. Эти значения аналогичны значениям, указанным в строках отчета команды sar, помеченных дефисами ( -).
Эта команда выводит информацию об использовании CPU. Такое действие выполняется по умолчанию, если не заданы другие флаги. Вывод этой команды совпадает со статистической информацией о работе процессора, которая выдается командами vmstat и iostat.
В приведенном ниже примере во время работы команды была запущена команда копирования:
# sar -u -P ALL 1 5 AIX rugby 3 4 00058033A100 10/07/99 13:33:42 cpu %usr %sys %wio %idle 13:33:43 0 0 0 0 100 1 0 0 0 100 2 0 0 0 100 3 0 0 0 100 - 0 0 0 100 13:33:44 0 2 66 0 32 1 0 1 0 99 2 0 0 0 100 3 0 1 0 99 - 0 17 0 82 13:33:45 0 1 52 44 3 1 0 1 0 99 2 0 4 0 96 3 0 0 0 100 - 0 14 11 74 13:33:46 0 0 8 91 1 1 0 0 0 100 2 0 0 0 100 3 0 1 0 99 - 0 2 23 75 13:33:47 0 0 7 93 0 1 0 0 0 100 2 0 1 0 99 3 0 0 0 100 - 0 2 23 75 Среднее 0 1 27 46 27 1 0 0 0 100 2 0 1 0 99 3 0 0 0 100 - 0 7 11 81
На процессоре 0 была запущена команда cp, а три остальных процессора простаивают. Этот пример демонстрирует одно из отличий операционной системы версии 4.3.3 от предыдущих версий (см. Получение информации о времени ожидания завершения ввода-вывода).
Опция -c позволяет просмотреть частоту отправки системных вызовов.
# sar -c 1 3 19:28:25 scall/s sread/s swrit/s fork/s exec/s rchar/s wchar/s 19:28:26 134 36 1 0.00 0.00 2691306 1517 19:28:27 46 34 1 0.00 0.00 2716922 1531 19:28:28 46 34 1 0.00 0.00 2716922 1531 Среднее 75 35 1 0.00 0.00 2708329 1527
В отличие от команды vmstat, команда sar выдает информацию о том, какие именно системные вызовы выполнялись: read(), write(), fork(), exec() и т.д. Обратите особое внимание на столбец fork/s. Если значение в этом столбце велико, то рекомендуется собрать более подробную информацию с помощью утилит учета ресурсов, команды trace или команды tprof.
Опция -q позволяет просмотреть размер очереди выполнения и очереди подкачки.
# sar -q 5 3 19:31:42 runq-sz %runocc swpq-sz %swpocc 19:31:47 1.0 100 1.0 100 19:31:52 2.0 100 1.0 100 19:31:57 1.0 100 1.0 100 Среднее 1.3 95 1.0 95
С помощью опции -q можно проверить, что в системе не запущено слишком большое число заданий (runq-sz), и что подкачка не служит причиной снижения производительности. В системе с большим числом транзакций, например, Enterprise Resource Planning (ERP), очередь выполнения может содержать сотни нитей, так как на выполнение каждой транзакции затрачивается очень маленькая доля времени CPU. Если подкачка служит причиной снижения производительности, вызовите команду vmstat. Если в выводе этой команды будет указано, что на ожидание выполнения операций ввода-вывода затрачивается много времени, то в системе многие процессы конкурируют за доступ к диску, либо из-за нехватки памяти часто выполняются операции загрузки и выгрузки страниц.
Программа xmperf позволяет просмотреть информацию об использовании CPU в виде динамически изменяющейся диаграммы. Подробное описание программы xmperf можно найти в руководстве Performance Toolbox Version 2 and 3 for AIX: Guide and Reference.