В операционной системе AIX версии 4 для распределения времени процессора стали применяться нити, однако большинство инструментов управления системой по-прежнему работают не с нитями, а с процессами, к которым относятся эти нити.
Для изменения приоритета пользовательских процессов предусмотрены команды nice и renice, а также функция setpri(). Для просмотра приоритета предназначена команда ps. Общая информация о приоритетах приведена в разделе Приоритеты процессов и нитей.
Вычисление приоритета позволяет решить следующие задачи:
В различных выпусках операционной системы пользователю предоставляет разная степень свободы в изменении приоритета. Алгоритм вычисления приоритета, применявшийся в AIX версии 4.3.1 и ниже в значительной мере ограничивал возможности пользователя. Новый алгоритм, появившийся в AIX версии 4.3.2, предоставляет более гибкие возможности для управления приоритетом пользовательских нитей. В частности, усилилось различие между интерактивными и фоновыми процессами. Кроме того, изменение значения 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 не выдаст никакого сообщения об ошибке.
Приложение, запущенное от имени пользователя 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 с флагом -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 изменяет значение 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 можно указать разными способами.
В 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 предусмотрены две опции: -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 -t.
В AIX версии 4 параметр -t задает число тактов в кванте времени. Новое значение кванта времени будет применяться только нитями, для которых установлен алгоритм планирования SCHED_RR (описание нитей с фиксированным приоритетом приведено в разделе Стратегия планирования нитей).
Изменение кванта времени вступает в силу немедленно, так что перезагрузка не требуется.
Нить со стратегией планирования SCHED_OTHER или SCHED_RR может использовать процессор в течение всего кванта времени (по умолчанию квант равен одному такту, длительность которого составляет 10 мс).
В некоторых случаях накладные расходы, связанные с частым переключением контекста нитей и планированием запуска нитей, столь велики, что требуется увеличить квант времени. В таких случаях увеличение кванта времени позволяет повысить скорость выполнения нитей с фиксированным приоритетом. Для того чтобы узнать, сколько раз в секунду переключается контекст, вызовите команду vmstat или sar.
Не все приложения поддерживают работу в среде с увеличенным квантом времени (для некоторых он будет избыточным, а для некоторых - недопустимым). Такие приложения могут освобождать ресурсы процессора явным образом с помощью системного вызова yield() (как и программы в системе со стандартным квантом времени). После вызова yield() нить помещается в очередь выполнения за последней нитью с тем же приоритетом.