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


Център по онкология в медецински център Анадолу.

Система FreeBSD кэширует в памяти данные, к которым обращались совсем недавно, потому что одни и те же данные считываются с диска ужасно часто. Если информация кэшируется в оперативной памяти, получить ее можно очень быстро. Если системе требуется больше памяти, она выталкивает из кэша наиболее старые записи, освобождая место для новых данных.

Например, обсуждаемый вывод команды top(1) был получен на моем ноутбуке. Я запустил Firefox, чтобы посмотреть свои комиксы.* Индикатор диска помигал некоторое время, пока программа считывалась с диска. Затем я закрыл броузер, чтобы приступить к работе, но FreeBSD оставила Firefox в буферном кэше. Когда я снова запустил Firefox, он был вызван из кэша, а не с диска, поэтому запустился намного быстрее. Запусти я другой большой процесс, он «вытолкнул» бы веб-броузер из кэша, чтобы поместить в него новую программу.

Если ваша система работает как полагается, у вас есть как минимум несколько мегабайт свободной памяти. Параметры sysctl vm.v_free_target и hw.pagesize сообщат вам, как много свободной памяти должно быть в системе, по мнению FreeBSD. Если свободной памяти больше, чем произведение значений этих двух параметров, значит, ваша система не в полной мере задействует свой потенциал. Например, у меня на ноутбуке:

# sysctl vm.v_free_target
vm.v_free_target: 13745
# sysctl hw.pagesize
hw.pagesize: 4096

Моя система полагает, что необходимо иметь, по крайней мере, 13 745 x 4 096 = 56 299 520 байтов, или порядка 54 Мбайт свободной памяти. Я мог бы потерять гигабайт памяти на моем ноутбуке не дрогнув, если бы не страдал от нехватки памяти.

Память

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

В случае нехватки свободного пространства и минимума места (или его отсутствия) в кэше или буфере необходимо выяснить, куда расходуется память. Вполне вероятно, что системе ее не хватает. Как только система начнет использовать пространство свопинга, недостаток памяти перестанет ощущаться как нечто гипотетическое.

Пространство свопинга

Пространство свопинга (swap space) помогает справиться с кратковременной нехваткой памяти. Например, разархивируемый огромный файл может легко заполнить всю физическую память, и системе придется задействовать виртуальную. Не стоит покупать дополнительную память, если использоваться она будет лишь время от времени, — можно обойтись свопингом.

Проще говоря, свопинг чем-то напоминает вино. Бокал-другой время от времени не повредит, даже полезно, но регулярные обильные возлияния — это бич.

Процессор

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

Если производительность ниже некуда, a top(1) показывает, что процессор занят около 100% своего времени, пора что-то делать. Можно, конечно, купить новый, но есть и другие варианты. Например, можно изучить процессы, запущенные в системе, и выяснить, все ли они необходимы. Не установил ли младший сисадмин клиент SETI@Home (/usr/ports/astro/setiathome), чтобы искать инопланетян за счет вашего процессора? Не запущены ли программы, бывшие важными когда-то, но не теперь? Найдите и завершите ненужные процессы. Кроме того, убедитесь, что они не будут запущены при следующей загрузке системы.

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

Перепланирование

Перепланировать легче, чем изменить приоритеты. Это относительно простой способ сбалансировать процессы системы, чтобы они не монополизировали ресурсы системы. Мы уже говорили в главе 15, что для планирования запуска системных заданий в различное время вы и ваши пользователи могут задействовать cron(1). Если тот или иной пользователь запускает большие задания в определенное время, подумайте о том, чтобы перенести их выполнение на ночное время. Зачастую такие задания, как ежемесячный поиск по базе данных счетов, можно запускать между 6 часами вечера и 6 часами утра, и это никому не помешает — финансовому отделу данные нужны к 8 часам утра в первый день месяца, чтобы закрыть счета за прошедший месяц. Запуск make buildworld && make buildkernel тоже можно назначить на час ночи.

Изменение приоритетов с помощью nice

Если перепланирование не помогло, остается изменить приоритеты, что немного сложнее. Изменяя приоритет, вы предписываете системе FreeBSD изменить значимость данного процесса. Допустим, имеется некоторая программа, которая может работать часами, но мы хотим, чтобы она занимала ресурсы только в те моменты, когда система не занята ничем другим. В этом случае надо попросить программу быть любезной (nice) и уступить дорогу другим программам.

Чем любезнее процесс, тем меньше процессорного времени он запрашивает. По умолчанию любезность равна 0, но ее значение может находиться в диапазоне от 20 (очень любезный процесс) до -20 (совсем нелюбезный). Может показаться, что такой подход ставит все с ног на голову — как же, ведь больший номер должен означать больший приоритет! Однако, тут дело в самом термине; не думаю, что этот показатель лучше было бы назвать «неуживчивостью» или «капризностью».*

На экране top(1) приоритеты процессов показаны в колонке PRI. FreeBSD вычисляет приоритеты процессов, учитывая различные факторы, в том числе любезность, и при любой возможности система старается запускать первыми процессы с высокими приоритетами. Любезность влияет на приоритеты, однако приоритеты нельзя изменять напрямую.

Если известно, что система работает на пределе своих возможностей, запускаемым программам можно назначить степень их любезности с помощью nice(1). Укажите желаемый уровень любезности с помощью команды nice -n и числового значения перед самой командой. Например, запустим make buildworld с уровнем любезности 15:

# nice -n 15 make buildworld

Отрицательные значения любезности, такие как nice -n -5, может назначать только root. Например, если требуется как можно скорее скомпилировать и наложить на ядро важную заплатку, укажите отрицательное значение любезности:

# cd /usr/src
# nice -n -20 make kernel

Обычно при запуске программы не надо указывать уровень любезности, однако нередко возникает потребность изменить уровень любезности «на лету», когда обнаруживается, что процесс полностью оккупировал ресурсы системы. Для этого вводится команда renice(8) с идентификатором PID или владельца процесса. Чтобы изменить уровень любезности процесса, запустите renice, указав в качестве аргументов новое значение любезности и идентификатор процесса.

Например, одна из моих систем выполняет протоколирование хоста, на котором запущены несколько экземпляров softflowd(8), flow-capture, Nagios и другие критически важные системы обслуживания сети. Кроме того, в этой системе работают другие программные компоненты, такие как сервер CVSup, используемый внутренними хостами сети. Если я нахожу, что сервер CVSup начинает мешать Nagios, выполняющему мониторинг сети, или серверу syslogd(8), я должен что- то предпринять. Уменьшение приоритета cvsupd(8) замедлит работу клиентов, но это лучше, чем замедлить систему мониторинга сети. С помощью pgrep(1) я определяю PID процесса cvsupd(8):

# pgrep cvsupd
993
# renice 10 993
993: old priority 0, new priority 10

Бац! Теперь FreeBSD будет планировать процесс cvsupd на исполнение реже, чем другие процессы. Конечно, пользователи сервиса будут очень недовольны, но поскольку главный пользователь — это я, и я уже недоволен, значит, все сделано правильно.

Изменить уровень любезности всех процессов, запущенных тем или иным пользователем, позволяет ключ -u. Например, чтобы придать моим процессам большую значимость, чем у всех чужих процессов, я ввожу такую команду:

# renice -5 -u mwlucas
1001: old priority 0, new priority -5

Число 1001 — это мой пользовательский ID в этой системе. Снова отмечу, что у меня есть достаточные основания так поступить. И не только затем, чтобы показать свое могущество.* Точно так же, если некий пользователь полностью оккупировал дисковый ввод-вывод, я могу сделать его процессы очень, очень любезными, что, скорее всего, избавит других пользователей от проблем.

nice и tcsh

У командного интерпретатора tcsh(1) есть встроенная команда nice. Эта встроенная команда использует синтаксис команды renice(8), отличный от nice(1). Полагаю, это сделано не затем, чтобы вызвать неудовольствие пользователей tcsh, но отыскать разумные доводы пока не могу. Если вы непременно хотите использовать внешнюю утилиту nice(1), вызывайте ее с указанием полного пути к исполняемому файлу: /usr/bin/nice.

Исследование программного обеспечения

Мы долго обсуждали настройку производительности FreeBSD. И это вполне логично, так как данная книга посвящена операционной системе FreeBSD. Но не стоит забывать о другом программном обеспечении! Нередко справиться с проблемами производительности можно за счет тонкой настройки программ, вызывающих эти проблемы. Например, у меня есть комплект CGI-сценариев на языке Perl, которые интенсивно работают с дисками и жадно потребляют время процессора. В результате поиска в Google я выяснил, что эти сценарии будут работать лучше под управлением mod_perl2. Я изменил конфигурацию веб-сервера и проблема была ликвидирована. Это намного, намного проще, чем изменять конфигурацию системы.

Теперь, когда вы научились видеть проблемы, возникающие в системе, пора научиться слышать то, что система пытается вам сказать.

Узкие места

В каждой системе есть узкие места, ограничивающие производительность. Если устранить одно узкое место (bottleneck — «бутылочное горло»), производительность будет расти, пока не достигнет следующего узкого места. Производительность системы ограничена скоростью самого медленного компонента. Так, нередко скорость веб-сервера определяется пропускной способностью сети, поскольку самый медленный компонент системы — это соединение с Интернетом. Если обновить имеющуюся аппаратуру Т1 с пропускной способностью 1,5 Мбит/с до ОС-48 с пропускной способностью 2,4 Гбит/с, система будет выдавать веб-страницы с такой скоростью, с какой ей это позволят другие компоненты. Требование ликвидировать узкие места часто означает «ликвидировать узкие места, возникающие при нормальной рабочей нагрузке».

Комментарии запрещены.