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

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


Управление работой процессора

В операционной системе AIX версии 4 для распределения времени процессора стали применяться нити, однако большинство инструментов управления системой по-прежнему работают не с нитями, а с процессами, к которым относятся эти нити.

Управление приоритетом пользовательских процессов

Для изменения приоритета пользовательских процессов предусмотрены команды nice и renice, а также функция setpri(). Для просмотра приоритета предназначена команда ps. Общая информация о приоритетах приведена в разделе Приоритеты процессов и нитей.

Вычисление приоритета позволяет решить следующие задачи:

В различных выпусках операционной системы пользователю предоставляет разная степень свободы в изменении приоритета. Алгоритм вычисления приоритета, применявшийся в AIX версии 4.3.1 и ниже в значительной мере ограничивал возможности пользователя. Новый алгоритм, появившийся в AIX версии 4.3.2, предоставляет более гибкие возможности для управления приоритетом пользовательских нитей. В частности, усилилось различие между интерактивными и фоновыми процессами. Кроме того, изменение значения nice оказывает большее влияние на использование процессора, чем в предыдущих версиях. За дополнительной информацией обратитесь к разделу Вычисление приоритета.

Изменение значения приоритета с помощью команды nice

С помощью команды nice любой пользователь может уменьшить приоритет команды. Увеличить приоритет команды с помощью утилиты nice может только пользователь root. В этом случае возможные значения параметра команды nice лежат в пределах от -20 до 19.

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

Для интерактивных процессов значение nice по умолчанию равно 20 (для фоновых процессов ksh - 24). Приведенная ниже команда запускает команду vmstat в интерактивном режиме со значением nice, равным 25 (вместо 20), таким образом понижая приоритет этой команды.

# nice -n 5 vmstat 10 3 > vmstat.out

Пользователь root может повысить приоритет команды vmstat с помощью следующей команды:

# nice -n -5 vmstat 10 3 > vmstat.out

Если пользователь, запустивший указанную выше команду nice, не является пользователем root, то значение nice команды vmstat не изменится (останется равным 20). При этом команда nice не выдаст никакого сообщения об ошибке.

Настройка фиксированного приоритета с помощью функции setpri

Приложение, запущенное от имени пользователя root, может установить приоритет своего или любого другого процесса с помощью функции setpri(). Например:

retcode = setpri(0,59);

установит для текущего процесса фиксированный приоритет 59. Если функции setpri() не удается изменить приоритет, она возвращает значение -1.

Приведенная ниже программа получает из командной строки значение приоритета и список идентификаторов процессов и устанавливает для всех процессов указанный приоритет.

/*
   fixprocpri.c
   Формат: fixprocpri приоритет PID . . .
*/
 
#include <sys/sched.h>
#include <stdio.h>
#include <sys/errno.h>
 
main(int argc,char **argv)
{
   pid_t ProcessID;
   int Priority,ReturnP;
 
   if( argc < 3 ) {
      printf(" Формат: setpri приоритет список-PID \n");
      exit(1);
   }
 
   argv++;
   Priority=atoi(*argv++);
   if ( Priority < 50 ) {
      printf(" Значение приоритета должно быть >= 50 \n");
      exit(1);
   }
 
   while (*argv) {
      ProcessID=atoi(*argv++);
      ReturnP = setpri(ProcessID, Priority);
      if ( ReturnP > 0 )
          printf("pid=%d новый приоритет=%d  старый приоритет=%d\n",
            (int)ProcessID,Priority,ReturnP);
      else {
          perror(" ошибка setpri ");
            exit(1);
      }
   }
}

Просмотр приоритета процесса с помощью команды ps

Команда ps с флагом -l (строчная L) позволяет просмотреть значения nice и текущие приоритеты указанных процессов. Например, для того чтобы узнать приоритеты процессов, запущенных пользователем nobody, введите следующую команду:

# ps -lu nobody
       F S UID  PID PPID   C PRI NI ADDR    SZ    WCHAN    TTY  TIME CMD
  241801 S 200 7032 7286   0  60 20 1b4c   108           pts/2  0:00 ksh
  200801 S 200 7568 7032   0  70 25 2310    88  5910a58  pts/2  0:00 vmstat
  241801 S 200 8544 6494   0  60 20 154b   108           pts/0  0:00 ksh

Данная команда отражает результат запуска команды nice -n 5, описанной выше. Для процесса 7568 установлен приоритет 70. (Команда ps выполнялась в отдельном сеансе в режиме root - поэтому показаны два разных терминала).

Если один из процессов установит для себя фиксированный приоритет с помощью функции setpri(10758, 59), то вывод команды ps -l будет выглядеть следующим образом:

       F S UID   PID  PPID   C PRI NI ADDR    SZ    WCHAN    TTY  TIME CMD
  200903 S   0 10758 10500   0  59 -- 3438    40  4f91f98  pts/0  0:00 fixpri

Изменение приоритета с помощью команды renice

Команда renice изменяет значение nice (а, следовательно, и приоритет) уже запущенного процесса. Для выбора процесса можно задать идентификатор процесса, ИД группы процессов или имя пользователя, которому он принадлежит.

В AIX версии 4 формат команды renice был изменен для поддержки альтернативного формата команды nice, в котором приращение значения nice указывается с флагом -n.

С помощью команды renice нельзя изменить фиксированный приоритет процесса. Увеличить значение nice может любой пользователь. Уменьшить это значение может только пользователь root. Данная команда изменяет значения nice указанных процессов. Однако их приоритет не фиксируется. Пользователь root может указать в команде renice значение от -20 до 20. Таким образом, он может уменьшить значение nice процесса.

В продолжение нашего примера изменим командой renice значение nice процесса vmstat, запущенного с помощью команды nice.

# renice -n -5 7568
# ps -lu nobody
       F S UID  PID PPID   C PRI NI ADDR    SZ    WCHAN    TTY  TIME CMD
  241801 S 200 7032 7286   0  60 20 1b4c   108           pts/2  0:00 ksh
  200801 S 200 7568 7032   0  60 20 2310    92  5910a58  pts/2  0:00 vmstat
  241801 S 200 8544 6494   0  60 20 154b   108           pts/0  0:00 ksh

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

# renice -n 5 7569
# ps -lu nobody
       F S UID  PID PPID   C PRI NI ADDR    SZ    WCHAN    TTY  TIME CMD
  241801 S 200 7032 7286   0  60 20 1b4c   108           pts/2  0:00 ksh
  200801 S 200 7568 7032   1  70 25 2310    92  5910a58  pts/2  0:00 vmstat
  241801 S 200 8544 6494   0  60 20 154b   108           pts/0  0:00 ksh

В данном примере предполагалось, что команда renice запускается пользователем root. Если команда renice запускается обычным пользователем, действуют два важных ограничения:

Формат команд nice и renice

В командах nice и renice приращение значения nice можно указать разными способами.

В AIX версии 4 формат команды renice был изменен для поддержки альтернативного формата команды nice, в котором приращение значения nice указывается с флагом -n.

Команда Команда Итоговое значение nice Минимальное значение приоритета в AIX 4.3.1 Минимальное значение приоритета в AIX 4.3.2 и выше
nice -n 5 renice -n 5 25 65 70
nice -n +5 renice -n +5 25 65 70
nice -n -5 renice -n -5 15 55 55

Настройка вычисления приоритета нитей

В данном разделе описана процедура настройки, в которой применяются следующие средства:

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

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

# lslpp -lI bos.adt.samples

Вычисление приоритета

Приоритет вычисляется по следующей формуле:

приоритет = базовый-приоритет + значение-nice +
штраф-за-использование-процессора

Показатель использования процессора, связанный с нитью, увеличивается на единицу каждый раз, когда при возникновении прерывания (раз в 10 миллисекунд) выясняется, что процессор выполняет данную нить. Его значение указано в столбце C вывода команды ps. Максимальное значение показателя равно 120.

По умолчанию штраф за использование процессора вычисляется путем умножения показателя использования процессора на коэффициент 0,5. Данный коэффициент кратен параметру R (по умолчанию равен 16). Ниже приведена точная формула:

Штраф-за-использование-процессора = C * R/32

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

C = C * D/32

Алгоритм, применяемый в AIX 4.3.1, не обеспечивает достаточной разницы в значении приоритета интерактивных и фоновых процессов. В AIX версии 4.3.2 применяется новый алгоритм вычисления приоритета, обеспечивающий большее влияние значения nice на приоритет. С ростом времени процессора, затраченного на выполнение процесса, приоритет процесса уменьшается пропорционально значению nice. С помощью команды schedtune -r -d можно повлиять на алгоритм вычисления приоритета, изменив значения R и D. За дополнительной информацией обратитесь к разделу Настройка вычисления приоритета с помощью команды schedtune.

Данный алгоритм не влияет на работу нитей, для которых установлено значение nice по умолчанию (20). Они будут работать так же, как и в AIX выпуска 4.3.1 и более младших выпусках. Когда значение nice отлично от значения по умолчанию, оно сильнее влияет на приоритет процесса.

Вначале вычисляется следующее значение:

p_nice = стандартный_приоритет + значение_nice

Затем вычисляется вспомогательная величина x_nice по следующей формуле:

Если базовый_приоритет > 60,
   то x_nice = (p_nice * 2) - 60,
   иначе x_nice = p_nice.

Это означает, что если значение nice больше 20, то оно в два раза сильнее влияет на значение приоритета, чем если бы оно было меньше или равно 20. Ниже приведена новая формула, по которой вычисляется приоритет (без учета округления до целого значения):

приоритет = x_nice + [(x_nice + 4)/64 * C*(R/32)]

Примечание: Если значение nice равно 20 (значение по умолчанию), то данная формула дает тот же результат, что и формула, применяемая в AIX 4.3.1.

Настройка вычисления приоритета с помощью команды schedtune

Для изменения способа вычисления приоритета в команде schedtune предусмотрены две опции: -r и -d. В каждой опции указывается целое значение от 0 до 32. Существующие значения коэффициентов умножаются на значения параметров, а затем делятся на 32. По умолчанию значения r и d равны 16. При этом (D=R=16)/32=0,5. Эти значения существенно влияют на расчет приоритетов. Например:

# /usr/samples/kernel/schedtune -r 0

[(R=0)/32=0, (D=16)/32=0,5] означает, что штраф за использование процессора будет равен 0. В этом случае приоритет будет зависеть только от значения nice. Фоновые процессы не получат процессорного времени до тех пор, пока можно выполнять хотя бы один интерактивный процесс. Приоритеты нитей изменяться не будут, хотя формально их приоритет не фиксирован.

# /usr/samples/kernel/schedtune -r 5

[(R=5)/32=0,15625, (D=16)/32=0,5] установит режим, при котором интерактивный процесс будет выполняться бесконечно, если параллельно запущен фоновый процесс с помощью команды nice -n 10. Ограничение в 120 квантов времени означает, что максимальный штраф за использование процессора, который может быть назначен интерактивному процессу, равен 18.

# /usr/samples/kernel/schedtune -r 6 -d 16

В случае [(R=6)/32=0,1875, (D=16)/32=0,5] фоновый процесс, запущенный с помощью команды nice -n 10, получит управление не ранее, чем через одну секунду. При этом интерактивный процесс будет сохранять приоритет при использовании процессора. Долго работающие интерактивные процессы (которые могли бы быть запущены в фоновом режиме) получат достаточно большой штраф за использование процессора, чтобы не мешать фоновым процессам.

# /usr/samples/kernel/schedtune -r 32 -d 32

В случае [(R=32)/32=1, (D=32)/32=1] долго работающие нити достигнут показателя использования процессора, равного 120, после чего будут конкурировать только на основе значений nice. Новые нити будут получать более высокий приоритет независимо от значений nice до тех пор, пока штраф за использование процессора не понизит их приоритет до уровня существующих нитей.

Ниже приведены некоторые рекомендации по настройке значений R и D:

Если вы решите, что для оптимальной работы в вашей среде необходимо изменить по крайней мере один из этих параметров, вызовите команду schedtune, войдя в систему как пользователь root. Изменения будут действовать до следующего вызова команды schedtune или до перезагрузки системы. Для того чтобы восстановить значения по умолчанию, вызовите команду schedtune -D. Следует помнить, что такая команда восстанавливает значения по умолчанию для всех параметров schedtune, в том числе для параметров управления нагрузкой на память VMM. Для того чтобы измененные значения устанавливались при каждой загрузке системы, необходимо внести соответствующие изменения в файл /etc/inittab.

Пример вычисления приоритета

В данном примере предполагается, что значение R равно 4, значение D равно 31, и в системе не выполняются другие нити:

действующий_приоритет
                  | базовый_приоритет
                  |    | значение_nice
                  |    |    | счетчик (затраченных квантов времени)
                  |    |    |    | (schedtune -r)
                  |    |    |    |     |
  время 0          p = 40 + 20 + (0   * 4/32) =   60
  время 10 мс      p = 40 + 20 + (1   * 4/32) =   60
  время 20 мс      p = 40 + 20 + (2   * 4/32) =   60
  время 30 мс      p = 40 + 20 + (3   * 4/32) =   60
  время 40 мс      p = 40 + 20 + (4   * 4/32) =   60
  время 50 мс      p = 40 + 20 + (5   * 4/32) =   60
  время 60 мс      p = 40 + 20 + (6   * 4/32) =   60
  время 70 мс      p = 40 + 20 + (7   * 4/32) =   60
  время 80 мс      p = 40 + 20 + (8   * 4/32) =   61
  время 90 мс      p = 40 + 20 + (9   * 4/32) =   61
  время 100 мс      p = 40 + 20 + (10  * 4/32) =   61
        .
  (пропуск до 1000 мс, или 1 с)
        .
  время 1000 мс    p = 40 + 20 + (100 * 4/32) =   72
  время 1000 мс    планировщик пересчитывает счетчики использования
                  процессора для всех процессов. Для данного процесса:
                            новый_показатель_использования_процессора = 100 * 31/32 = 96  (если d=31)
                  после уменьшения планировщиком: p = 40 + 20 + ( 96 * 4/32) = 72
                  (если d=16, то p = 40 + 20 + (100/2 * 4/32) = 66)
  время 1010 мс    p = 40 + 20 + ( 97 * 4/32) =   72
  время 1020 мс    p = 40 + 20 + ( 98 * 4/32) =   72
  время 1030 мс    p = 40 + 20 + ( 99 * 4/32) =   72
                 ..
 время 1230 мс    p = 40 + 20 + (119 * 4/32) =   74
 время 1240 мс    p = 40 + 20 + (120 * 4/32) =   75     счетчик <= 120
 время 1250 мс    p = 40 + 20 + (120 * 4/32) =   75
 время 1260 мс    p = 40 + 20 + (120 * 4/32) =   75
                 ..
  время 2000 мс    p = 40 + 20 + (120 * 4/32) =   75
  время 2000 мс    планировщик пересчитывает счетчики всех процессов. Для
                  данного процесса 120 * 31/32 = 116
 время 2010 мс    p = 40 + 20 + (117 * 4/32) =   74

Изменение кванта времени планировщика с помощью команды schedtune

Команда schedtune позволяет изменить квант времени планировщика. Для этого нужно вызвать команду schedtune -t.

В AIX версии 4 параметр -t задает число тактов в кванте времени. Новое значение кванта времени будет применяться только нитями, для которых установлен алгоритм планирования SCHED_RR (описание нитей с фиксированным приоритетом приведено в разделе Стратегия планирования нитей).

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

Нить со стратегией планирования SCHED_OTHER или SCHED_RR может использовать процессор в течение всего кванта времени (по умолчанию квант равен одному такту, длительность которого составляет 10 мс).

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

Не все приложения поддерживают работу в среде с увеличенным квантом времени (для некоторых он будет избыточным, а для некоторых - недопустимым). Такие приложения могут освобождать ресурсы процессора явным образом с помощью системного вызова yield() (как и программы в системе со стандартным квантом времени). После вызова yield() нить помещается в очередь выполнения за последней нитью с тем же приоритетом.


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