Использование /proc для изменения параметров Linux ядра (proc kernel linux tune)

Грэхем Уайт (Graham White) 27.03.2007

Файловая система /proc — это одна из величайших особенностей Linux и эта статья проведет вас по наиболее полезным ее аспектам. С ней вы сможете администрировать многие детали вашей системы без необходимости перезагрузки машины.

Любой, кто администрировал систему коммерческой важности, знаком с головной болью из-за падения системы. Одной из основных причин, по которой компании запускают UNIX сервера, является их стабильность. При аккуратном администрировании такой сервер не приходится перезапускать в течение очень долгого времени. Более того, выполнение администраторских задач, даже на уровне ядра, может выполняться на лету, сохраняя стабильность сервера. Вам может понадобиться перезапустить сервер при апгрейде оборудования или если кто-нибудь оборвет питающий провод, однако большую часть администрирования можно выполнять без этого. Эта статья включает подсказки и советы для выполнения различных административных задач и изменения вашей системы без перезагрузки.

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

Внимание: Эта статья написана для ядер серии 2.4-х. Некоторые опции и возможности могут отличаться в ядрах других серий.

Изменение параметров работающего ядра

Linux имеет отличный способ изменять параметры ядра во время работы системы и без необходимости перезагрузки. Это делается при помощи виртуальной файловой системы /proc. Linux Gazette дает один из простейших и легчайших объяснений /proc, которые я когда-либо видел. (см. Источники.) Вкратце, файловая система /proc дает вам возможность заглянуть в работающее ядро, что может быть полезно для мониторинга производительности, проверки системной информации, конфигурирования системы и изменения конфигурации. Эта файловая система называется виртуальной, потому что это в действительности не файловая система. Это карта, создаваемая ядром и присоединяемая к вашей обычной файловой системе, чтобы обеспечить доступ.

Тот факт, что мы можем разными способами внести изменения в ядро во время работы системы дает системному администратору огромную мощь и гибкость при изменении параметров. Но может быть слишком много власти это плохо? Иногда. Если вы собираетесь внести изменения в файловую систему /proc, вы должны быть уверены, что вы знаете, что вы делаете и какой эффект произведут на систему ваши действия. Это очень полезная техника, но одно неверное движение может вызвать неожиданные последствия. Если вы не уверены и новичок в таких делах, попрактикуйтесь на машине с меньшей важностью для ваших дел.

Как вносить изменения

Сначала, подумайте о том, как не вносить изменения в ядро. Есть две отличных причины, почему вам не стоит просто перейти в /proc, открыть файл в текстовом редакторе, сделать несколько изменений и сохранить файл. Вот они:

  • Целостность данных: Все эти файлы представляют работающую систему, а поскольку ядро может внести изменения в эти файлы в любое время, то если вы откроете файл и попытаетесь внести изменения в то время, когда туда вносит изменения система, то вы можете сохранить не то, что ожидает увидеть ядро.
  • Виртуальные файлы: Все эти файлы в действительности не существуют. Как же тогда синхронизировать сохраненные данные?

Ответом на это является не использование текстового редактора для внесения изменений. Поэтому для внесения изменения в что-либо в файловой системе /proc, вам следует использовать команду echo и перенаправлять вывод команды в выбранный файл в /proc. Например: echo «Your-New-Kernel-Value» > /proc/your/file

Аналогично, если вы хотите увидеть информацию из /proc, вам следует использовать либо команду, которая предназначена для этого, либо команду cat.

Что изменять

Вам не нужно быть разработчиком ядра, чтобы пользоваться /proc, а базовое понимание этой структуры отлично вам поможет. Вы можете найти, что вам не нужно знать обо всем в /proc, до тех пор пока пользователь не попросит вас увеличить производительность и вы должны будете изучить куда вносить изменения. Файловая система /proc помогает администратору в этом через свою структуру и атрибуты файлов.

Каждый файл в /proc имеет особый набор атрибутов и может принадлежать конкретному пользователю по его ID. Сделано это очень аккуратно, так что правильная работа обеспечена и администратору и пользователям. Следующий список обобщает какие атрибуты могут быть у файлов:

  • Read-only: Файл не может быть изменен ни каким пользователем; используется для представления системной информации
  • Root-write: Если файл может быть изменен, то изменения может вносить только пользователь root
  • Root-read: Некоторые файлы могут быть не читаемы для обычных пользователей системы, только для root
  • Other: Вы можете найти другие комбинации, чем перечисленные выше, по различным причинам

В основном в /proc вы найдете файлы read-only за исключением /proc/sys, которая содержит большинство параметров ядра и предназначена для изменения во время работы системы. Как результат в этой статье рассматривается в основном эта директория.

Последнее, что вам нужно знать о изменении файлов в /proc — это то, что нужно записывать в эти файлы. Вы заметите, что некоторые из файлов могут быть легко прочитаны человеком, а некоторые являются файлами данных и могут быть прочитаны только при специальных утилит таких как top, lspci,и free. Вы также заметите, что эти легко читаемые файлы имеют два различных формата: некоторые являются бинарными ключами, а другие содержат больше информации. Файлы с бинарными ключами содержат только 0 (выключено) или 1 (включено) для некоторых функций ядра.

Внесение изменений

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

/proc/scsi

/proc/scsi/scsi

Одна из наиболее полезных вещей, которые нужно знать администратору — как добавить дисковое пространство, если у вас есть диски горячей замены без перезагрузки системы. Без использования /proc, вы должны вставить ваш диск, но затем вам придется перезагружать систему для того, чтобы дать ей возможность распознать новый диск. Вы можете позволить системе распознать новый диск с помощью следующей команды: echo «scsi add-single-device w x y z» > /proc/scsi/scsi

Чтобы эта команда работала правильно, вы должны указать параметры значений w, x, y, и z следующим образом:

  • w — это ID хост адаптера, где первый адаптер имеет ID ноль (0))
  • x — это канал SCSI на хост адаптере, где первый канал ноль (0)
  • y — это SCSI ID устройства
  • z — это номер LUN, где первый LUN ноль (0)

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

Команда для удаления устройства из системы без перезагрузки: echo «scsi remove-single-device w x y z» > /proc/scsi/scsi

Перед тем как ввести эту команду и удалить SCSI диск, убедитесь, что вы отмонтировали файловые системы на этом диске.

/proc/sys/fs/

/proc/sys/fs/file-max

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

Default setting: 4096

/proc/sys/fs/file-nr

Этот файл связан с file-max и содержит три значения:

  • Количество назначенных заголовков файлов
  • Количество используемых заголовков
  • Максимальное число заголовков

Этот файл только для чтения и только для предоставления информации.

/proc/sys/fs/inode-*

Любые файлы, начинающиеся с «inode» будут выполнять те же функции, что и файлы с именем «file» выше, но выполняют эти операции относительно inodes вместо заголовков файлов.

/proc/sys/fs/overflowuid and /proc/sys/fs/overflowgid

Эти файлы содержат User ID (UID) и Group ID (GID) для любой файловой системы, которая поддерживает 16-bit user и group ID. Эти значения могут быть изменены, но если вы действительно считаете это нужным, то более простым будет изменить файл группы и пароля группы вместо этого.

Default Setting: 65534

/proc/sys/fs/super-max

Здесь указывается максимальное количество заголовков суперблоков. Любая файловая система, которую вы монтируете должна использовать суперблоки, так что вам, возможно, придется использовать его если вы монтируете много файловых систем.

Default setting: 256

/proc/sys/fs/super-nr

Здесь указано текущее значение количества суперблоков. Этот файл только для чтения и используется для информации.

/proc/sys/kernel

/proc/sys/kernel/acct

Здесь содержатся три конфигурируемых значения, которые управляют подсчетом процессов, основанном на свободном пространстве (в процентах) файловой системы и ведет лог:

  1. Если свободное пространство ниже значения в процентах, то процесс подсчета останавливается
  2. Если свободное пространство выше, то процес запускается
  3. Частота в секундах, с которой проверяются предыдущие два значения

Чтобы изменить значения в этом файле вам следует использовать разделенный список параметров.

Default setting: 2 4 30

Эти значения остановят подсчет, если в файловой системе менее 2 процентов свободного пространства и начнет опять если появится 4 или более процентов. Проверка производится каждые 30 секунд.

/proc/sys/kernel/ctrl-alt-del

Этот файл содержит двоичное значение, которое управляет тем, как система реагирует на комбинацию ctrl+alt+delete. Возможны два значения:

  1. Ноль (0) значит, что ctrl+alt+delete принимается и отправляется программе init. Это позволит выполнить системе мягкую остановку и перезагрузку как если бы вы ввели команду shutdown.
  2. Один (1) значит, что ctrl+alt+delete не принимается и никакого чистого отключения не происходит как если бы вы просто выключили питание.

Default setting: 0

/proc/sys/kernel/domainname

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

/proc/sys/kernel/hostname

Здесь вы можете сконфигурировать ваше сетевое имя хоста. Значения по умолчанию нет и оно может быть, а может и не быть установлено.

/proc/sys/kernel/msgmax

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

Default setting: 8192

/proc/sys/kernel/msgmnb

Здесь указывается максимальное количество байт в одном сообщении.

Default setting: 16384

/proc/sys/kernel/msgmni

Здесь указывается максимальное количество идентификаторов сообщений в очереди.

Default setting: 16

/proc/sys/kernel/panic

Здесь установлено время в секундах, которое ядро будет ждать перед перезагрузкой если произойдет «kernel panic.» Установка в ноль (0) секунд отключит возможность перезагрузки при kernel panic.

Default setting: 0

/proc/sys/kernel/printk

Здесь четыре числовых значения, которые определяют куда будут отправлены сообщения логов, в зависимости от их важности. За более подробной информацией о различных уровнях логов отправляейтесь в man syslog(2). Четыре значения это:

  1. Console Log Level: сообщения с высшим приоритетом, чем это будут выведены на консоль
  2. Default Message Log Level: сообщения без приоритета будут напечатаны с этим приоритетом
  3. Minimum Console Log Level: минимальное (высочайший приоритет) значение, в которое может быть установлен Console Log Level
  4. Default Console Log Level: значение по умолчанию для Console Log Level

Default setting: 6 4 1 7

/proc/sys/kernel/shmall

Это общее количество разделяемой памяти (в байтах), которое может быть использовано в системе.

Default setting: 2097152

/proc/sys/kernel/shmax

Здесь указывается наибольший размер сегмента памяти (в байтах) позволяемый ядром.

Default setting: 33554432

/proc/sys/kernel/shmmni

Этот файл связан с максимальным числом сегментов раздляемой памяти всей системы.

Default setting: 4096

/proc/sys/kernel/sysrq

Активирует System Request Key, если не равно нулю.

Default setting: 0

/proc/sys/kernel/threads-max

Максимальное число потоков, которое может быть использовано ядром.

Default setting: 2048

/proc/sys/net

/proc/sys/net/core/message_burst

Это время (в десятых долях секунды) необходимое для записи нового предупреждения; другие предупреждения, полученные в это время будут пропущены. Это используется для предотвращения атаки Denial of Service, которая может быть выполнена при заваливании вашей системы сообщениями.

Default setting: 50 (5 seconds)

/proc/sys/net/core/message_cost

Здесь указывается значимость каждого предупреждения. Чем выше значение, тем больше предупреждений будет проигнорировано.

Default setting: 5

/proc/sys/net/core/netdev_max_backlog

Здесь указывается максимальное количество пакетов в очередь на обработку если интерфейс получает пакеты быстрее, чем ядро может их обработать.

Default setting: 300

/proc/sys/net/core/optmem_max

Здесь указан максимальный размер буфера для одного сокета.

/proc/sys/net/core/rmem_default

Здесь размер буфера для получаемого сокета по умолчанию (в байтах).

/proc/sys/net/core/rmem_max

Это максимальный размер буфера для получаемого сокета (в байтах).

/proc/sys/net/core/wmem_default

Это размер буфера отправляемого сокета по умолчанию (в байтах).

/proc/sys/net/core/wmem_max

Это максимальный размер буфера посылаемого сокета (в байтах).

/proc/sys/net/ipv4

Все параметры IPv4 и IPv6 полностью документированы в документации к ядру. Смотри файл /usr/src/linux/Documentation/networking/ip-sysctl.txt.

/proc/sys/net/ipv6 То же что и IPv4.

/proc/sys/vm

/proc/sys/vm/buffermem

Здесь происходит управление количеством общей системной памяти (в процентах), которая будет использована как буферная память. Файл содержит три значения, которые могут быть указаны в виде списка через пробел:

  1. Минимальный процент памяти, которая будет использована для буфера
  2. Система будет пытаться установить это количество памяти для буфера если количество доступной памяти будет уменьшено
  3. Максимальный процент памяти, которая будет использована для буферов

Default setting: 2 10 60

/proc/sys/vm/freepages

Этот файл управляет как система реагирует на различные уровни свободной памяти. Содержит три значения, которые могут быть установлены в виде списка, разделенного пробелами:

  1. Если количество свободных страниц в системе достигнет этого минимального предела, только ядро будет иметь доступ к любому дополнительному количеству памяти.
  2. Если количество свободных страниц в системе упадет ниже этого предела, то ядро начнет более агрессивно свопировать для освобождения памяти и поддержания системной производительности.
  3. Если количество свободных страниц в системе упадет ниже этого предела, то ядро начнет более агрессивно свопировать для освобождения памяти и поддержания системной производительности.

Default setting: 512 768 1024

/proc/sys/vm/kswapd

Этот файл управляет как ядро будет свопировать память. Он содержит три значения в виде списка, разделенные пробелами:

  1. Максимальное количество страниц, которое ядро пытается освободить за один раз.

Если вы хотите увеличить величину свопирования, вам нужно увеличить это значение.

  1. Минимальное количество раз, которое ядро пытается освободить страницу в время своппинга.
  2. Количество страниц, которое ядро может записать в один своп. Оказывает сильное влияние на производительность системы. Чем больше это значение, тем больше данных будет свопировано и тем меньше времени будет потрачено на поиск на диске. Однако, слишком большое значение окажет обратных эффект на производительность системы из-за увеличения очереди запросов.

Default setting: 512 32 8

/proc/sys/vm/pagecache

Этот файл выполняет ту же работу, что и /proc/sys/vm/buffermem, но он делает ее для карты памяти и общего кэширования файлов.

Выполнение постоянных установок ядра

Полезная утилита для внесения изменений в любые параметры ядра находится в директории /proc/sys. Она позволяет вам вносить изменения в работающее ядро (подобно echo и метод перенаправления, описанный выше), и имеет файл конфигурации, который выполняется при загрузке. Это позволяет чтобы внесенные изменения оставались в ядре после перезагрузки системы. Утилита называется sysctl и она полностью документирована в man sysctl(8).

Файл конфигурации для sysctl — /etc/sysctl.conf, который может быть редактирован, синтаксис файла описан в man sysctl.conf(8). Sysctl использует файлы в /proc/sys как индивидуальные переменные, которые могут быть изменены. Например, файл в /proc/sys, который представляет максимальное количество заголовков файлов в системе, /proc/sys/ fs/file-max, представлен как fs.file-max. Этот пример требует некоторых дополнительных пояснений в записи sysctl. Так как sysctl может только изменять переменные в директории / proc/sys, то часть имени переменной обозначающая директорию отбрасывается. Другое изменение касается слэшей, которые заменяются на точки. Вот два простых правила для преобразования файлов в /proc/sys и переменных в sysctl:

  • Отбросьте /proc/sys от начала.
  • Замените слэши на точки в имени файла.

Эти два правила позволят вам преобразовать любой файл в /proc/sys в любое имя переменной в sysctl. Обычное преобразование имени файла в переменную:

/proc/sys/dir/file —> dir.file dir1.dir2.file —> /proc/sys/dir1/dir2/file

 

Вы можете увидеть все переменные, доступные для изменения, используя команду sysctl -a. Переменные могут также быть изменены с помощью sysctl, которая выполняет ту же работу что и echo. Эта запись объясняет это: sysctl -w dir.file=»value»

Используя пример с file-max, мы можем изменить это значение на 16384, используя один из двух методов: sysctl -w fs.file-max=»16384″ Или: echo «16384» > /proc/sys/fs/file-max

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

Внимание: Не все дистрибутивы обеспечивают поддержку sysctl. Если это относится к вашей системе, то вы можете использовать echo и метод перенаправления, как описано выше и добавить эти команды в загрузочный скрипт, чтобы они выполнялись каждый раз при загрузке системы.

Команды для настройки системы

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

  • Изменении конфигурации Web сервера и перезагрузки Apache
  • Удаления загружаемого в inetd сервиса, которым вы не пользуетесь
  • Манипулирования настройками вашей сети
  • Экспортирования новой файловой системы через NFS
  • Запуска/остановки вашего файервола

Сначала, основной способ манипулирования системными сервисами через скрипты в / etc/init.d. Эти скрипты используют параметры для управления своими сервисами. Вы можете ввести в командной строке имя сервиса без параметров чтобы увидеть допустимые параметры. Общие параметры таковы:

  • start: Запускает остановленный сервис
  • stop: Останавливает запущенный сервис
  • restart: Останавливает и затем запускает сервис; запускает остановленный сервис
  • reload: Перезагружает конфигурацию сервиса без прерывания его соединения
  • status: Выводит информацию запущен сервис или нет

В качестве примера следующая команда перезагрузит конфигурацию вашего xinetd без прерывания любых присоединенных сессий пользователей (полезно, если вы вносите изменения в ваш /etc/xinetd.conf):

/etc/init.d/xinetd reload

Red Hat предоставляет комнанду service, которая будет управлять сервисом для вас. Команда service выполняет те же действия, что и ввод имени скрипта. Синтаксис команды: service script-name [parameter] Пример: service xinetd reload

SuSE также предоставляет команду rc. Она похожа на service, но не имеет пробела между командой и именем скрипта. Синтаксис команды: rc{script-name} parameter Пример: rcapache start

Так же как и при изменении параметров ядра, при перезагрузке системы, все внесенные изменения будут потеряны. Многие дистрибутивы позволяют использовать команду chkconfig, которая управляет сервисами, запускаемыми на различных уровнях (включая загрузку). Во время написания статьи синтаксис команды chkconfig несколько отличался в различных версиях Linux, но если вы введете команду chkconfig без параметров, вы получите список возможных параметров и их использование. Больше информации о chkconfig может быть получено в man chkconfig(8).

Заключение

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

Acknowledgment

Хочу сказать спасибо Mr. Adrian Fewings за редакцию этой статьи.

Похожие темы

© Copyright IBM Corporation 2007

(www.ibm.com/legal/copytrade.shtml)

Торговые марки

(www.ibm.com/developerworks/ru/ibm/trademarks/)

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *