20 окт. 2000 г.

Азы linux (для детей) урок 25

Управление процессами 

Работа для системного администратора

Хотя управление системными ресурсами, включая процессы, является задачей местного системного администратора, но и обычному пользователю не повредит кое-что узнать об этом, особенно в той части, которая касается оптимального выполнения его или ее собственных процессов.
Мы немного расскажем на теоретическом уровне о производительности системы, но не будем касаться оптимизации оборудования и других продвинутых процедур. Вместо этого мы изучим насущные проблемы, с которыми сталкивается обычный пользователь, и действия, которые пользователь может предпринять для обеспечения оптимального использования имеющихся ресурсов. Как мы узнаем в следующем разделе, следует поразмыслить, прежде чем действовать.
Рисунок 4.2. Ты не мог бы идти побыстрее?
Пользователь хочет, чтобы процессы выполнялись быстрее.

Сколько времени это займет?

Bash предоставляет встроенную команду time, которая отображает, сколько времени занимает выполнение команды. Она рассчитывает время с высокой точностью и может быть использована с любой командой. В примере ниже, проходит около полторы минуты to make this book:
tilly:~/xml/src> time make
Output written on abook.pdf (222 pages, 1619861 bytes).
Transcript written on abook.log.

real	1m41.056s
user	1m31.190s
sys	0m1.880s
Команда GNU time в /usr/bin (в отличие от версии, встроенной в shell) отображает больше информации, которая может быть отформатирована различными способами. Она также показывает статус завершения команды и общее истекшее время. Такая же команда, как выше, использующая независимый time, дает следующий вывод:
tilly:~/xml/src> /usr/bin/time make
Output written on abook.pdf (222 pages, 1595027 bytes).
Transcript written on abook.log.

Command exited with non-zero status 2
88.87user 1.74system 1:36.21elapsed 94%CPU 
				(0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (2192major+30002minor)pagefaults 0swaps
Для получения полной информации снова обратитесь к info-страницам.

Исполнение

Для пользователей эффективность означает быстрое выполнение команд. Для системного администратора, с другой стороны, это означает гораздо больше: администратор оптимизирует производительность всей системы, включая пользователей, все программы и демоны. Производительность системы может зависеть от тысячи незначительных вещей, которые не учитываются командой time:
  • выполняющаяся программа плохо написана или использует компьютер надлежащим образом
  • доступ к дискам, контроллерам, дисплею и всем другим видам интерфейсов
  • достижимость удаленных систем (производительность сети)
  • количество пользователей в системе, количество пользователей, одновременно работающих на самом деле.
  • время дня
  • ...

Нагрузка

Короче говоря, нагрузка зависит от того, что является нормальным для вашей системы. На моем старом P133 работает брандмауэр, SSH сервер, файловый сервер, служба маршрутизации, sendmail сервер, прокси сервер и некоторые другие службы, все они не жалуются на семь подключенных пользователей; нагрузка по-прежнему 0 или в пределах нормы. Некоторые (многопроцессорные) системы, которые я видела, были вполне счастливы с нагрузкой в 67. Существует только один способ узнать, что нагрузка нормальна, - это проверять ее регулярно. Если так не делать, вы только сможете оценить загрузку системы по времени отклика в командной строке, что является очень грубым измерением, поскольку эта скорость зависит от сотни других причин.
Имейте в виду, что разные системы будут вести себя по-разному с одной и той же средней нагрузкой. Например, системе с видеокартой, поддерживающей аппаратное ускорение, не будет иметь никаких проблем при прорисовке 3D изображений, в то же время в такой же системе с VGA видеокартой будет чрезвычайно замедленное время рендеринга. Мой старый P133 будет довольно неудобен, когда я запущу Х-сервер, но на современной системе вы вряд ли заметите разницу в нагрузке на систему.

Я могу что-нибудь сделать как пользователь?

Большое окружение замедляет работу. Если у вас установлено множество переменных окружения (вместо переменных оболочки), длинных путей поиска, которые не оптимизированы (ошибки в настройках переменной окружения PATH), и присутствует много настроек, которые обычно делаются "на лету", системе будет требоваться больше времени на поиск и чтение данных.
В X, оконные менеджеры и среды рабочего стола могут действительно «съедать» процессор. На самом деле приходится расплачиваться за фантастический рабочий стол, даже если вы можете скачать его бесплатно, поскольку большинство десктопов снабжаются дополнениями до бесконечности. Скромность окажется добродетелью, если вы не покупаете новый компьютер каждый год.

Приоритет

Приоритет или важность работы определяется ее числом nice. Программа с большим nice-числом дружественна к другим программам, другим пользователям и системе; т.е. эта программа - не важное дело. Низкое nice-число обозначает более важное задание, которое потребует больше ресурсов, не делясь ими.
Улучшение выполнения задания за счет увеличения его nice-числа полезно только для процессов, которые используют много процессорного времени (компиляторы, математические приложения и т.п.). Процессы, которые постоянно обращаются к вводу/выводу имеют более высокий приоритет (низкое nice-число), например, ввод с клавиатуры всегда получает наивысший приоритет в системе.
Определение приоритетов программ осуществляется с помощью команды nice.
Большинство систем также предоставляют команду BSD renice, которая позволяет изменять дружелюбность выполняющейся команды. Опять же, читайте man-страницы для получения системно-специфичной информации.
Интерактивные программы.
Плохая идея, выполнять nice или renice по отношению к интерактивной программе или заданию, работающему на переднем плане.
Использование этих команд, как правило, является задачей системного администратора. Читайте man-страницы для дополнительной информации о дополнительной функциональности, доступной для системного администратора.

Ресурсы процессора

На каждой системе Linux множество программ одновременно нуждаются в ресурсах процессора(ов), даже в том случае, если вы являетесь единственным пользователем в системе. Каждая программа для работы нуждается в определенном количестве циклов центрального процессора. Бывают случаи, когда циклов процессора недостаточно, поскольку он слишком занят. Команда uptime чрезвычайно неточна (отображает только средние, вы должны знать, что это нормально), но далеко не бесполезна. Есть некоторые действия, которые можно предпринять, если вы думаете, что ваш процессор является причиной зависания вашей системы:
  • Выполняйте тяжелые программы, когда нагрузка невелика. Это можно делать в вашей системе в ночное время. См. следующий раздел про планирование.
  • Предотвращайте систему от выполнения ненужной работы: остановите демонов и программы, которые вы не используете, используйте locate вместо тяжелой find, ...
  • Выполняйте больше заданий с низким приоритетом.

Если ни одно из этих решений не вариант в вашей конкретной ситуации, вы можете обновить процессор. На машине UNIX это работа для системного администратора.

Ресурсы памяти

Когда текущие работающие процессы ожидают больше памяти, чем доступно физически в системе, Linux не разрушится; она начнет подкачку или своппинг, смысл в том, что процесс использует память на диске или из пространства подкачки, перемещая содержимое физической памяти (части работающих программ или целых программ в случае своппинга) на диск, тем самым давая физической памяти обрабатывать несколько процессов. Это в достаточной степени замедляет работу системы, поскольку доступ к диску намного медленнее, чем доступ к памяти. Команда top может быть использована для отображения того, насколько память и подкачка используются. Системы, использующие glibc, предлагают команды memusage и memusagestat для визуализации использования памяти.
Если вы обнаружите, что используется много памяти и пространства подкачки, вы можете попробовать:
  • Прерывание, остановку или переопределение nice для тех программ, которые используют большую часть памяти.
  • Добавление дополнительной памяти (а в некоторых случаях больше пространства подкачки) системе.
  • Настройка производительности системы, что выходит за рамки этого документа. См. список в Приложении А, «Куда идти дальше?» за дополнением.

Ресурсы I/O (ввода/вывода)

Хотя ограничения ввода-вывода являются основной причиной стресса системных администраторов, системы Linux предлагает довольно бедные утилиты для измерения I/O производительности. Инструменты ps, vmstat и top дают некоторое представление о том, сколько программ ждут ввода-вывода; netstat отображает интерфейс сетевой статистики, но в сущности нет инструментов нормального измерения I/O отклика при загрузке системы, а команда iostat дает краткий обзор общего I/O использования. Существуют различные графические приложения для отображения вывода этих команд в понятном виде.
Каждое устройство имеет свои собственные проблемы, но пропускная способность сетевых интерфейсов и пропускная способность дисков два основных узких места в производительности ввода-вывода.
Сетевые I/O проблемы:
  • Сетевые перегрузки:
Количество данных, передаваемых по сети больше возможностей сети, в результате медленное выполнение каждой связанной с сетью задачи для всех пользователей. Это может быть решено путем очистки сети (которая в основном заключается в отключении протоколов и услуг, которые вам не нужны), либо путем реконфигурации сети (например, использование подсетей, замена узлов с переключателями, модернизация интерфейсов и оборудования).
  • Проблемы сетевой целостности:
Случается, когда данные передаются неправильно. Решение такого рода проблем может быть выполнено только путем изоляции неисправного элемента и его заменой.
Дисковые I/O проблемы:
  • для каждого процесса скорость передачи слишком низкая:
Скорость чтения и записи для определенного процесса не является достаточной.
  • совокупная скорость передачи слишком низкая:
Максимум общей пропускной способности, которые система может обеспечить для всех выполняющихся программ, недостаточна.
Обнаружить такого рода проблемы сложнее, и обычно это требует дополнительное оборудование для того, чтобы разделить потоки данных по шинам, контроллерам и дискам, если причина проблемы — это перегрузка оборудования. Одним из решений этого является оптимизированная конфигурация RAID-массива для действий ввода-вывода. Так у вас появляется возможность остаться при том же оборудовании. Перед обновлением пропускной способности шин, контроллеров и дисков всегда можно попробовать другие варианты.
Если перегрузка не является причиной, может быть, ваше оборудование постепенно портится, или неправильно подключено к системе. Проверьте контакты, соединители и разъемы для начала.

Пользователи

Пользователи могут быть разделены на несколько классов в зависимости от их отношения к использованию ресурсов:
  • Пользователи, которые запускают большое число маленьких заданий: вы, начинающий пользователь Linux, например.
  • Пользователи, которые запускают относительно немного, но больших заданий: пользователи, работающие с моделированием, расчетами, эмуляторами или другими программами, которые съедают много памяти, и обычно этих пользователей сопровождает большой объем файлов данных.
  • Пользователи, которые запускают немного заданий, но используют много процессорного времени (разработчики и т.п.).
Вы можете видеть, что системные требования могут отличаться для каждого класса пользователей, и поэтому сложно удовлетворить каждого. Если вы работаете на многопользовательской системе, полезно (и приятно) узнать привычки других пользователей системы, с тем чтобы получить максимальную отдачу от ее для выполнения ваших конкретных задач.

Графические инструменты

Для графической среды доступен целый букет инструментов мониторинга. Ниже приведен снимок экрана Системного Монитора Gnome, который способен отображать и искать информацию о процессах и контролировать системные ресурсы:
Рисунок 4.3. Системный Монитор Gnome
Системный монитор Gnome
Также существует несколько полезных иконок, которые вы можете установить на панели задач, таких как мониторы диска, памяти и загруженности. Xload - это другое небольшое приложение X для мониторинга загрузки системы. Определитесь сами со своими предпочтениями.

Прерывание ваших процессов

Как непривилегированный пользователь, вы можете влиять только на собственные процессы. Мы уже видели, как вы можете отображать процессы и отфильтровывать процессы, относящиеся к конкретному пользователю, а также знаете, какие могут произойти возможные ограничения. Когда вы видите, что один из ваших процессов потребляет слишком много системных ресурсов, есть две вещи, которые вы можете сделать:
  • Заставить процесс использовать меньше ресурсов, не прерывая его;
  • Остановить процесс вообще.
В случае, если вы хотите, чтобы процесс продолжил работу, но также хотите дать шанс другим процессам в системе, вы можете переопределить nice процесса. Наряду с использованием команд nice или renice, top является простым способом обнаружения процесса(ов), причиняющего беспокойство, и снижения приоритета.
Узнайте процесс в столбце "NI", у него, скорее всего, будет отрицательный приоритет. Наберите r и введите ID процесса, для которого вы хотите переопределить число nice. Затем введите значение nice, например, "20". Это означает, что отныне этот процесс будет занимать самое большое 1/5 циклов процессора.
Примеры процессов, которые вы захотите сохранить в рабочем состоянии, — это эмуляторы, виртуальные машины, компиляторы и т.д.
Если вы хотите остановить процесс, потому что он висит или собирается полностью вывести из рабочего состояния ввод-вывод, создание файла или использование других ресурсов системы, используйте команду kill. Если у вас есть возможность, попробуйте сначала завершить процесс "по тихому", отправив ему сигнал SIGTERM. Это указание к прекращению любой активности в соответствии с процедурами, описанными в коде программы:
joe:~> ps -ef | grep mozilla
joe    25822	1  0 Mar11 ?	00:34:04 /usr/lib/mozilla-1.4.1/mozilla-

joe:~> kill -15 25822
В приведенном выше примере, пользователь joe остановил его браузер Mozilla, поскольку он подвис.
От некоторых процессов избавиться немного труднее. Если у вас есть время, вы можете отправить им сигнал SIGINT, прервав их. Если этот трюк не сработает, используйте самый сильный сигнал SIGKILL. В приведенном ниже примере joe останавливается Mozilla, которая повисла окончательно:
joe:~> ps -ef | grep mozilla
joe    25915	1  0 Mar11 ?	00:15:06 /usr/lib/mozilla-1.4.1/mozilla-

joe:~> kill -9 25915

joe:~> ps -ef | grep 25915
joe	2634 32273 0 18:09 pts/4   00:00:00 grep 25915
В таких случаях вы можете захотеть проверить, что этот процесс действительно прерван, используя фильтр grep опять же по PID. Если это возвращает только процесс grep, вы можете быть уверены, что вам удалось остановить тот процесс.
Среди процессов есть те, которые сложно прервать в вашей оболочке. И это хорошо: если бы их можно было легко прервать, то вы бы теряли вашу оболочку каждый раз при случайном вводе Ctrl-C в командной строке, т.к. это равносильно отправке SIGINT.
UNIX без конвейеров почти немыслим.
Использование вертикальной черты (|) при использовании выводов одной команды в качестве входных данных другой объясняется в следующей главе, Глава 5, "Перенаправление ввода-вывода".
В графической среде, программа xkill очень проста в использовании. Просто введите имя команды, затем нажмите Enter и выберите в окне приложение, которое вы хотите остановить. Это довольно опасно, потому что программа отправляет SIGKILL по умолчанию, поэтому используйте ее, только когда приложение зависает.