Также будут затронуты некоторые проблемы, связанные с многозадачностью в UNIX®. В современных компьютерах устанавливаются большие объемы оперативной памяти, поэтому одновременно в ней могут выполняться сотни различных программ.
Программы, размещенные в памяти, называются по-разному - потоки, процессы, демоны, ядра, библиотеки, распределенные объекты и прочее. В статье будет показано, что программы в памяти всего-навсего являются простыми бинарными структурами, которые имеют одну общую черту - каждая из них обладает своим собственным контекстом выполнения. Для упрощения в этой статье все программы, выполняющиеся в памяти, будут называться задачами (tasks).
Планировщик или переключатель задач в операционной системе выполняет следующие задачи:
- Загружает контекст задачи в регистры центрального процессора (CPU).
- Позволяет задаче выполняться в течение небольшого периода времени.
- Сохраняет контекст текущей задачи перед его выгрузкой и загрузкой контекста новой задачи.
Планировщик поддерживает некоторое число внутренних таблиц для управления контекстом каждой выполняющейся задачи в системе. Планировщик также управляет ресурсами, используя пару очередей, называемых очередь выполнения (run queue) и очередь "спящего режима" (sleep queue). В очереди выполнения выполняются задачи, у которых есть все необходимые ресурсы. Очередь "спящего режима" (sleep queue) предназначена для задач, которые ждут высвобождения каких-либо ресурсов. Главная задача планировщика - упорядочить работу системы так, чтобы она в правильном порядке выполняла разные задачи и отрабатывала команды управления.
Контекст выполняющейся задачи состоит из множества вещей. Когда задача выполняется, используется регистр CPU, называемый указателем инструкции (instruction pointer, IP), который содержит адрес в памяти для выполняющейся в данный момент инструкции машинного кода. Когда задача снимается с выполнения, планировщик должен сохранить значение регистра IP для того чтобы при новом запуске задачи она продолжила свое выполнение с того места, на котором была остановлена. Следовательно, частью контекста задачи является текущее значение регистра IP.
Другим важным значением, которое составляет контекст задачи, является указатель стека (stack pointer, SP). Стек это LIFO-очередь ("последним зашел, первым вышел"), которая содержит процедуру, возвращающую адреса, элементы данных, указатели и др. Значение каждого элемента, хранящегося в стеке, определяется инструкциями, которые предназначены для работы с этими элементами согласно разработанному программистом алгоритму.
IP и SP, наряду со всеми другими важными регистрами центрального процессора, которые составляют контекст выполняемой задачи, являются низкоуровневыми элементами. Эти элементы используются планировщиком для переключения контекстов и выполнения различных задач. Планировщик также работает с высокоуровневыми понятиями. Одним из таких высокоуровневых понятий является приоритет задачи.
Нет одинаковых по своим правам программ. Некоторые программы, которые важны для функционирования компьютера, должны иметь более высокий приоритет, чем другие программы, не столь важные. В UNIX приоритет процесса обозначается числом, называемым nice - это значение, лежащее в диапазоне от -20 до +19. Программы с наивысшим приоритетом имеют наименьшее значение nice, поэтому значение, равное -20, делает задачу важной для UNIX. В противоположность этому задача с приоритетом nice равным +19, является задачей, которая позволяет всем другим задачам использовать вместо себя драгоценное время выполнения на CPU.
UNIX предоставляет множество мощных инструментов для подробного просмотра процессов, которые выполняются на компьютере в любой момент времени; в частности, для получения этой исчерпывающей информации существует команда ps. Запустите xterm и, чтобы увидеть значения nice выполняемых программ, введите следующую команду:
$ ps -eo pid,state,nice,args | less -S |
Результатом выполнения команды будет информация, приведенная в листинге 1.
Листинг 1. Полученная информация
PID S NI COMMAND
1 S 0 init [5]
2 S 19 [ksoftirqd/0]
3 S -10 [events/0]
4 S -10 [khelper]
5 S -10 [kblockd/0]
28 S 0 [kapmd]
30 S 0 [pdflush]
31 S 0 [pdflush]
33 S -10 [aio/0]
32 S 0 [kswapd0]
138 S 0 [kseriod]
176 S 0 [kjournald]
1080 S 0 [kjournald]
1081 S 0 [kjournald]
1082 S 0 [kjournald]
1564 S 0 /sbin/dhclient -1 -q -lf /var/lib/dhcp/dhclient-eth0...
1610 S 0 syslogd -m 0
1614 S 0 klogd -x
1632 S 0 portmap
1651 S 0 rpc.statd
1729 S 0 /usr/sbin/sshd
1744 S 0 xinetd -stayalive -reuse -pidfile /var/run/xinetd.pid
1760 S 0 ntpd -U ntp
.
.
.
2364 S 0 konsole
2373 S 0 /bin/bash
2563 R 0 ps -eo pid,state,nice,args
|
Для моей рабочей станции было сгенерировано 84 строки. Это означает, что на момент выполнения ps в системе выполнялось только 84 задачи, которые состязались за время исполнения на CPU. Теперь изучим составные части команды для лучшего понимания информации, выводимой системой. Управляющая строка -eo pid,state,nice,args указывает инструменту ps вывести следующую информацию по каждой выполняющейся задачи в системе:
- Идентификатор процесса (pid).
- Выполняется ли процесс или находится в "спящем" режиме (state).
- Значение nice (nice).
- Аргументы, переданные задаче, когда та начала выполняться (args).
Команда less с флагом -S создает понятный список, ограничивая каждую строку в списке шириной xterm.
Большинство задач имеют nice - значение, равное 0, и они попадают в середину диапазона приоритетов. Совсем немного задач выполняются со значениями nice , которые придают им высокий (-10), или низкий (+19) приоритет. Большинство задач находятся в спящем режиме, т.е. они ожидают, пока высвободятся какие-либо ресурсы. Фактически, когда я создавал список, выполнялась только команда ps. Большинство задач разрабатываются так, чтобы они, быстро сделав свою работу, завершали работу или переходили в "спящий" режим.
Команда nice выполняет указанную команду со всем списком ее аргументов, используя значение nice. Команда renice используется для изменения значения nice задачи. Для получения подробной информации об этих командах изучите руководство man.
Наиболее распространены два класса UNIX-компьютеров: рабочие станции и серверы. Каждый из них требует внимательного отношения к выполняющимся на нем процессам, чтобы их ограниченные ресурсы не были израсходованы на постоянное выполнение второстепенных задач.
Поскольку рабочие станции могут использоваться для различных задач, не существует точных правил для настройки каждой рабочей станции. Некоторые рабочие станции используются для программирования, работы с графикой, сложных вычислений и для "добычи" информации из базы данных. В каждом случае следует рассмотреть, какие процессы используются при стандартном режиме работы рабочей станции и настроить ее соответствующим образом.
Например, на рабочей станции, предназначенной для программирования, компоновка и компилирование некоторых программ могут занять многие часы. Программист, который хочет ускорить выполнение этих процессов (за счет всех остальных процессов), может стать привилегированным пользователем и начать компиляцию своей программы с использованием следующей команды:
$ su Password: # nice -n -15 make |
Параметр -n -15 уменьшает значение nice задачи make на 15 - это увеличивает приоритет настолько, что прирост приоритета можно почувствовать даже при перемещении мыши по экрану. На большинстве систем только привилегированный пользователь может подобным образом изменить приоритет задачи. Для рабочей станции, выполняющей продолжительный процесс, применение такого подхода может быть вполне обосновано.
Другим важным способом настроить производительность рабочей станции является определение функций и функциональных возможностей, которые не используются пользователем, хотя и выполняются на рабочей станции. Например, много Linux®-систем имеют файл, называемый /etc/cron.daily/slocate.cron, который ежедневно выполняет программу dbupdate, которая интенсивно использует жесткий диск. Эта программа позволяет использовать для поиска файлов команду locate вместо команды find. Если команда locate не будет использоваться, то, войдя под учетной записью привилегированного пользователя, можно так отредактировать файл /etc/cron.daily/slocate.cron, закомментировав соответствующие инструкции, что программа dbupdate не будет выполняться (см. листинг 2).
Листинг 2. Файл /etc/cron.daily/slocate.cron
$ su Password: # cd /etc/cron.daily # vi slocate.cron |
Листинг 3 показывает, как должен выглядеть файл /etc/cron.daily/slocate.cron после того как перед каждой строкой, чтобы отключить ее исполнение, будет поставлен символ комментария (#).
Примечание: комментирование каждой строки в этом простом сценарии эффективнее предотвращает выполнение программы dbupdate, нежели простое удаление этого файла. В конце концов, возможно, требования изменятся, и понадобится использовать команду slocate. Тогда можно будет снова использовать программу dbupdate. Все, что понадобится для этого - удалить символы комментария перед каждой строкой в файле.
Листинг 3. Итоговый вид содержимого файла
#!/bin/sh # renice +19 -p $$ >/dev/null 2>&1 # /usr/bin/updatedb -f "nfs,proc,devpts" -e "/tmp,/var/tmp,/usr/tmp,/afs,/net" |
Помните, что в данном случае нужно учитывать персональные предпочтения и, если компьютер принадлежит вашему сотруднику, не стоит производить в нем подобные изменения без разрешения руководства. В конце концов, пока пользователь не работает на своем компьютере, системный администратор может воспользоваться командой locate.
В отличие от рабочих станций, у серверов есть четко определенные задачи, и, следовательно, их проще настраивать. Например, главное назначение Web-сервера - удовлетворение запросов Web-браузеров, а файловый сервер должен быстро и точно обеспечить доступ к нужным файлам. В обоих случаях сервер не должен выполнять задачи, которые обычно характерны для рабочих станций.
Если сервер предназначен для выполнения только одной функции (например, Web-сервера), то следует удалить все остальные задачи из конфигурационных файлов. Часто Web-сервер выполняет ftp, nfs, dhcp, dns и другие демон-процессы, которые ему не нужны. Чем меньше задач выполняет сервер, тем легче поддаются настройке его главные процессы. Кроме того, также возрастает безопасность, поскольку уменьшается количество "дыр" в безопасности, которые можно использовать.
Эта статья предоставляет некоторые общие направления для настройки производительности сервера. Для более подробной информации исследуйте ссылки в разделе Ресурсы.
Если внимательно настроить процессы, которые выполняются на рабочих станциях и серверах, включая настройку приоритетов задач и удаление задач, которые напрасно тратят ресурсы системы, то компьютеры будут и далее оставаться хорошими и преданными работниками, какими они и должны быть.
Научиться
- Performance tuning UNIX systems: оригинал статьи (EN).
- AIX and UNIX articles(EN): другие статьи, написанные Вильямом Циммерли (William Zimmerly).
- Commands Reference, Volume 4, nice Command (EN): информация о применении команды nice в IBM AIX®.
- Setting Up a Linux Server (EN) Mr. Виндли (Windley): статья с полезными советами по настройке сервера Linux.
- Configuring Linux (EN): информация об основных настройках Linux-служб: Web-сервер, telnet, ftp и mysql.
- Linux Commands for Beginning Server Administrators (EN): статья с описанием основных команд Linux, предназначенная для начинающих администраторов.
- Linux: раздел для улучшения навыков работы с Linux.
- Раздел сайта developerWorks AIX и UNIX содержит сотни информативных статей для читателей начальной, средней и высокой квалификации.
- Новичок в AIX и UNIX?: страница AIX и UNIX для новичков.
- AIX 5L Wiki: совместная разработка документации AIX.
- Разделы библиотеки информации по темам AIX и UNIX:(EN)
- Системное администрирование
- Разработка приложений
- Производительность
- Переносимость
- Безопасность
- Подсказки
- Инструментальные средства и утилиты
- Java™-технологии
- Linux®
- Open source
- Safari bookstore: сайт магазина книг по ИТ.(EN)
- Команда IBM developerWorks проводит по всему миру сотни бесплатных технических консультаций.(EN)
- Podcasts: аудиозаписи презентаций экспертов IBM.(EN)
Получить продукты и технологии
- IBM trial software: ознакомительные версии программного обеспечения для разработчиков, которые можно загрузить прямо со страницы сообщества developerWorks.(EN)
Обсудить
- Примите участие в обсуждении материала на форуме.
- developerWorks blogs: участвуйте в жизни сообщества developerWorks.(EN)
- Примите участие в форумах по AIX и UNIX:(EN)
- Управление кластерными системами
- Поддержка IBM
- Инструменты управления производительностью - технический форум
- Виртуализация - технический форум
Билл Циммерли (Bill Zimmerly) является специалистом в области инженерии знаний, а также программистом языков низкого уровня. Он имеет большой опыт работы с различными версиями программного обеспечения UNIX® и Microsoft® Windows®. Билл с огромным энтузиазмом и удовольствием занимается созданием новых технологий и рассказывает о них в своих статьях. Живет он в деревушке Хиллсборо, Миссури, где может наслаждаться чистым воздухом и прекрасной природой. Кроме того, неподалеку находятся несколько винных заводов. Связаться с ним можно по адресу электронной почты: bill@zimmerly.com.