Как мы уже видели в предыдущем разделе, Linux, как и большинство современных операционных систем выполняет множество процессов. Это достигается путем разделения CPU и других ресурсов всеми процессами. Если некоторый процесс может использовать 100% ресурсов CPU, то другие процессы могут перестать отвечать на запросы и вообще что-то делать. Когда мы рассматривали Статус процесса в предыдущем разделе, то видели, что вывод по умолчанию команды top выдает список процессов, расположенных в порядке убывания потребления ресурсов CPU. Если мы запустим наши часы и команду top, то вряд ли увидим этот процесс в списке, потому как большую часть времени он не использует ресурсы CPU.
В вашей системе могут быть команды, которые могут использовать несколько CPU. Это такие программы как видео-редакторы, программы преобразования изображений или же кодирования звука, как например mp3 в ogg.
Мы создадим небольшой сценарий, который использует CPU и делает немного больше. Он принимает два параметра, счетчик и метку. Он выводит метку, текущую дату и время, затем уменьшает счетчик до тех пор, пока не достигнет 0, затем снова печатает метку и дату. Этот сценарий не проверяет ошибки, но зато он подходит для иллюстрации.
Листинг 100. Скрипт, интенсивно использующий CPU
[ian@echidna ian]$ echo 'x="$1"'>count1.sh
[ian@echidna ian]$ echo 'echo "$2" $(date)'>>count1.sh
[ian@echidna ian]$ echo 'while [ $x -gt 0 ]; do let x=$x-1;done'>>count1.sh
[ian@echidna ian]$ echo 'echo "$2" $(date)'>>count1.sh
[ian@echidna ian]$ cat count1.sh
x="$1"
echo "$2" $(date)
while [ $x -gt 0 ]; do let x=$x-1;done
echo "$2" $(date)
Если вы запустили этот сценарий на своей системе, то можете увидеть результат как в Листинге 101. Этот сценарий интенсивно использует CPU, как мы скоро увидим. Если вы используете не свою рабочую станцию, убедить что вам можно использовать ресурсы CPU .
Листинг 101. Запуск count1.sh
[ian@echidna ian]$ sh count1.sh 10000 A
A Mon Nov 14 07:14:04 EST 2005
A Mon Nov 14 07:14:05 EST 2005
[ian@echidna ian]$ sh count1.sh 99000 A
A Mon Nov 14 07:14:26 EST 2005
A Mon Nov 14 07:14:32 EST 2005
Пока все хорошо. Давайте теперь используем полученные ранее знания и создадим список команд, давайте запустим сценарий в фоновом режиме работы и используем команду top, чтобы увидеть количество ресурсов CPU, потребляемое сценарием. Список команд показан в Листинге 102, а вывод команды top в Листинге 103.
Листинг 102. Запуск count1.sh и top
[ian@echidna ian]$ (sh count1.sh 99000 A&);top
Листинг 103. Интенсивное использование CPU
7:20am up 48 days, 20:54, 2 users, load average: 0.05, 0.05, 0.00
91 processes: 88 sleeping, 3 running, 0 zombie, 0 stopped
CPU states: 0.1% user, 0.0% system, 0.0% nice, 0.9% idle
Mem: 1030268K av, 1002864K used, 27404K free, 0K shrd, 240336K buff
Swap: 1052216K av, 118500K used, 933716K free 605152K cached
PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND
8684 ian 20 0 1044 1044 932 R 98.4 0.1 0:01 sh
Неплохо. С помощью простого сценария мы заняли 98.4% ресурсов CPU.
Отображение и установка приоритетов
Если мы выполняем большую задачу, то можем обнаружить, что она влияет на нашу возможность (или же возможности других пользователей) выполнения других задач в системе. Системы Linux и UNIX используют систему приоритетов из 40 значений, начиная от -20 (наивысший приоритет) и заканчивая 19 (низший приоритет).
nice
Процессы обычных пользователей обычно имеют нулевой приоритет. Команда nice отобразит наш приоритет по умолчанию. Команда ps также может отображать приоритет (nice, или NI, уровень), например с помощью опции -l. Проиллюстрируем на примере Листинга 104, в которым выделен наш приоритет в виде значения 0.
Листинг 104. Отображение информации о приоритетах
[ian@echidna ian]$ nice
0
[ian@echidna ian]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
000 S 500 7283 7282 0 70 0 - 1103 wait4 pts/2 00:00:00 bash
000 R 500 9578 7283 0 72 0 - 784 - pts/2 00:00:00 ps
Команда nice также может использоваться для запуска процесса с другим приоритетом. Вы можете использовать опцию -n или (–adjustment) вместе с положительным числом, чтобы увеличить приоритет или отрицательное число, чтобы уменьшить его. Помните, что процесс с наименьшим значением приоритета работает чаще всех, поэтому считайте, что увеличение значения приоритета означает для процесса быть более дружелюбным по отношению к другим процессам. Заметим, что вам обычно требуются права суперпользователя (root), чтобы применять отрицательные значения. Другими словами, обычные пользователи могут только сделать свои процессы более дружелюбными. В Листинге 105, мы запустим две копии сценария count1.sh в фоновом режиме с разными приоритетами исполнения. Заметим, что между окончанием их работы появилась задержка в 5 секунд. Попытайтесь поэкспериментировать с разными значениями nice, или же запустить с другим значением приоритета, чтобы увидеть возможную разницу.
Листинг 105. Использование nice для установки приоритетов
[ian@echidna ian]$ (sh count1.sh 99000 A&);\
> (nice -n 19 sh count1.sh 99000 B&);\
> sleep 2;ps -l;sleep 20
B Mon Nov 14 08:17:36 EST 2005
A Mon Nov 14 08:17:36 EST 2005
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
000 S 500 7283 7282 0 70 0 - 1104 wait4 pts/2 00:00:00 bash
000 R 500 10765 1 84 80 0 - 1033 - pts/2 00:00:01 sh
000 R 500 10767 1 14 79 19 - 1033 - pts/2 00:00:00 sh
000 R 500 10771 7283 0 72 0 - 784 - pts/2 00:00:00 ps
A Mon Nov 14 08:17:43 EST 2005
B Mon Nov 14 08:17:48 EST 2005
Заметим также, что, как и в команде nohup вы не можете использовать список команд или конвейер как аргумент nice.
Изменение приоритетов
renice
Если вы запустили процесс и поняли, что он должен работать с другим приоритетом, то существует способ изменить приоритет работающего процесса с помощью команды renice. Вы указываете абсолютный приоритет (а не величину изменения) процесса или процессов, приоритет которых хотите изменить. Смотри Листинг 106.
Листинг 106. Использование renice для изменения приоритетов
[ian@echidna ian]$ sh count1.sh 299000 A&
[1] 11322
[ian@echidna ian]$ A Mon Nov 14 08:30:29 EST 2005
[ian@echidna ian]$ renice +1 11322;ps -l
11322: old priority 0, new priority 1
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
000 S 500 7283 7282 0 75 0 - 1104 wait4 pts/2 00:00:00 bash
000 R 500 11322 7283 96 77 1 - 1032 - pts/2 00:00:11 sh
000 R 500 11331 7283 0 76 0 - 786 - pts/2 00:00:00 ps
[ian@echidna ian]$ renice +3 11322;ps -l
11322: old priority 1, new priority 3
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
000 S 500 7283 7282 0 75 0 - 1104 wait4 pts/2 00:00:00 bash
000 R 500 11322 7283 93 76 3 - 1032 - pts/2 00:00:16 sh
000 R 500 11339 7283 0 76 0 - 785 - pts/2 00:00:00 ps
Больше информации о командах nice и renice вы можете получить из man-страниц.
Взято с ibm developerworks